Skip to content

Deploy on Kubernetes (Helm)

Busbar ships an official Helm chart. It renders the Deployment, the two Services Busbar needs (the public data plane and the separate admin plane), the config ConfigMap, and the Secret wiring for provider keys — with sensible, secure defaults.

  • Kubernetes 1.24+ and Helm 3.8+.
  • cert-manager if you expose the admin plane in-cluster with mTLS (the default posture — see The admin plane below). Not needed if you keep the admin plane loopback-only.
Terminal window
helm repo add busbar https://getbusbar.github.io/helm-charts
helm repo update
helm install busbar busbar/busbar -n busbar --create-namespace \
-f my-values.yaml

The chart’s default image is getbusbar/busbar, pinned to the chart’s appVersion. Pin your own release with --set image.tag=1.4.1.

Busbar is configured by a config.yaml (the deploy config) and providers.yaml (the provider catalog, which ships inside the image — you only override it if you add providers). The chart renders config into config.yaml, mounts it at /etc/busbar/, and injects secrets as env vars that Busbar interpolates with ${VAR}:

my-values.yaml
image:
tag: "1.4.1"
# Provider keys + client token → a Secret, referenced as ${VAR} in config below.
secrets:
create: true
data:
ANTHROPIC_KEY: sk-ant-...
BUSBAR_CLIENT_TOKEN: a-long-random-string
# Rendered to /etc/busbar/config.yaml. `listen` and `admin_listen` are managed by the chart.
config:
auth:
client_tokens: ["${BUSBAR_CLIENT_TOKEN}"]
providers:
anthropic:
key: "${ANTHROPIC_KEY}"
models:
claude-sonnet:
provider: anthropic
model: claude-sonnet-4-5

Send LLM traffic to the data Service on port 8080:

Terminal window
kubectl -n busbar port-forward svc/busbar 8080:8080
curl -s localhost:8080/healthz

Busbar always runs its admin API (/api/v1/admin/…) on a separate listener from public LLM traffic, so the two never share a port, bind, or firewall posture.

  • Data plane0.0.0.0:8080, the busbar Service. Front it with an Ingress or Gateway for LLM traffic.
  • Admin planeadmin_listen, defaults to loopback. A network-exposed admin listener refuses to boot unless it requires mTLS or is explicitly marked insecure. So the chart keeps the admin plane loopback-only unless you opt in:
service:
admin:
enabled: true # expose the admin plane on an in-cluster Service (:8081)
adminTLS:
enabled: true # required for a non-loopback admin bind
certManager:
enabled: true
issuerRef:
name: busbar-admin-ca
kind: ClusterIssuer
networkPolicy:
enabled: true
admin:
allowedNamespaces: ["platform"] # who may reach the admin Service

cert-manager issues the admin server cert (and, optionally, client certs for your tooling); the NetworkPolicy restricts who can reach it. For a lab you can instead set adminInsecure: true, but never do that on a cluster reachable by untrusted workloads.

Both ports serve GET /healthz unauthenticated; the chart uses it for liveness and readiness on the data port (readiness returns 200 once at least one lane is usable).

Without governance, Busbar is stateless — the chart runs a Deployment and you can scale it horizontally (breaker and health state are correctly per-replica). Turn on governance and Busbar owns a single-writer SQLite database, so the chart switches to a StatefulSet with a PVC and replicas: 1:

Governance requires an admin token — busbar won’t boot without one. Put it in the Secret under BUSBAR_ADMIN_TOKEN (the chart wires governance.admin_token for you; helm install fails fast if it’s missing):

governance:
enabled: true
persistence:
size: 1Gi
storageClass: standard
secrets:
data:
BUSBAR_ADMIN_TOKEN: a-long-random-admin-token

Horizontal scale of a shared SQLite governance store is not supported; scale vertically. (An external governance store is on the roadmap.) See Running multiple instances (HA).

autoscaling:
enabled: true # HPA on the stateless data Deployment (not the governance StatefulSet)
minReplicas: 2
maxReplicas: 8
targetCPUUtilizationPercentage: 70
ingress:
enabled: true
className: nginx
hosts:
- host: llm.example.com
paths: [{ path: /, pathType: Prefix }]

Changing config and running helm upgrade updates the ConfigMap; a checksum annotation rolls the pods so the new config takes effect (set reloadOnConfigChange: false to opt out). Because the config is identical across replicas, rollouts are safe.

Terminal window
kubectl -n busbar get pods
kubectl -n busbar exec deploy/busbar -- busbar --validate # config parses + validates
kubectl -n busbar port-forward svc/busbar 8080:8080 &
curl -s localhost:8080/healthz && echo ok

The full values surface is documented in the chart’s README. For the admin API the Services expose, see the Admin API reference and the live API reference.