Skip to main content
Deploy Bifrost on Kubernetes using the official Helm chart. This is the recommended way to deploy Bifrost on Kubernetes with production-ready defaults and flexible configuration.
Latest Chart Version: 1.5.0 | View on Artifact Hub

Prerequisites

  • Kubernetes cluster (v1.19+)
  • kubectl configured
  • Helm 3.2.0+ installed
  • (Optional) Persistent Volume provisioner
  • (Optional) Ingress controller

Quick Start

Add Helm Repository

helm repo add bifrost https://maximhq.github.io/bifrost/helm-charts
helm repo update

Install Bifrost

helm install bifrost bifrost/bifrost --set image.tag=1.3.45
The image.tag parameter is required. Check Docker Hub for available versions.
This deploys Bifrost with:
  • SQLite storage (10Gi PVC)
  • Single replica
  • ClusterIP service

Access Bifrost

kubectl port-forward svc/bifrost 8080:8080
curl http://localhost:8080/metrics

Deployment Patterns

Development Setup

Simple setup for local testing and development.
helm install bifrost bifrost/bifrost \
  --set image.tag=1.3.45 \
  --set bifrost.providers.openai.keys[0].value="sk-your-key" \
  --set bifrost.providers.openai.keys[0].weight=1
Features:
  • SQLite storage
  • Single replica
  • No auto-scaling
  • ClusterIP service
Access:
kubectl port-forward svc/bifrost 8080:8080

Configuration

Key Parameters

ParameterDescriptionDefault
image.tagRequired. Bifrost image version (e.g., 1.3.45)""
replicaCountNumber of replicas1
storage.modeStorage backend (sqlite/postgres)sqlite
storage.persistence.sizePVC size for SQLite10Gi
postgresql.enabledDeploy PostgreSQLfalse
vectorStore.enabledEnable vector storefalse
vectorStore.typeVector store type (weaviate/redis/qdrant)none
bifrost.encryptionKeyEncryption key""
ingress.enabledEnable ingressfalse
autoscaling.enabledEnable HPAfalse

Secret Reference Parameters

Use existing Kubernetes secrets instead of plain-text values:
ParameterDescriptionDefault
bifrost.encryptionKeySecret.nameSecret name for encryption key""
bifrost.encryptionKeySecret.keyKey within the secret""
postgresql.external.existingSecretSecret name for PostgreSQL password""
postgresql.external.passwordKeyKey within the secret"password"
vectorStore.redis.external.existingSecretSecret name for Redis password""
vectorStore.redis.external.passwordKeyKey within the secret"password"
vectorStore.weaviate.external.existingSecretSecret name for Weaviate API key""
vectorStore.weaviate.external.apiKeyKeyKey within the secret"api-key"
vectorStore.qdrant.external.existingSecretSecret name for Qdrant API key""
vectorStore.qdrant.external.apiKeyKeyKey within the secret"api-key"
bifrost.plugins.maxim.secretRef.nameSecret name for Maxim API key""
bifrost.plugins.maxim.secretRef.keyKey within the secret"api-key"
bifrost.providerSecrets.<provider>.existingSecretSecret name for provider API key""
bifrost.providerSecrets.<provider>.keyKey within the secret"api-key"
bifrost.providerSecrets.<provider>.envVarEnvironment variable name to inject""

Provider Configuration

Add provider keys via values file:
bifrost:
  providers:
    openai:
      keys:
        - value: "sk-..."
          weight: 1
    anthropic:
      keys:
        - value: "sk-ant-..."
          weight: 1
Or via command line:
helm install bifrost bifrost/bifrost \
  --set image.tag=1.3.45 \
  --set bifrost.providers.openai.keys[0].value="sk-..." \
  --set bifrost.providers.openai.keys[0].weight=1

Using Environment Variables for Provider Keys

Bifrost supports env.VAR_NAME syntax to reference environment variables. Combined with providerSecrets, you can keep API keys in Kubernetes secrets:
bifrost:
  providers:
    openai:
      keys:
        - value: "env.OPENAI_API_KEY"  # References environment variable
          weight: 1
  
  # Inject secrets as environment variables
  providerSecrets:
    openai:
      existingSecret: "my-openai-secret"
      key: "api-key"
      envVar: "OPENAI_API_KEY"
This pattern:
  1. Creates a Kubernetes secret with the API key
  2. Injects the secret as an environment variable (OPENAI_API_KEY)
  3. Bifrost resolves env.OPENAI_API_KEY at runtime

Plugin Configuration

Enable and configure plugins:
bifrost:
  plugins:
    telemetry:
      enabled: true
      config: {}
    
    logging:
      enabled: true
      config: {}
    
    governance:
      enabled: true
      config:
        is_vk_mandatory: false
    
    semanticCache:
      enabled: true
      config:
        provider: "openai"
        embedding_model: "text-embedding-3-small"
        dimension: 1536
        threshold: 0.8
        ttl: "5m"
        cache_by_model: true
        cache_by_provider: true

