Skip to main content
Version: 0.1.0-rc.5

Decision matrix

Choose the bootstrap path deliberately

Choose the bootstrap path deliberately.
PathUse it whenWhat happens to the root tokenWatch for
Standard initYou need a temporary compatibility path for development or controlled manual setup.A root token can be created and stored in a Secret.This is easier to start with, but it leaves you with a stronger credential-management burden afterward.

Diagram

Self-init bootstrap flow

The cluster initializes, applies the declared requests, and then revokes the bootstrap credential instead of treating it as a permanent operating dependency.

Lockout is the real failure mode

Self-init is safer only if you plan the access path up front. If you enable it without creating a usable auth method for operators or humans, the root token is revoked and the cluster can become effectively unreachable without recreation.

Enable self-init

Configure

Start from the minimum self-init block

yaml

spec:
selfInit:
enabled: true
requests:
- name: enable-audit
operation: update
path: sys/audit/file
auditDevice:
type: file
fileOptions:
filePath: /tmp/audit.log

Treat requests as part of the bootstrap contract. They should create the minimum auth, policy, and audit state required for the cluster to be useful after bootstrap.

What belongs in requests

Reference table

Structured request surfaces

Structured request surfaces.
SurfaceUse it forTypical example
policyCreate ACL policies that your auth methods will bind to.Policies for apps, operators, or bootstrap-only roles.
secretEngineEnable mounts such as KV or transit.Initial application secret storage or cryptography services.
auditDeviceTurn on audit logging at bootstrap time.File or stdout audit devices required by your environment.
dataFallback for raw API payloads when no structured field exists.Specialized configuration that is not covered by the higher-level request fields yet.
Do not embed raw secrets in requests

Avoid placing passwords, tokens, or key material directly in the manifest. Use Kubernetes Secrets where supported and treat bootstrap content like the rest of your GitOps security surface.

Bootstrap operator OIDC roles

Configure

Enable operator OIDC bootstrap

yaml

spec:
selfInit:
enabled: true
oidc:
enabled: true
# Optional:
# issuer: "https://..."
# audience: "openbao-internal"

This bootstraps operator-only JWT auth roles for lifecycle work such as backup, upgrade, and restore. It does not create human login paths by itself.

Reference table

What must stay aligned

What must stay aligned.
SurfaceWhy it mattersWhat to align
JWT audienceThe role binding inside OpenBao and the projected token audience must match.Keep spec.selfInit.oidc.audience aligned with the installation-scoped OPENBAO_JWT_AUDIENCE value.
Rendered controller identityCustom namespace or name-prefix changes affect the ServiceAccount subject the JWT role expects.If you manage roles manually, bind them to the rendered controller ServiceAccount identity rather than to a guessed default.

Common bootstrap patterns

Configure

Enable a JWT auth method

yaml

- name: enable-jwt
operation: update
path: sys/auth/jwt-operator
authMethod:
type: jwt
description: "Kubernetes JWT auth"
config:
default_lease_ttl: "1h"
max_lease_ttl: "24h"

Verify the cluster finished bootstrap

Verify

Check the self-init status bit

bash

kubectl get openbaocluster <name> -o jsonpath='{.status.selfInitialized}'

A healthy bootstrap should report true. If it does not, inspect the cluster status conditions and controller logs before retrying with additional requests.

Continue cluster baseline

Prerelease documentation

This version tracks a prerelease build. Features and behavior may change before the next stable release.

Was this page helpful?

Use Needs work to open a structured GitHub issue for this page. The Yes button only acknowledges the signal locally.