Create the first cluster you can keep operating.
By the time you reach this step, the operator is installed and the target namespace is already onboarded when you are in the default multi-tenant mode. Start with the closest safe baseline, verify the cluster becomes healthy, and then move directly into the next operating concern.
Before you apply the cluster manifest
- confirm the operator install is healthy in the namespace model you chose
- confirm the target namespace is already onboarded through OpenBaoTenant when you are in multi-tenant mode
- choose a StorageClass explicitly for production before the first reconcile
- decide whether this cluster is only for evaluation or intended to become production
- In the default multi-tenant mode, create the target namespace and finish OpenBaoTenant onboarding before you apply
OpenBaoCluster. - In single-tenant mode, skip
OpenBaoTenantand create the cluster only in the controller's watched namespace.
Decision matrix
Pick the first-cluster intent
| Intent | Start with | Do not skip | Go deeper |
|---|---|---|---|
| Local evaluation | Development profile with operator-managed TLS and minimal storage choices. | Treat it as disposable. Do not carry this profile into production. | Security profiles |
| Hardened production baseline | Hardened profile, self-init, External or ACME TLS, and explicit storage. | User access bootstrap, unseal configuration, and backups before the first risky upgrade. | Validated deployments |
| Dedicated team namespace | The hardened baseline plus the single-tenant operator install path. | Namespace ownership, rendered controller identity, and WATCH_NAMESPACE alignment. | Single-tenant mode |
Start with the closest manifest
- Local evaluation
- Hardened baseline
Configure
Start a development-profile cluster for local evaluation
apiVersion: openbao.org/v1alpha1
kind: OpenBaoCluster
metadata:
name: dev-cluster
namespace: openbao-demo
spec:
version: "2.5.0"
replicas: 3
profile: Development
tls:
enabled: true
mode: OperatorManaged
rotationPeriod: "720h"
storage:
size: "10Gi"
If you are on the default multi-tenant path, openbao-demo must already be onboarded through OpenBaoTenant.
If you are on the single-tenant path, replace openbao-demo with the namespace watched by the controller.
The Development profile stores sensitive material in Kubernetes Secrets and relaxes production controls.
Use it for local testing and CI, not for real environments.
Configure
Use a hardened baseline as the starting production shape
apiVersion: openbao.org/v1alpha1
kind: OpenBaoCluster
metadata:
name: prod-cluster
namespace: openbao-prod
spec:
version: "2.5.0"
replicas: 3
profile: Hardened
tls:
enabled: true
mode: External
storage:
size: "50Gi"
storageClassName: "fast-ssd"
selfInit:
enabled: true
oidc:
enabled: true
requests:
# add at least one human login path before first exposure
# for example: userpass, JWT, or Kubernetes auth
unseal:
# configure cloud or transit auto-unseal before first reconcile
Complete these before the first production reconcile:
- finish the full
selfInitcontract so it includes bothoidc.enabled: truefor operator lifecycle auth and at least one human login path inselfInit.requests, using Self-Initialization and Operator Authentication - finish
unsealwith an external trust path such as cloud KMS, transit, KMIP, OCI KMS, or PKCS#11 in Unseal Configuration - finish the namespace handoff for your tenancy mode so
openbao-prodis already onboarded in multi-tenant mode or is the watched namespace in single-tenant mode
spec.selfInit.oidc.enabled: true gives the operator a JWT-based control path. It does not create a human login path.
If the cluster will self-initialize, include at least one human auth method in selfInit.requests before the first reconcile so the cluster is usable after the root token is revoked.
If you are going straight to production, prefer a tested architecture or recipe under Validated Deployments rather than inventing the entire first manifest from scratch.
Apply and verify
Apply
Apply the cluster manifest
kubectl apply -f cluster.yaml
Inspect
Inspect cluster phase and readiness
kubectl get openbaocluster <name> -n <namespace> -o wide
Watch status.phase, readyReplicas, and whether the cluster reaches Available=True.
Verify
Watch the cluster pods stabilize
kubectl get pods -l openbao.org/cluster=<name> -n <namespace> -w
A healthy first cluster should converge without repeated crash loops or long-lived pending state.
Confirm the cluster is available, TLS and storage match the shape you intended, and hardened clusters can realistically progress toward ProductionReady=True.
Once the first cluster is healthy
Official OpenBao background
You are reading docs for version 0.1.0. Use the version menu to switch to next or another archived 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.