Skip to main content

Deploy with Helm

Prerequisites​

Use Kubernetes 1.25 or newer and Helm 3.8 or newer.

Provision PostgreSQL and Redis with private access from your cluster. Use the sizing guide to choose their capacity.

Create the litellm namespace and these Secrets before installation:

SecretFields
litellm-master-key-secretmaster-key
litellm-writer-secretusername, password
litellm-redispassword
litellm-envLITELLM_SALT_KEY and any provider credentials

Install the chart​

Set the database and Redis hosts. Add ingress values for your controller.

application.yaml
apiVersion: argoproj.io/v1alpha1
kind: Application
metadata:
name: litellm
namespace: argocd
spec:
project: default
source:
repoURL: ghcr.io/berriai/litellm/chart
chart: litellm
targetRevision: "1.0.0"
helm:
valuesObject:
image:
tag: lts
database:
writer:
host: postgres.internal.example.com
dbname: litellm
redis:
host: redis.internal.example.com
ssl: true
sslCertReqs: required
passwordSecret:
name: litellm-redis
gateway:
envSecrets: [litellm-env]
extraEnv:
- name: STORE_MODEL_IN_DB
value: "True"
backend:
envSecrets: [litellm-env]
extraEnv:
- name: STORE_MODEL_IN_DB
value: "True"
migrationJob:
hooks:
helm:
enabled: false
argocd:
enabled: true
destination:
server: https://kubernetes.default.svc
namespace: litellm

Sync the full Application. The migration Job runs before the services. See Argo CD's Helm settings and sync hooks.

values.yaml reference​

See the complete values.yaml for all settings.

<component> means gateway, backend, or ui. Short names on the same row share the first value's prefix.

Image and deployment mode
ValueDefaultDescription
image.repositoryghcr.io/berriai/litellmContainer image repository.
image.tag""Uses the chart's appVersion when empty.
image.digest""Container image digest.
image.pullPolicyIfNotPresentKubernetes image pull policy.
imagePullSecrets[]Existing registry Secrets available in the release namespace.
monolith.enabledfalseRuns one proxy when true. It uses gateway.* and ignores backend.* and ui.*.
monolith.extraArgs[]Extra CLI arguments for the single-service proxy.
gateway.enabled, backend.enabled, ui.enabledAll trueEnables each service in separate-service mode. Ignored in single-service mode.
nameOverride, fullnameOverrideBoth ""Overrides generated resource names.
Secrets and connections
ValueDefaultDescription
masterKey.secretName, masterKey.secretKeylitellm-master-key-secret, master-keySecret and field containing the master key.
masterKey.generatefalseGenerates a master key only when true and masterKey.secretName is empty.
database.writer.host""Required unless you set database.writer.passwordSecret.hostKey or urlKey.
database.writer.port5432Writer port when using a host rather than a complete URL.
database.writer.dbname, database.writer.schemaBoth ""Database name is required in host mode. Schema is optional.
database.writer.passwordSecretName litellm-writer-secret, keys username and passwordExisting credentials Secret. hostKey and urlKey are empty by default. A complete URL replaces the separate connection settings.
database.writer.useIAMAuth, useAzureEntraAuthBoth falseUses a database token instead of the password. Enable at most one and retain the username Secret.
database.writer.sslMode, sslRootCertBoth ""Database TLS settings. A root certificate alone implies verify-full.
database.reader.host""Optional read replica. Set a host, passwordSecret.hostKey, or passwordSecret.urlKey to enable it.
database.reader.port, dbname, schema5432, "", ""Reader database name is required in host mode. A complete URL supplies its own connection fields.
database.reader.passwordSecretName litellm-reader-secret, keys username and passwordReader credentials. hostKey and urlKey are empty by default.
database.reader.useIAMAuth, useAzureEntraAuthBoth falseReader token authentication requires the matching writer option.
database.connectionPoolenabled: false, maxDbConnections: 20, maxClientConn: 1000Enables the in-container gateway connection pool. Backend and migration Jobs connect directly.
redis.host, redis.passwordSecret.hostKey, redis.passwordSecret.urlKeyAll ""Redis endpoint options. A complete URL replaces separate connection settings.
redis.port, redis.cluster6379, falseRedis port and cluster discovery mode.
redis.passwordSecret.name, passwordKey"", passwordExisting Redis Secret. A Secret is required for hostKey or urlKey. An empty name permits a host with no password.
redis.ssl, sslCertReqs, sslCaCertsfalse, "", ""TLS, certificate verification mode, and mounted CA path. For a complete URL, use rediss:// and URL TLS parameters instead.
Ingress
ValueDefaultDescription
ingress.enabledfalseCreates the Ingress. Install its controller separately.
ingress.className""Kubernetes ingress class. Set this for your installed controller.
ingress.controlleralbSelects alb or nginx path syntax.
ingress.host""Shared hostname for path routing. Empty creates a rule without a host.
ingress.annotations{}Controller settings such as an internal frontend, certificate, and listener ports.
ingress.tls[]Kubernetes ingress TLS entries for controllers that use them.
ingress.componentHosts.ui, .backend, .gatewayAll ""Separate component hostnames. Set all three together and leave ingress.host and ingress.extraPaths empty.
ui.publicUrl, ui.backendUrl, backend.gatewayUrlAll ""Required in separate-service mode when component hostnames are set. Use origins without paths. Shared-host path routing does not need these values.
ingress.extraPaths[]Adds paths before the backend catch-all. Entries need path. Component targets default to service: gateway and pathType: Prefix. Duplicate built-in routes are rejected.
ingress.extraPaths[].serviceName, .servicePortUnsetRoutes an extra path to another Kubernetes Service. Set both and omit service.

