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.
Prerequisites
Section titled “Prerequisites”- 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.
Install
Section titled “Install”helm repo add busbar https://getbusbar.github.io/helm-chartshelm repo updatehelm install busbar busbar/busbar -n busbar --create-namespace \ -f my-values.yamlThe chart’s default image is getbusbar/busbar, pinned to the chart’s appVersion. Pin your own
release with --set image.tag=1.4.1.
A minimal production values file
Section titled “A minimal production values file”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}:
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-5Send LLM traffic to the data Service on port 8080:
kubectl -n busbar port-forward svc/busbar 8080:8080curl -s localhost:8080/healthzThe two-listener model
Section titled “The two-listener model”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 plane —
0.0.0.0:8080, thebusbarService. Front it with an Ingress or Gateway for LLM traffic. - Admin plane —
admin_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: ClusterIssuernetworkPolicy: enabled: true admin: allowedNamespaces: ["platform"] # who may reach the admin Servicecert-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).
Governance (persistent state)
Section titled “Governance (persistent state)”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: standardsecrets: data: BUSBAR_ADMIN_TOKEN: a-long-random-admin-tokenHorizontal 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, ingress, upgrades
Section titled “Autoscaling, ingress, upgrades”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.
Verify
Section titled “Verify”kubectl -n busbar get podskubectl -n busbar exec deploy/busbar -- busbar --validate # config parses + validateskubectl -n busbar port-forward svc/busbar 8080:8080 &curl -s localhost:8080/healthz && echo okThe 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.