Create a disposable Development cluster for evaluation. Do not create a production cluster until its entire
Hardened contract is complete.
Before you begin
- Verify the controller and Provisioner are available.
- In multi-tenant mode, confirm
OpenBaoTenant.status.provisioned: trueand the tenant RoleBinding. - In single-tenant mode, confirm that the controller’s
WATCH_NAMESPACEequals the target namespace. - Confirm a default StorageClass exists for evaluation. Choose the StorageClass and capacity explicitly for production.
- Decide whether the cluster is disposable or intended for production before the first reconcile.
Choose the profile
| Profile | Intended use | Security behavior |
|---|---|---|
Development | Local evaluation, CI, and disposable environments | Permits operator-managed TLS, static auto-unseal, and a root token Secret; reports security risk |
Hardened | Production | Requires External or ACME TLS, non-static unseal, self-init, and at least three replicas |
spec.profile is required. Changing the word Development to Hardened does not complete the production contract.
Create an evaluation cluster
Save this manifest as
cluster.yaml.configureDeclare the evaluation cluster
apiVersion: openbao.org/v1alpha1 kind: OpenBaoCluster metadata: name: dev-cluster namespace: openbao-demo spec: version: "2.6.0" replicas: 1 profile: Development tls: enabled: true mode: OperatorManaged rotationPeriod: "720h" storage: size: "10Gi" deletionPolicy: RetainReplace
openbao-demoonly with a namespace authorized by the chosen tenancy model. Version 2.6.x is the primary current validation line; the manifest pins the concrete version exercised by current CI.Apply the manifest.
applyCreate the cluster
kubectl apply -f cluster.yamlWatch the custom resource and Pods converge.
inspectWatch cluster creation
kubectl -n openbao-demo get openbaocluster dev-cluster -w kubectl -n openbao-demo get pods \ -l openbao.org/cluster=dev-cluster -wWait for the availability condition.
verifyWait for cluster availability
kubectl -n openbao-demo wait \ --for=condition=Available \ openbaocluster/dev-cluster \ --timeout=10mInspect the final status and storage.
verifyVerify status and persistent storage
kubectl -n openbao-demo get openbaocluster dev-cluster -o yaml kubectl -n openbao-demo get pods,pvc,services \ -l openbao.org/cluster=dev-clusterConfirm:
status.phaseisRunning;status.readyReplicasequalsspec.replicas;Available=TrueandTLSReady=True;- every voter Pod is Ready and its PVC is Bound;
- the TLS mode and storage match the declared configuration.
Prepare a Hardened cluster
A complete production manifest must define all of these contracts before the first reconcile:
- Set
profile: Hardenedand at least three replicas. - Configure
tls.mode: ExternalorACMEand verify the issuer, Secret, domain, and termination boundary. - Configure a non-static unseal provider and its workload identity or Secret references.
- Enable self-init and provide a non-empty request list.
- Enable operator OIDC when lifecycle Jobs will use projected JWT authentication.
- Create at least one usable human authentication path in
selfInit.requestsbefore root-token revocation. - Set persistent storage and deletion policy explicitly. Account for the current lack of voter resource controls before production.
- Configure and test backup identity, object storage, and restore before the first risky change.
- Define network egress for external unseal, backup, issuer, or discovery dependencies.
Use the configuration baseline for these choices. Do not publish an incomplete Hardened YAML
block as if it were executable.
Troubleshoot the first reconcile
| Symptom | Check first |
|---|---|
| No workload resources appear | Tenant handoff RoleBinding or single-tenant WATCH_NAMESPACE |
| Admission rejects the profile | Required Hardened TLS, unseal, self-init, requests, or replica fields |
| Pods remain Pending | StorageClass, PVC events, resource availability, and placement rules |
| Pods crash or remain sealed | Generated configuration, unseal Secret or identity, TLS mounts, and events |
Available=False with some Ready Pods | Desired versus ready replica count and per-Pod conditions |
ProductionReady=False | The exact condition reason; do not infer it from Pod readiness alone |
Continue with production operations.