Install a pinned 0.5.0 release and verify the rendered namespace, identities, controllers, CRDs, and admission policies. The core procedure uses Helm in the chart’s default multi-tenant mode.
Before you begin
- Confirm that the cluster meets the compatibility requirements. Kubernetes 1.33 satisfies the chart constraint, while current release gates validate Kubernetes 1.34 and 1.35.
- Use an identity that can create cluster-scoped CRDs, RBAC, and ValidatingAdmissionPolicies.
- Decide whether Helm, a release manifest, or a maintained Kustomize overlay owns future upgrades.
- Decide the tenancy model. Use the separate single-tenant procedure for one watched namespace.
Choose an installation path
| Requirement | Path | What to verify |
|---|---|---|
| Standard multi-tenant installation | Helm | Controller, Provisioner, CRDs, policies, and release identity |
| Default resources without Helm | Pinned install.yaml release asset | Published version and default namespace or identity |
| Custom namespace or prefix | config/overlays/custom-identity | Every subject and admission identity after rendering |
| Dedicated single namespace | Helm tenancy.mode=single or config/overlays/single-tenant | Controller-only runtime and WATCH_NAMESPACE |
| OpenShift | Helm with platform=openshift, or auto-detection | SCC-compatible workload security context |
| Local development | Source deployment | Development image and generated resources |
Install with Helm
Set the release values.
configureSet the 0.5.0 release values
export OPERATOR_RELEASE=openbao-operator export OPERATOR_NAMESPACE=openbao-operator-system export CHART_VERSION=0.5.0Inspect the chart defaults when the platform needs overrides.
inspectRead the pinned values
helm show values \ oci://ghcr.io/dc-tec/charts/openbao-operator \ --version "${CHART_VERSION}"Pin the chart and normally let its
appVersionselect the matching operator image. Setimage.tagonly for a controlled prerelease or test. The complete pinned reference isvalues.yaml.Render the installation before applying it when you use non-default values.
inspectRender the Helm release
helm template "${OPERATOR_RELEASE}" \ oci://ghcr.io/dc-tec/charts/openbao-operator \ --version "${CHART_VERSION}" \ --namespace "${OPERATOR_NAMESPACE}"Check the controller and Provisioner ServiceAccounts, RoleBinding subjects, admission-policy identity variables, projected token audience, images, and namespaces.
Install the chart.
applyInstall OpenBao Operator
helm upgrade --install "${OPERATOR_RELEASE}" \ oci://ghcr.io/dc-tec/charts/openbao-operator \ --version "${CHART_VERSION}" \ --namespace "${OPERATOR_NAMESPACE}" \ --create-namespace \ --waitWait for both multi-tenant Deployments.
verifyVerify the controller and Provisioner
kubectl -n "${OPERATOR_NAMESPACE}" rollout status \ deployment/openbao-operator-controller --timeout=2m kubectl -n "${OPERATOR_NAMESPACE}" rollout status \ deployment/openbao-operator-provisioner --timeout=2mVerify the installed APIs and admission policies.
verifyVerify cluster-scoped resources
kubectl get crd \ openbaoclusters.openbao.org \ openbaotenants.openbao.org \ openbaorestores.openbao.org kubectl get validatingadmissionpolicies \ -l app.kubernetes.io/instance="${OPERATOR_RELEASE}"Verify the default controller JWT contract.
inspectInspect the controller identity and audience
kubectl -n "${OPERATOR_NAMESPACE}" get serviceaccount \ openbao-operator-controller kubectl -n "${OPERATOR_NAMESPACE}" get deployment \ openbao-operator-controller -o yamlConfirm that the Deployment uses the rendered ServiceAccount, mounts the projected
openbao-token, and aligns its audience withOPENBAO_JWT_AUDIENCE. Continue with operator authentication when you customize these values.
Install the published manifest
Use the release asset when the platform wants the published default resources without a Helm release:
Apply the 0.5.0 installer manifest
kubectl apply -f \
https://github.com/dc-tec/openbao-operator/releases/download/0.5.0/install.yamlThe manifest uses the repository’s default operator namespace and identity. Do not rewrite the rendered YAML by hand for a custom identity; maintain a Kustomize overlay instead.
Install with a custom raw identity
Use config/overlays/custom-identity when the platform owns a different operator namespace or namePrefix.
Render the custom identity
kubectl kustomize config/overlays/custom-identityBefore applying the overlay, confirm:
- Controller and Provisioner ServiceAccounts have the intended names and namespace.
- RoleBinding and ClusterRoleBinding subjects point at those ServiceAccounts.
- Admission-policy variables use the same namespace and ServiceAccount names.
OPENBAO_JWT_AUDIENCEmatches the projectedopenbao-tokenaudience.- The OpenBao JWT role’s bound subject matches the rendered controller identity.
Apply only after the render is internally consistent:
Apply the custom identity overlay
kubectl apply -k config/overlays/custom-identityInstall on OpenShift
The chart defaults to platform=auto. Set platform=openshift when the installation must force OpenShift behavior:
Force OpenShift rendering
helm upgrade --install openbao-operator \
oci://ghcr.io/dc-tec/charts/openbao-operator \
--version 0.5.0 \
--namespace openbao-operator-system \
--create-namespace \
--set platform=openshiftOpenShift mode omits fixed runAsUser and fsGroup IDs so the Security Context Constraint can assign namespace-scoped
IDs. Validate the result against the target cluster’s SCC and admission configuration.
Install from source for development
Use this path only for local development and contribution:
Deploy a development image
make install
make deploy IMG=ghcr.io/dc-tec/openbao-operator:devUpgrade the operator
Helm does not upgrade installed CRDs. For every release with CRD changes, apply the release CRDs before the controller:
Upgrade to 0.5.0
kubectl apply -f \
https://github.com/dc-tec/openbao-operator/releases/download/0.5.0/crds.yaml
helm upgrade openbao-operator \
oci://ghcr.io/dc-tec/charts/openbao-operator \
--version 0.5.0 \
--namespace openbao-operator-system \
--reuse-values \
--waitRe-render custom identities and review OpenBao-side policy changes before upgrading. Self-init does not update existing OpenBao policies.
Uninstall the operator
Remove the Helm release
helm uninstall openbao-operator --namespace openbao-operator-systemTroubleshoot installation
| Symptom | Check |
|---|---|
| Controller starts but Provisioner is absent | Confirm that the chart did not render tenancy.mode=single |
| Pods run but admission rejects ordinary resources | Inspect policy bindings, rendered identity variables, and the API server’s ValidatingAdmissionPolicy support |
| Custom names break reconciliation | Compare every ServiceAccount, RoleBinding subject, admission variable, and JWT bound subject |
| OpenShift rejects Pod identity fields | Confirm auto-detection or set platform=openshift, then review SCC ownership |
| Helm upgrade leaves an old API schema | Apply the release crds.yaml before retrying the controller upgrade |
In multi-tenant mode, continue with namespace onboarding.