You signed in with another tab or window. Reload to refresh your session.You signed out in another tab or window. Reload to refresh your session.You switched accounts on another tab or window. Reload to refresh your session.Dismiss alert
busbar 0.2.8: make the chart actually boot on busbar 1.5.3
Chart 0.2.7 / appVersion 1.5.3 could not boot by any documented route.
Each defect below was reproduced by running getbusbar/busbar:1.5.3 with the
chart's own rendered config mounted read-only at /etc/busbar/config.yaml as
uid 65532 under a read-only rootfs, then re-verified green the same way and
on a real kind cluster with ct lint + ct install.
1. Manage config.locked / config.overlay (new `configMutability`).
1.5.3 refuses to boot a mutable config whose overlay backend is not
writable, and that backend defaults to /etc/busbar/busbar-overlay.json,
a read-only ConfigMap subPath mount. Default mode is `locked`: a Helm
release is a GitOps deployment and it is the only mode that is correct
at replicaCount > 1. `overlay` and `none` are documented alternatives,
with the ephemerality / replica-divergence tradeoff spelled out.
2. `config` is now required; an empty one fails the render with the minimal
1.5.x config inline, instead of rendering a listener stub that exits 1
with "missing field `providers`". Both READMEs no longer claim a bare
install boots.
3. Every config example is busbar 1.5.x syntax: secret references
(api_key: { env: VAR }), an identity-providers admin-tokens definition
referenced by name from auth.admin_auth, and pool members keyed on
`model:` rather than the retired `target:`.
4. governance.enabled no longer emits the dissolved top-level `governance:`
block. It renders identity-providers.admin-tokens + auth.admin_auth +
store. New governance.store.module defaults to `memory` because every
durable store in 1.5.x is a signed store plugin and the 1.5.3 image
ships none; a non-memory module without config.plugins fails the render.
5. adminTLS / dataTLS emit 1.5.x secret references. cert_file / key_file /
client_ca_file are now cert: { file } / key: { file } / client_ca: { file };
the old fields made every TLS-enabled install exit 1.
Also: the bundled helm test now retries (it could fire before the Service
endpoint propagated and report a healthy gateway as broken), and
ci/overlay-values.yaml covers the overlay mode in ct install.
appVersion stays at 1.5.3.
Copy file name to clipboardExpand all lines: charts/busbar/Chart.yaml
+1-1Lines changed: 1 addition & 1 deletion
Original file line number
Diff line number
Diff line change
@@ -2,7 +2,7 @@ apiVersion: v2
2
2
name: busbar
3
3
description: A production-grade Helm chart for busbar, a Rust LLM gateway with a data plane and a separate, loopback-by-default, mTLS-gated admin plane.
Secrets are injected as environment variables from a Kubernetes Secret and referenced from the
39
-
config with `${VAR}` interpolation. The provider catalog ships inside the image at
40
-
`/etc/busbar/providers.yaml`; only set `providersCatalog` to override it.
62
+
config by **secret reference** (`api_key: { env: ANTHROPIC_KEY }`) - busbar 1.5.x removed the old
63
+
`*_env` string fields. The provider catalog ships inside the image at `/etc/busbar/providers.yaml`;
64
+
only set `providersCatalog` to override it.
65
+
66
+
`auth.chain: []` is an **open relay** and is for a first boot only; configure a real auth chain
67
+
before you expose the data plane.
68
+
69
+
## Config mutability
70
+
71
+
busbar 1.5.3 **refuses to boot** a mutable config (`config.locked: false`, its default) whose
72
+
overlay backend is not writable, and that backend defaults to `busbar-overlay.json` next to the
73
+
resolved `config.yaml` - here, `/etc/busbar/busbar-overlay.json`, which is a read-only ConfigMap
74
+
mount under `readOnlyRootFilesystem: true`:
75
+
76
+
```
77
+
[error] config is mutable (config.locked: false) but the overlay backend
78
+
'/etc/busbar/busbar-overlay.json' is not writable (is the config directory read-only?).
79
+
```
80
+
81
+
So the chart manages this for you via `configMutability.mode`:
82
+
83
+
| mode | renders | meaning |
84
+
|---|---|---|
85
+
|`locked` (default) |`config: { locked: true }`| The ConfigMap is the source of truth. The admin API refuses **config mutations** (it still serves keys, stats, `/config/reload` and the rest); you change config with `helm upgrade`, and `reloadOnConfigChange` rolls the pods. |
86
+
|`overlay`|`config: { locked: false, overlay: { file: <overlayFile> } }`| Admin-API config mutation works again, persisted to `configMutability.overlayFile` (default `/tmp/busbar-overlay.json`, on the chart's emptyDir). |
87
+
|`none`| nothing | You own `config.locked` / `config.overlay` inside `.Values.config`. |
88
+
89
+
`locked` is the default because a Helm release **is** a GitOps deployment, and because it is the
90
+
only mode that is correct at `replicaCount > 1`. In `overlay` mode with the default path the
91
+
overlay lives on a per-pod `emptyDir`: mutations are lost on restart, on `helm upgrade` and on any
92
+
reschedule, and with more than one replica **each replica keeps its own overlay and the replicas
93
+
will diverge**. Use `overlay` at `replicaCount: 1`, or point `overlayFile` at durable storage that
94
+
every replica mounts read-write.
95
+
96
+
Anything you set under `.Values.config.config` wins over the chart's value in every mode.
41
97
42
98
## Admin plane
43
99
@@ -52,10 +108,22 @@ If you enable the admin Service without either, the chart **fails the render** w
52
108
53
109
## Governance
54
110
55
-
When `governance.enabled=true`, busbar owns a single-writer SQLite DB — per-replica state. The chart
56
-
switches to a **StatefulSet with a PVC and `replicas: 1`**. **Horizontal scale of a shared SQLite
57
-
governance store is not supported.** Stateless (no governance) deployments use a Deployment and may
58
-
scale out (HPA supported).
111
+
When `governance.enabled=true`, busbar owns single-writer state, so the chart switches to a
112
+
**StatefulSet with a PVC and `replicas: 1`**. **Horizontal scale of a shared single-writer store is
113
+
not supported.** Stateless (no governance) deployments use a Deployment and may scale out (HPA
114
+
supported).
115
+
116
+
busbar 1.5.x dissolved the old top-level `governance:` config block (it is now a hard 1.x marker
117
+
the binary refuses to boot) into `store:` plus an admin-tokens identity provider referenced from
118
+
`auth.admin_auth`. The chart renders that shape for you.
119
+
120
+
Every durable store in 1.5.x is a signed **store** plugin, and the `getbusbar/busbar:1.5.3` image
121
+
ships no plugin tarballs (`busbar --list-plugins` prints `no plugin tarballs found`), so
122
+
`governance.store.module` defaults to `memory`: keys, group usage and ledgers are **ephemeral** and
123
+
reset on restart. To get durability, mount the signed store plugin into the pod yourself, set
124
+
`config.plugins.enabled: true` and `config.plugins.dir`, then set `governance.store.module`. The
125
+
chart fails the render if you name a non-`memory` module without wiring the plugin, because busbar
126
+
would otherwise exit 1.
59
127
60
128
## Examples
61
129
@@ -64,37 +132,59 @@ scale out (HPA supported).
64
132
```yaml
65
133
secrets:
66
134
data:
67
-
OPENAI_API_KEY: sk-...
68
-
BUSBAR_CLIENT_TOKEN: my-client-token
135
+
ANTHROPIC_KEY: sk-ant-...
136
+
BUSBAR_ADMIN_TOKEN: a-long-random-admin-token
69
137
config:
138
+
identity-providers:
139
+
admin-tokens:
140
+
module: admin-tokens
141
+
token: { env: BUSBAR_ADMIN_TOKEN }
70
142
auth:
71
-
chain: ["client-tokens"]
72
-
client_tokens: ["${BUSBAR_CLIENT_TOKEN}"]
143
+
chain: [] # open relay; set a real chain before exposing the data plane
144
+
admin_auth: [admin-tokens]
73
145
providers:
74
-
openai:
75
-
api_key_env: OPENAI_API_KEY
146
+
anthropic:
147
+
api_key: { env: ANTHROPIC_KEY }
76
148
models:
77
-
gpt-4o:
78
-
provider: openai
79
-
max_concurrent: 8
149
+
claude:
150
+
provider: anthropic
151
+
pools:
152
+
default:
153
+
members:
154
+
- model: claude # `model:`, not the retired 1.4.x `target:`
80
155
```
81
156
82
157
### With governance
83
158
84
-
Governance requires an admin token — put it in `secrets.data` under the key named by
159
+
Governance requires an admin token: put it in `secrets.data` under the key named by
85
160
`governance.adminTokenEnv`(default `BUSBAR_ADMIN_TOKEN`); the chart wires
86
-
`governance.admin_token`for you. (`helm install` fails fast if it is missing.)
161
+
`identity-providers.admin-tokens`and `auth.admin_auth` for you. (`helm install` fails fast if it
162
+
is missing.)
87
163
88
164
```yaml
89
165
governance:
90
166
enabled: true
167
+
store:
168
+
module: memory # see the note above about durable store plugins
0 commit comments