Operations

Upgrade

# Update repository
helm repo update

# Upgrade with same values
helm upgrade bifrost bifrost/bifrost --reuse-values

# Upgrade with new values
helm upgrade bifrost bifrost/bifrost -f your-values.yaml

Rollback

# View release history
helm history bifrost

# Rollback to previous version
helm rollback bifrost

# Rollback to specific revision
helm rollback bifrost 2

Uninstall

# Uninstall release
helm uninstall bifrost

# Delete PVCs (if you want to remove data)
kubectl delete pvc -l app.kubernetes.io/instance=bifrost

Scale

# Scale manually
kubectl scale deployment bifrost --replicas=5

# Or update via Helm
helm upgrade bifrost bifrost/bifrost \
  --set replicaCount=5 \
  --reuse-values

Monitoring

Prometheus Metrics

Bifrost exposes Prometheus metrics at /metrics. Enable ServiceMonitor for automatic scraping:
serviceMonitor:
  enabled: true
  interval: 30s
  scrapeTimeout: 10s

Health Checks

Check pod health:
# View pod status
kubectl get pods -l app.kubernetes.io/name=bifrost

# Check logs
kubectl logs -l app.kubernetes.io/name=bifrost --tail=100

# Describe pod
kubectl describe pod -l app.kubernetes.io/name=bifrost

Metrics Endpoints

# Port forward
kubectl port-forward svc/bifrost 8080:8080

# Check metrics
curl http://localhost:8080/metrics

# Check health
curl http://localhost:8080/health

Troubleshooting

Pod Not Starting

# Check events
kubectl describe pod -l app.kubernetes.io/name=bifrost

# Check logs
kubectl logs -l app.kubernetes.io/name=bifrost

# Common issues:
# - Image pull errors: Check repository access
# - PVC binding: Check PVC status
# - Config errors: Validate ConfigMap

Database Connection Issues

# For embedded PostgreSQL
kubectl exec -it deployment/bifrost-postgresql -- psql -U bifrost

# Check connectivity from pod
kubectl exec -it deployment/bifrost -- nc -zv bifrost-postgresql 5432

# Check secret
kubectl get secret bifrost-config -o yaml

High Memory Usage

# Check resource usage
kubectl top pods -l app.kubernetes.io/name=bifrost

# Increase limits
helm upgrade bifrost bifrost/bifrost \
  --set resources.limits.memory=4Gi \
  --reuse-values

Ingress Not Working

# Check ingress status
kubectl describe ingress bifrost

# Check ingress controller logs
kubectl logs -n ingress-nginx -l app.kubernetes.io/name=ingress-nginx

# Verify DNS
nslookup bifrost.yourdomain.com

Advanced Configuration

Custom Values File

Create my-values.yaml:
image:
  tag: "1.3.45"  # Required: specify the Bifrost version

replicaCount: 3

storage:
  mode: postgres

postgresql:
  enabled: true
  auth:
    password: "secure-password"

autoscaling:
  enabled: true
  minReplicas: 3
  maxReplicas: 10

ingress:
  enabled: true
  className: nginx
  hosts:
    - host: bifrost.example.com
      paths:
        - path: /
          pathType: Prefix

bifrost:
  encryptionKey: "your-32-byte-key"
  providers:
    openai:
      keys:
        - value: "sk-..."
          weight: 1
Install:
helm install bifrost bifrost/bifrost -f my-values.yaml

Environment Variables

Add custom environment variables:
env:
  - name: CUSTOM_VAR
    value: "custom-value"

envFrom:
  - secretRef:
      name: bifrost-secrets
  - configMapRef:
      name: bifrost-config

Node Affinity

Deploy to specific nodes:
nodeSelector:
  node-type: ai-workload

affinity:
  podAntiAffinity:
    requiredDuringSchedulingIgnoredDuringExecution:
      - labelSelector:
          matchLabels:
            app.kubernetes.io/name: bifrost
        topologyKey: kubernetes.io/hostname

tolerations:
  - key: "gpu"
    operator: "Equal"
    value: "true"
    effect: "NoSchedule"

Enterprise Deployment

For enterprise customers, Bifrost provides dedicated container images hosted in private registries with additional features, support, and SLAs.
Book a demo to know more about our enterprise features.

Private Container Registry

Enterprise customers receive access to Bifrost images in a private container registry. To use your enterprise registry, override the image.repository with your provided registry URL:
# enterprise-gcp.yaml
image:
  repository: us-west1-docker.pkg.dev/bifrost-enterprise/your-org/bifrost
  tag: "latest"

imagePullSecrets:
  - name: gcr-secret
Create the pull secret:
kubectl create secret docker-registry gcr-secret \
  --docker-server=us-west1-docker.pkg.dev \
  --docker-username=_json_key \
  --docker-password="$(cat service-account-key.json)" \
  [email protected]

