Skip to main content
Chroma provides official Helm charts for Kubernetes deployment, supporting both single-instance and distributed architectures.
The distributed Chroma Kubernetes manifests are under active development. While suitable for testing and development, review thoroughly before production use.

Prerequisites

  • Kubernetes cluster (1.19+)
  • kubectl configured
  • Helm 3.x installed
  • Persistent volume provisioner (for production)

Helm Chart Installation

Quick Start

Deploy Chroma using the official Helm chart:
# Clone the Chroma repository
git clone https://github.com/chroma-core/chroma.git
cd chroma

# Install the Helm chart
helm install chroma ./k8s/distributed-chroma \
  --namespace chroma \
  --create-namespace

Chart Information

The Helm chart is located at k8s/distributed-chroma/:
apiVersion: v2
name: distributed-chroma
description: A helm chart for distributed Chroma
type: application
version: 0.1.78
appVersion: "0.4.24"
keywords:
  - chroma
  - vector
  - database
  - retrieval
  - llm
  - rag
home: "https://www.trychroma.com/"
sources:
  - "https://github.com/chroma-core/chroma"

Configuration

Default Values

The chart uses k8s/distributed-chroma/values.yaml for configuration:
namespace: 'chroma'

# Frontend Service (HTTP API)
rustFrontendService:
  image:
    repository: 'rust-frontend-service'
    tag: 'latest'
  replicaCount: 1
  resources:
    limits:
      cpu: '2000m'
      memory: '1Gi'
    requests:
      cpu: '1000m'
      memory: '512Mi'

# System Database
sysdb:
  image:
    repository: 'sysdb'
    tag: 'latest'
  replicaCount: 1
  resources:
    limits:
      cpu: '2000m'
      memory: '1Gi'
    requests:
      cpu: '1000m'
      memory: '512Mi'

# Log Service
rustLogService:
  image:
    repository: 'rust-log-service'
    tag: 'latest'
  cache:
    hostPath: '/local/cache/chroma-log-service'
    type: DirectoryOrCreate
    mountPath: '/cache/'

# Query Service
queryService:
  image:
    repository: 'query-service'
    tag: 'latest'
  replicaCount: 2
  updateStrategy:
    type: 'RollingUpdate'
  cache:
    hostPath: '/local/cache/chroma-query-service'
    mountPath: '/cache/'

# Compaction Service
compactionService:
  image:
    repository: 'compaction-service'
    tag: 'latest'
  replicaCount: 1
  cache:
    hostPath: '/local/cache/chroma-compaction-service'
    mountPath: '/cache/'

# Garbage Collector
garbageCollector:
  image:
    repository: 'garbage-collector'
    tag: 'latest'
  replicaCount: 1
  resources:
    limits:
      cpu: '200m'
      memory: '256Mi'
    requests:
      cpu: '100m'
      memory: '128Mi'

# Database Migration
sysdbMigration:
  image:
    repository: 'sysdb-migration'
    tag: 'latest'
  username: chroma
  password: chroma
  netloc: postgres
  port: 5432
  dbName: sysdb
  sslmode: disable

Custom Configuration

Create a custom values.yaml:
# custom-values.yaml
namespace: 'my-chroma'

rustFrontendService:
  replicaCount: 3
  resources:
    limits:
      cpu: '4000m'
      memory: '2Gi'
    requests:
      cpu: '2000m'
      memory: '1Gi'

queryService:
  replicaCount: 5
  resources:
    limits:
      cpu: '4000m'
      memory: '4Gi'
Install with custom values:
helm install chroma ./k8s/distributed-chroma \
  --namespace my-chroma \
  --create-namespace \
  --values custom-values.yaml

Architecture Components

The distributed Chroma deployment includes:

Core Services

  1. Frontend Service (rust-frontend-service)
    • HTTP API endpoint
    • Routes requests to appropriate services
    • Port: 8000
  2. Query Service (query-service)
    • Handles vector similarity search
    • Stateful set for distributed queries
    • Port: 50051 (gRPC)
  3. Log Service (rust-log-service)
    • Write-ahead log for durability
    • Manages data ingestion
    • Port: 50051 (gRPC)
  4. Compaction Service (compaction-service)
    • Optimizes storage
    • Merges and compacts segments
  5. SysDB (sysdb)
    • Metadata and catalog storage
    • PostgreSQL-backed
    • Port: 50051 (gRPC)
  6. Garbage Collector (garbage-collector)
    • Cleans up unused segments
    • Manages storage lifecycle

Supporting Infrastructure

  • PostgreSQL: Metadata storage
  • MemberList CRD: Service discovery and membership
  • Service Accounts & RBAC: Security and permissions

Tilt for Local Development

Tilt provides a complete local Kubernetes development environment.

Setup

  1. Install Requirements
    # Install Tilt
    curl -fsSL https://raw.githubusercontent.com/tilt-dev/tilt/master/scripts/install.sh | bash
    
    # Install Helm
    curl https://raw.githubusercontent.com/helm/helm/main/scripts/get-helm-3 | bash
    
  2. Start Local Kubernetes
    # macOS (OrbStack)
    # Navigate to Kubernetes → Pods and select "Turn On"
    
    # Linux (Kind)
    kind create cluster --name chroma-dev
    
  3. Deploy with Tilt
    # From Chroma repository root
    tilt up
    

Tilt Features

Tilt automatically:
  • Builds all Docker images from source
  • Deploys complete distributed architecture
  • Sets up observability stack:
    • Grafana (dashboards)
    • Jaeger (tracing)
    • Prometheus (metrics)
    • OpenTelemetry Collector
  • Watches for code changes and rebuilds
  • Provides unified dashboard at http://localhost:10350

Service Access

Tilt exposes these ports:
ServicePortDescription
Frontend8000HTTP API
Query Service50053gRPC
Log Service50054gRPC
SysDB50051gRPC
Postgres5432Database
MinIO9000Object storage
Garbage Collector50055gRPC

Tilt Configuration

The Tiltfile defines the complete environment:
# Tiltfile
update_settings(max_parallel_updates=6)

# Build images
docker_build(
  'rust-frontend-service',
  '.',
  only=["rust/", "idl/", "Cargo.toml", "Cargo.lock"],
  dockerfile='./rust/Dockerfile',
  target='cli'
)

# Deploy Helm chart
k8s_yaml(
  local(
    'helm template ' +
    '--set-file rustFrontendService.configuration=rust/frontend/sample_configs/distributed.yaml ' +
    '--values k8s/distributed-chroma/values.yaml ' +
    '--values k8s/distributed-chroma/values.dev.yaml ' +
    'k8s/distributed-chroma'
  )
)

# Configure resources
k8s_resource(
  'rust-frontend-service:deployment:chroma',
  resource_deps=['sysdb:deployment:chroma', 'rust-log-service:statefulset:chroma'],
  labels=["chroma"],
  port_forwards='8000:8000'
)

Development Workflow

# Start development environment
tilt up

# View logs
tilt logs rust-frontend-service

# Trigger rebuild
tilt trigger rust-frontend-service

# Clean up
tilt down

Manual Kubernetes Deployment

Install Custom Resource Definitions

# Install MemberList CRD
kubectl apply -f k8s/distributed-chroma/crds/memberlist_crd.yaml

Deploy PostgreSQL

# postgres.yaml
apiVersion: v1
kind: PersistentVolumeClaim
metadata:
  name: postgres-pvc
  namespace: chroma
spec:
  accessModes:
    - ReadWriteOnce
  resources:
    requests:
      storage: 10Gi
---
apiVersion: apps/v1
kind: Deployment
metadata:
  name: postgres
  namespace: chroma
spec:
  replicas: 1
  selector:
    matchLabels:
      app: postgres
  template:
    metadata:
      labels:
        app: postgres
    spec:
      containers:
      - name: postgres
        image: postgres:15
        env:
        - name: POSTGRES_DB
          value: sysdb
        - name: POSTGRES_USER
          value: chroma
        - name: POSTGRES_PASSWORD
          value: chroma
        ports:
        - containerPort: 5432
        volumeMounts:
        - name: postgres-storage
          mountPath: /var/lib/postgresql/data
      volumes:
      - name: postgres-storage
        persistentVolumeClaim:
          claimName: postgres-pvc