In single-service mode, built-in and component-targeted paths use the monolith Service. Keep health and metrics endpoints private. Use the cloud reference architectures for network placement.

Resources and scaling
ValueDefaultDescription
gateway.resourcesRequests 1 CPU / 4Gi, limits 2 CPU / 4GiResources per gateway container. Also applies to the monolith.
backend.resourcesRequests 1 CPU / 4Gi, limits 2 CPU / 4GiResources per management backend container.
ui.resourcesRequests 500m CPU / 500Mi, limits 1 CPU / 1GiResources per static UI container.
gateway.numWorkers1Worker processes per gateway or monolith pod.
<component>.replicaCountnullFixed count when HPA is disabled. Gateway also requires KEDA to be disabled. Empty omits the field.
gateway.hpaEnabled, 1–10 replicas, CPU 70%, memory 80%Gateway autoscaling targets.
backend.hpaEnabled, 1–4 replicas, CPU 70%Backend autoscaling targets.
ui.hpaDisabled, 1–3 replicas, CPU 80%UI autoscaling targets when enabled.
<component>.hpa.behavior{}Kubernetes scale-up and scale-down policies.
gateway.hpa.targetRequestsPerSecond, targetTokensPerSecondBoth ""Optional per-pod targets. Requires metrics collection and a Prometheus Adapter.
gateway.kedaDisabled, minReplicaCount: 1, maxReplicaCount: 10Alternative gateway autoscaler. Requires KEDA and gateway.hpa.enabled: false.
gateway.keda.pollingInterval, cooldownPeriod30, 300 secondsKEDA polling and scale-to-zero cooldown settings.
gateway.keda.triggers, advanced, fallback[], {}, {}Custom KEDA triggers and behavior.
gateway.keda.prometheusEmpty server address and workload targetsSet serverAddress with either targetRequestsPerSecond or targetTokensPerSecond to add a workload trigger.
<component>.pdbDisabled, empty minAvailable and maxUnavailablePod disruption budget. Set one limit. Enabling with neither uses maxUnavailable: 1.

Add RPS and TPS targets alongside CPU and memory for gateway autoscaling. See Sizing & Scaling for capacity planning.

