Skip to main content

Sizing and hardware

This page gives the resources the Navin Platform asks for, as written in the Helm chart, the data service manifests and the checks of the guided installer. Use it to size the nodes and the storage before the installation; measure then adjust with your own load (load testing plan).

OS packages (one server)​

The guided installer navin-install refuses a host below these minimums (os/install/README.md):

RoleCPUMemoryDisk
standalone (Navin Manager, agent and platform on one server)24 GiB (8 GiB recommended)20 GiB free for /var, 4 GiB for /opt
Navin Manager (cluster mode)22 GiB (4 GiB recommended)10 GiB for /var, 2 GiB for /opt
node (cluster mode)11 GiB5 GiB for /var

The PostgreSQL database of the platform is local by default; its size grows with the audit trail and the documents. Plan its disk with your retention settings (EAI_AUDIT_WORM_RETENTION_DAYS, EAI_AUDIT_PAYLOAD_RETENTION_DAYS, configuration reference).

Kubernetes: platform workloads​

Requests and limits of deploy/helm/enterprise-ai/values.yaml, per pod:

WorkloadRequestsLimitsReplicas (default)Replicas (values-prod.yaml)
Control Plane API250m CPU, 512 MiB2 CPU, 2 GiB2 to 10 (HPA)3 to 20 (HPA)
Portal100m CPU, 256 MiB1 CPU, 1 GiB2 to 6 (HPA)3 to 6 (HPA)
LiteLLM250m CPU, 512 MiB2 CPU, 2 GiB2 to 10 (HPA)3 to 30 (HPA)
Worker100m CPU, 256 MiB1 CPU, 1 GiB11
Worker planes audit, SOC, telemetry (worker.planes.enabled)100m CPU, 256 MiB each1 CPU, 1 GiB each1 each1 each
Ollama (ollama.enabled)2 CPU, 8 GiB8 CPU, 32 GiB11

With the production profile, the platform itself needs at least 3 x (250m + 100m + 250m) CPU and 3 x (512 + 256 + 512) MiB of requests, spread over three nodes in distinct zones (required zone anti affinity of the Control Plane in values-prod.yaml).

Kubernetes: data services​

Volumes and replicas of deploy/data/*, all on the storage class fast-ssd:

ServiceReplicasVolume per replicaManifest
PostgreSQL (CloudNativePG 16.6)3 instances200 GiB data and 50 GiB WALdeploy/data/postgres/cluster.yaml
Qdrant3100 GiBdeploy/data/qdrant/values.yaml
NATS JetStream320 GiBdeploy/data/nats/values.yaml
Redisreplication (operator 2 replicas)20 GiBdeploy/data/redis/values.yaml
Redis for Opikreplication10 GiBdeploy/data/redis-opik/values.yaml
ClickHouseoperator managed200 GiBdeploy/data/clickhouse/k8s/clickhouse-installation.yaml
Temporal3database in PostgreSQLdeploy/data/temporal/values.yaml
note

fast-ssd is the name the manifests use. Create a storage class with that name on your CSI driver, or replace the name in the values files before the first synchronization.

GPU inference​

vLLM runs one Deployment per model on NVIDIA nodes (label nvidia.com/gpu.present=true, toleration nvidia.com/gpu). The profile values-onprem-gpu.yaml gives a sized example:

ModelGPU per replicaRequestsLimitsReplicas
meta-llama/Llama-3.1-8B-Instruct14 CPU, 32 GiB8 CPU, 48 GiB1 to 4
Qwen/Qwen2.5-72B-Instruct-AWQ4 (--tensor-parallel-size 4)16 CPU, 128 GiB32 CPU, 192 GiB1 to 2
BAAI/bge-m3 (embeddings)1 (--gpu-memory-utilization 0.30)2 CPU, 8 GiB4 CPU, 16 GiB1 to 3
media workers STT, TTS (KEDA on the NATS lag)1chart defaultchart default0 to 4
media worker video generation1chart defaultchart default0 to 2

The model cache is a volume of 200 GiB by default (vllm.modelCache.size), 500 GiB on the class local-nvme in the on premises profile. With vllm.antiAffinity: required, a model needs as many GPU nodes as replicas.

CPU inference is possible for small models: accelerator: cpu on a vllm.models entry (image vllm/vllm-openai-cpu, cpuKvCacheSpaceGb) or ollama.accelerator: cpu.

Docker Compose and local development​

The full compose stack starts more than thirty containers (deploy/compose/docker-compose.yml). Plan a workstation with at least 8 CPU, 16 GiB of memory and 40 GiB of free disk for the images and volumes; the profiles gpu (vLLM, media worker) need an NVIDIA GPU and the NVIDIA container toolkit. make start without Docker runs only PostgreSQL, Redis, Keycloak, the API, the worker and the portal.

note

The compose figures are a working estimate for the number of containers of the stack, not a measured minimum.

Next steps​