Full Enterprise Configuration

Complete example for enterprise deployments with all recommended settings:
# enterprise-full.yaml
image:
  # Your enterprise registry URL (provided by Maxim)
  repository: us-west1-docker.pkg.dev/bifrost-enterprise/your-org/bifrost
  tag: "latest"

imagePullSecrets:
  - name: enterprise-registry-secret

replicaCount: 3

# Production-grade resources
resources:
  requests:
    cpu: 1000m
    memory: 2Gi
  limits:
    cpu: 4000m
    memory: 8Gi

# Auto-scaling for high availability
autoscaling:
  enabled: true
  minReplicas: 3
  maxReplicas: 20
  targetCPUUtilizationPercentage: 70
  targetMemoryUtilizationPercentage: 80

# PostgreSQL storage
storage:
  mode: postgres

postgresql:
  enabled: true
  auth:
    password: "secure-password"  # Use existingSecret in production
  primary:
    persistence:
      size: 100Gi
    resources:
      requests:
        cpu: 1000m
        memory: 2Gi
      limits:
        cpu: 4000m
        memory: 8Gi

# Vector store for semantic caching
vectorStore:
  enabled: true
  type: weaviate
  weaviate:
    enabled: true
    persistence:
      size: 100Gi

# Ingress with TLS
ingress:
  enabled: true
  className: nginx
  annotations:
    cert-manager.io/cluster-issuer: letsencrypt-prod
    nginx.ingress.kubernetes.io/proxy-body-size: "100m"
  hosts:
    - host: bifrost.yourcompany.com
      paths:
        - path: /
          pathType: Prefix
  tls:
    - secretName: bifrost-tls
      hosts:
        - bifrost.yourcompany.com

# Bifrost configuration
bifrost:
  encryptionKeySecret:
    name: "bifrost-encryption"
    key: "key"
  
  client:
    initialPoolSize: 1000
    dropExcessRequests: true
    enableLogging: true
    disableContentLogging: false  # Set to true for compliance
    logRetentionDays: 365
    enableGovernance: true
    enforceGovernanceHeader: true
    allowDirectKeys: false
    maxRequestBodySizeMb: 100
    allowedOrigins:
      - "https://yourcompany.com"
      - "https://*.yourcompany.com"
  
  # Use secrets for provider keys
  providers:
    openai:
      keys:
        - value: "env.OPENAI_API_KEY"
          weight: 1
    anthropic:
      keys:
        - value: "env.ANTHROPIC_API_KEY"
          weight: 1
  
  providerSecrets:
    openai:
      existingSecret: "provider-api-keys"
      key: "openai-api-key"
      envVar: "OPENAI_API_KEY"
    anthropic:
      existingSecret: "provider-api-keys"
      key: "anthropic-api-key"
      envVar: "ANTHROPIC_API_KEY"
  
  # Governance with authentication
  governance:
    authConfig:
      isEnabled: true
      disableAuthOnInference: false
      existingSecret: "bifrost-admin-credentials"
      usernameKey: "username"
      passwordKey: "password"
  
  # Enable all plugins
  plugins:
    telemetry:
      enabled: true
    logging:
      enabled: true
    governance:
      enabled: true
      config:
        is_vk_mandatory: true
    semanticCache:
      enabled: true
      config:
        provider: "openai"
        embedding_model: "text-embedding-3-small"
        dimension: 1536
        threshold: 0.85
        ttl: "1h"

# Pod distribution
affinity:
  podAntiAffinity:
    requiredDuringSchedulingIgnoredDuringExecution:
      - labelSelector:
          matchLabels:
            app.kubernetes.io/name: bifrost
        topologyKey: kubernetes.io/hostname

Enterprise Prerequisites

Before deploying, create the required secrets:
# 1. Registry pull secret (see registry-specific instructions above)

# 2. Encryption key
kubectl create secret generic bifrost-encryption \
  --from-literal=key='your-32-byte-encryption-key'

# 3. Provider API keys
kubectl create secret generic provider-api-keys \
  --from-literal=openai-api-key='sk-...' \
  --from-literal=anthropic-api-key='sk-ant-...'

# 4. Admin credentials (for governance)
kubectl create secret generic bifrost-admin-credentials \
  --from-literal=username='admin' \
  --from-literal=password='secure-admin-password'

Install Enterprise Build

helm install bifrost bifrost/bifrost -f enterprise-full.yaml

Enterprise Support

Enterprise customers have access to:
  • Dedicated Slack channel for support
  • Priority bug fixes and feature requests
  • Custom feature development
  • SLA guarantees
  • Compliance documentation (SOC2, HIPAA, etc.)
Contact [email protected] for enterprise support.

Resources

Next Steps

  1. Configure provider keys
  2. Enable plugins
  3. Set up observability
  4. Configure governance