Configuration and pod settings
ValueDefaultDescription
gateway.config.createtrueCreates and mounts the shared proxy configuration.
gateway.config.proxy_config{}LiteLLM YAML configuration loaded by gateway and backend. See Configuration.
<component>.logLevelINFOComponent log level.
<component>.extraEnv, envSecrets, envConfigMapsAll []Environment variables and existing Secret or ConfigMap names.
<component>.volumes, volumeMountsBoth []Extra Kubernetes volumes and container mounts.
<component>.service.typeClusterIPKubernetes Service type.
gateway.service.port, backend.service.port, ui.service.port4000, 4001, 3000Service ports. The monolith uses gateway.service.port.
<component>.service.annotations, loadBalancerClass{}, ""Service annotations and optional load balancer class.
<component>.livenessProbe, readinessProbeGateway/backend: /health/liveliness, /health/readiness. UI: /HTTP health probes. See full defaults for timings and thresholds.
<component>.startupProbe, strategyBoth {}Optional startup probe and deployment strategy. Empty strategy inherits Kubernetes rolling-update defaults.
<component>.minReadySeconds, terminationGracePeriodSecondsBoth ""Omitted by default. Kubernetes defaults are 0 and 30 seconds.
<component>.podSecurityContext, securityContextBoth {}Pod and container security settings.
<component>.deploymentLabels, deploymentAnnotations, podLabels, podAnnotationsAll {}Extra labels and annotations.
<component>.nodeSelector, affinity, tolerations, topologySpreadConstraints{}, {}, [], []Pod placement and zone distribution.
<component>.lifecycle, extraContainers, extraInitContainers{}, [], []Lifecycle hooks, sidecars, and init containers.
serviceAccounts.<component>create: false, name: "", annotations: {}Uses an existing named account or the namespace's default account. Enable create to create one.
serviceAccounts.<component>.automountGateway/backend true, UI falseMounts the Kubernetes service account token.
extraResources[]Additional Kubernetes resources rendered with the release.
Metrics and optional workloads
ValueDefaultDescription
gateway.metricsServer.enabled, .portfalse, 4001Separate metrics sidecar and private metrics Service.
gateway.metricsServer.resourcesRequests 50m CPU / 128Mi, memory limit 512MiMetrics sidecar resources.
gateway.serviceMonitor.enabled, .interval, .scrapeTimeoutfalse, 15s, 10sPrometheus Operator monitoring. Requires gateway.metricsServer.enabled: true.
gateway.serviceMonitor.scheme, .tlsConfighttp, {}Prometheus scrape transport settings.
gateway.serviceMonitor.labels, .annotations, .relabelings, .namespaceSelector.matchNames{}, {}, [], []Discovery labels and scrape options. Empty namespace selection uses the release namespace.
gateway.collector.enabled, .addressfalse, unix:///var/run/litellm/collector.sockMoves post-response spend processing to a sidecar.
gateway.collector.bufferSize, .onUnavailable, .drainTimeoutSeconds1000, fallback, 10Per-worker buffer, behavior when the collector is unavailable, and shutdown drain time.
gateway.collector.resourcesRequests 500m CPU / 1Gi, limits 1 CPU / 2GiCollector sidecar resources.
gateway.collector.scaleOnGatewayContainerCputrueWith the collector and CPU HPA enabled, scales on the main container's CPU only. Requires Kubernetes 1.30 or newer.
migrationJob.enabled, .hooks.helm.enabled, .hooks.argocd.enabledtrue, true, falseMigration Job and controller hooks.
migrationJob.backoffLimit, .activeDeadlineSeconds, .ttlSecondsAfterFinished4, 1800, 120Job retries, total deadline, and cleanup delay.
migrationJob.serviceAccountName, .automountServiceAccountToken"", falseJob identity. Name an existing account when cloud database authentication needs it.
billingMetrics.enabledfalseEnterprise request metering.
liteadmin.enabledfalseOptional admin worker. Requires liteadmin.existingSecret, liteadmin.gatewayUrl, and liteadmin.model.
lens.enabledfalseConnects to a separately deployed Lens service. Requires its internal and public URLs plus gateway and service-token Secrets.
LiteLLM Enterprise
SSO/SAML, audit logs, spend tracking, multi-team management, and guardrails, built for production.
Learn more →