kubectl apply -f postgres.yaml

Deploy Chroma Services

# Deploy using Helm
helm install chroma ./k8s/distributed-chroma \
  --namespace chroma \
  --create-namespace \
  --set rustFrontendService.configuration="$(cat rust/frontend/sample_configs/distributed.yaml)" \
  --set rustLogService.configuration="$(cat rust/worker/chroma_config.yaml)"

Scaling

Horizontal Scaling

# Scale query service
kubectl scale statefulset query-service \
  --namespace chroma \
  --replicas=5

# Scale frontend service
kubectl scale deployment rust-frontend-service \
  --namespace chroma \
  --replicas=3

Vertical Scaling

Update resource requests/limits in values:
queryService:
  resources:
    limits:
      cpu: '8000m'
      memory: '8Gi'
    requests:
      cpu: '4000m'
      memory: '4Gi'
Apply changes:
helm upgrade chroma ./k8s/distributed-chroma \
  --namespace chroma \
  --values custom-values.yaml

Storage Configuration

Persistent Volumes

queryService:
  cache:
    # Use PVC instead of hostPath
    storageClass: 'fast-ssd'
    size: '100Gi'
    mountPath: '/cache/'

Storage Classes

apiVersion: storage.k8s.io/v1
kind: StorageClass
metadata:
  name: fast-ssd
provisioner: kubernetes.io/aws-ebs
parameters:
  type: gp3
  iops: "3000"
  throughput: "125"

Monitoring and Observability

Tilt deploys a complete observability stack:

Grafana

Access via Tilt dashboard or port-forward:
kubectl port-forward -n chroma svc/grafana 3000:3000

Jaeger (Tracing)

kubectl port-forward -n chroma svc/jaeger 16686:16686

Prometheus (Metrics)

kubectl port-forward -n chroma svc/prometheus 9090:9090

Configure OpenTelemetry

rustFrontendService:
  env:
    - name: CHROMA_OTEL_COLLECTION_ENDPOINT
      value: "otel-collector.chroma.svc.cluster.local:4317"
    - name: CHROMA_OTEL_SERVICE_NAME
      value: "frontend-service"

Troubleshooting

Check Pod Status

kubectl get pods -n chroma
kubectl describe pod <pod-name> -n chroma
kubectl logs <pod-name> -n chroma

Debug MemberList

# Check MemberList resources
kubectl get memberlists -n chroma
kubectl describe memberlist query-service-memberlist -n chroma

Database Connection Issues

# Test PostgreSQL connection
kubectl run -it --rm psql --image=postgres:15 --restart=Never -n chroma -- \
  psql -h postgres.chroma.svc.cluster.local -U chroma -d sysdb

Service Communication

# Test gRPC connectivity
kubectl run -it --rm grpcurl --image=fullstorydev/grpcurl --restart=Never -n chroma -- \
  grpcurl -plaintext sysdb.chroma.svc.cluster.local:50051 list

Upgrading

# Check current version
helm list -n chroma

# Update repository
git pull origin main

# Upgrade deployment
helm upgrade chroma ./k8s/distributed-chroma \
  --namespace chroma \
  --values custom-values.yaml

Uninstalling

# Uninstall Helm release
helm uninstall chroma --namespace chroma

# Remove namespace (optional)
kubectl delete namespace chroma

# Tilt cleanup
tilt down

Multi-Region Deployment

Enable multi-region mode with Tilt:
MULTI_REGION=true tilt up
This deploys two Chroma clusters (chroma and chroma2) with cross-region replication.

Next Steps

Cloud Providers

Deploy on AWS, GCP, or Azure

Configuration

Advanced configuration options

Observability

Monitor and debug your deployment

Performance

Performance tuning and optimization

Build docs developers (and LLMs) love