0.1.0-preview.3 requires a fresh disposable installation. Do not use this
procedure to upgrade an earlier preview: its unbound registry state is rejected.
Keep the old state, checkpoint, and key material intact. See
Compatibility
.
Use the procedure below only when the target release documents support for the installed release’s configuration and persisted state. Every provider sits on its API server’s boot path, so upgrade one control-plane node at a time and confirm each one before moving on. For wire-format promises between releases, see Reference: Compatibility .
Before you begin
Defer the upgrade while a Transit rotation is pending, OpenBao is failing over or restoring, or the release notes announce a wire-format change you have not planned a migration for. Otherwise:
- download and verify the new release as in Download the release ,
- confirm
rotation-planshows no pending rotation and every node reports the samekey_idhash, - confirm
doctorwith--encryption-configpasses on every node, - keep the current package or image on every node for rollback,
- record the current provider version,
key_idhash, and Transit key version.
Upgrade each node
Run
doctorwith the new binary or image and resolve any failed check:terminalbao-kms-provider doctor \ --config /etc/openbao-kms/config.yaml \ --encryption-config /etc/kubernetes/openbao-kms/encryption-config.yamlInstall the new release. For systemd, install the new package or tarball and run
systemctl restart bao-kms-provider.service. For a static pod, set the new verified image digest in/etc/kubernetes/manifests/bao-kms-provider.yamlafter preloading it.Confirm
/readyreturns HTTP 200 and thekey_idhash matches the other nodes:terminalcurl -fsS http://127.0.0.1:8082/ready curl -fsS http://127.0.0.1:8081/metrics | grep openbao_kms_status_key_id_hashRestart the local API server only if the release notes require it.
After the last node, confirm every node reports the same key_id hash.
Roll back
Roll back only if the older release can read the current registry schema and
every key_id, annotation, and
AAD format now in etcd; otherwise decryption fails with unknown key_id
errors. Never roll back when:
- the new release wrote data in a new wire format,
- a rotation completed under the new release that the older release never promoted,
- the release notes call the upgrade one-way.
In those cases, fix forward with a patch release.
To roll back, repeat the node procedure with the previous package or image
digest, running doctor with the previous binary before starting it. If
unknown key_id errors appear, return to the newer release and follow
Troubleshooting: Unknown key ID
.
Migrate a static-pod JWT file mount
For manifests that mount /var/lib/openbao-kms/identity.jwt as a file, update
one control-plane node at a time. Schedule an API outage for a single-node
control plane. The provider must restart once to change its mounts.
- Create
/var/lib/openbao-kms/credentialsasroot:65532with mode0750; see Security: Linux identity model . - Configure the host issuer agent to publish a current JWT as
/var/lib/openbao-kms/credentials/identity.jwtasroot:65532with mode0640. - Change
auth.jwt.jwtFilein the host configuration to the new path. Preserve all identity values and the state directory. - Update both the JWT volume and its mount to the credential directory,
with hostPath type
Directoryand a read-only mount. Regenerate the manifest withinit --model static-podor use the current sample. The generator rejects credential directories that overlap state or socket directories. - Install the updated configuration and manifest. Wait for the new container
and HTTP 200 from
/ready. Verify an existing encrypted resource remains readable before continuing to the next node.
Subsequent atomic JWT replacements do not require a provider restart. This path change does not change key IDs, AAD, Transit keys, or encrypted data. Existing systemd JWT paths remain supported.