OpenBaoCluster API

Fields, defaults, and validation for the OpenBaoCluster API.

Updated 17 October 2026 · 81 min read

On this page

Packages

openbao.org/v1alpha1

Package v1alpha1 contains API Schema definitions for the openbao v1alpha1 API group.

Resource Types

ACMEConfig

ACMEConfig configures ACME certificate management for OpenBao. See: https://openbao.org/docs/configuration/listener/tcp/#acme-parameters

Appears in:

FieldDescriptionDefaultValidation
directoryURL stringDirectoryURL is the ACME directory URL (e.g., https://acme-v02.api.letsencrypt.org/directory).MinLength: 1
domains string arrayDomains is the list of domain names for which to obtain the certificate.
This maps to OpenBao’s listener tls_acme_domains field.
When empty, the operator will default to an internal Service name suitable for
private ACME CAs running inside the cluster (e.g., “<cluster>-acme.<namespace>.svc”).
MinItems: 1
Optional: {}
email stringEmail is the email address to use for ACME registration.Optional: {}
sharedCache ACMESharedCacheConfigSharedCache configures a filesystem cache shared across OpenBao replicas for ACME account
and certificate state. This is required for HA ACME topologies where more than one Pod
can serve the same hostname concurrently.
Optional: {}

ACMESharedCacheConfig

ACMESharedCacheConfig configures the shared filesystem cache for ACME account and certificate state. See: https://openbao.org/docs/configuration/listener/tcp/#acme-parameters

Appears in:

FieldDescriptionDefaultValidation
mode ACMESharedCacheModeMode selects whether the operator creates a dedicated RWX PVC or mounts an existing one.Enum: [ManagedPVC ExistingPVC]
existingClaimName stringExistingClaimName is the name of a pre-created RWX PVC in the same namespace.
Required when Mode is ExistingPVC.
MinLength: 1
Optional: {}
size stringSize is the requested capacity for the managed ACME cache PVC.
Required when Mode is ManagedPVC.
MinLength: 1
Optional: {}
storageClassName stringStorageClassName is an optional StorageClass for the managed ACME cache PVC.Optional: {}

ACMESharedCacheMode

Underlying type: string

ACMESharedCacheMode controls how the operator provides a shared filesystem for OpenBao’s ACME cache.

Validation:

  • Enum: [ManagedPVC ExistingPVC]

Appears in:

FieldDescription
ManagedPVCACMESharedCacheModeManagedPVC instructs the operator to create a dedicated RWX PVC.
ExistingPVCACMESharedCacheModeExistingPVC instructs the operator to mount an existing RWX PVC.

APIServerEgressConfig

APIServerEgressConfig selects an additional Kubernetes API egress policy.

Appears in:

FieldDescriptionDefaultValidation
mode stringMode selects the Cilium kube-apiserver entity policy. This requires Cilium
and its namespaced cilium.io/v2 CiliumNetworkPolicy API.
Enum: [Cilium]
port integerPort is the API server’s TCP backend port after Service translation.
Set this to the cluster’s actual backend port, which can differ from 443.
6443Maximum: 65535
Minimum: 1
Optional: {}

AWSKMSSealConfig

AWSKMSSealConfig configures the AWS KMS seal type. See: https://openbao.org/docs/configuration/seal/awskms/

Appears in:

FieldDescriptionDefaultValidation
region stringRegion is the AWS region where the encryption key lives.MinLength: 1
kmsKeyID stringKMSKeyID is the AWS KMS key ID or ARN to use for encryption and decryption.
An alias in the format “alias/key-alias-name” may also be used.
MinLength: 1
endpoint stringEndpoint is the KMS API endpoint to be used for AWS KMS requests.
Useful when connecting to KMS over a VPC Endpoint.
Optional: {}
accessKey stringAccessKey is the AWS access key ID to use.
Note: It is strongly recommended to use CredentialsSecretRef or Workload Identity (IRSA) instead.
Optional: {}
secretKey stringSecretKey is the AWS secret access key to use.
Note: It is strongly recommended to use CredentialsSecretRef or Workload Identity (IRSA) instead.
Optional: {}
sessionToken stringSessionToken specifies the AWS session token.Optional: {}

AdminOpsControllerStatus

AdminOpsControllerStatus holds status owned by the adminops controller.

Appears in:

FieldDescriptionDefaultValidation
lastError ControllerErrorStatusLastError is the last adminops-controller error observed for this cluster.Optional: {}

AuditDevice

AuditDevice defines a declarative audit device configuration. See: https://openbao.org/docs/configuration/audit/

Appears in:

FieldDescriptionDefaultValidation
type stringType is the type of audit device (e.g., “file”, “syslog”, “socket”, “http”).Enum: [file syslog socket http]
MinLength: 1
path stringPath is the path of the audit device in the root namespace.MinLength: 1
description stringDescription is an optional description for the audit device.Optional: {}
fileOptions FileAuditOptionsFileOptions configures options for file audit devices.
Only used when Type is “file”.
Optional: {}
httpOptions HTTPAuditOptionsHTTPOptions configures options for HTTP audit devices.
Only used when Type is “http”.
Optional: {}
syslogOptions SyslogAuditOptionsSyslogOptions configures options for syslog audit devices.
Only used when Type is “syslog”.
Optional: {}
socketOptions SocketAuditOptionsSocketOptions configures options for socket audit devices.
Only used when Type is “socket”.
Optional: {}
options JSONOptions contains device-specific configuration options as a string map.
This is a fallback for backward compatibility and advanced use cases.
If structured options (FileOptions, HTTPOptions, etc.) are provided, they take precedence.
OpenBao audit options are string-to-string; scalar JSON values are rendered as strings,
while nested objects and arrays are rejected. For HTTP headers, prefer httpOptions.headers.
Optional: {}

AuditFileStorageConfig

AuditFileStorageConfig configures the shared filesystem integration point for file audit devices.

The operator mounts the selected PVC into each OpenBao Pod. Each Pod uses a pod-specific subPath under the same PVC so all Pods can render the same audit file path while collectors can mount the PVC read-only and read per-Pod audit files from the backing directories. This storage is intended as a collector handoff and replay buffer, not as the authoritative compliance archive.

Appears in:

FieldDescriptionDefaultValidation
mode AuditFileStorageModeMode selects whether the operator creates a dedicated RWX PVC or mounts an existing one.Enum: [ManagedPVC ExistingPVC]
existingClaimName stringExistingClaimName is the name of a pre-created RWX PVC in the same namespace.
Required when Mode is ExistingPVC.
MinLength: 1
Optional: {}
size stringSize is the requested capacity for the managed audit file storage PVC.
Required when Mode is ManagedPVC.
MinLength: 1
Optional: {}
storageClassName stringStorageClassName is an optional StorageClass for the managed audit file storage PVC.Optional: {}
mountPath stringMountPath is where the audit file storage PVC is mounted in OpenBao Pods.
File audit device paths must be under this path when auditFileStorage is configured.
/openbao/auditOptional: {}

AuditFileStorageMode

Underlying type: string

AuditFileStorageMode controls how the operator provides shared filesystem storage for file audit logs.

Validation:

  • Enum: [ManagedPVC ExistingPVC]

Appears in:

FieldDescription
ManagedPVCAuditFileStorageModeManagedPVC instructs the operator to create a dedicated RWX PVC.
ExistingPVCAuditFileStorageModeExistingPVC instructs the operator to mount an existing RWX PVC.

AutoRollbackConfig

AutoRollbackConfig defines conditions that trigger automatic rollback.

Appears in:

FieldDescriptionDefaultValidation
enabled booleanEnabled controls whether automatic rollback is active.true
onJobFailure booleanOnJobFailure triggers rollback when job failures exceed MaxJobFailures.
Only applies during early phases (before demoting Blue).
true
onValidationFailure booleanOnValidationFailure triggers automatic abort/rollback if the pre-promotion
hook fails.
true

AzureKeyVaultSealConfig

AzureKeyVaultSealConfig configures the Azure Key Vault seal type. See: https://openbao.org/docs/configuration/seal/azurekeyvault/

Appears in:

FieldDescriptionDefaultValidation
vaultName stringVaultName is the name of the Azure Key Vault.MinLength: 1
keyName stringKeyName is the name of the key in the Azure Key Vault.MinLength: 1
tenantID stringTenantID is the Azure tenant ID.Optional: {}
clientID stringClientID is the Azure client ID.Optional: {}
clientSecret stringClientSecret is the Azure client secret.
Note: It is strongly recommended to use CredentialsSecretRef or Managed Service Identity instead.
Optional: {}
resource stringResource is the Azure AD resource endpoint.
For Managed HSM, this should usually be “managedhsm.azure.net”.
Optional: {}
environment stringEnvironment is the Azure environment (e.g., “AzurePublicCloud”, “AzureUSGovernmentCloud”).Optional: {}
authMethod stringAuthMethod selects how the seal authenticates to Azure, rendered as the
seal’s auth_method. When empty, OpenBao chooses: a client ID without a
client secret selects managed_identity, which uses the instance metadata
service. Set workload_identity for Azure Workload Identity, where the
workload identity webhook also injects AZURE_CLIENT_ID.
Enum: [workload_identity managed_identity client_secret environment default]
Optional: {}

AzureTargetConfig

AzureTargetConfig holds Azure Blob Storage specific configuration.

Appears in:

FieldDescriptionDefaultValidation
storageAccount stringStorageAccount is the Azure storage account name.
Required when using Azure provider.
MinLength: 1
container stringContainer is a compatibility alias for Bucket. A nonempty value takes
precedence over Bucket. Use Bucket alone for new configurations.
Optional: {}

BackendTLSConfig

BackendTLSConfig configures BackendTLSPolicy for Gateway API.

Appears in:

FieldDescriptionDefaultValidation
enabled booleanEnabled controls whether the Operator creates a BackendTLSPolicy.
When true (default when Gateway is enabled), the Operator creates a BackendTLSPolicy
that enables HTTPS and certificate validation for backend connections.
When false, no BackendTLSPolicy is created and the Gateway will use HTTP (or rely on
external configuration for TLS).
Hardened clusters reject backendTLS.enabled=false.
trueOptional: {}
hostname stringHostname is the hostname to verify in the backend certificate.
If not specified, defaults to the stable TLS server name used by operator-managed
clients (for example, openbao-cluster-<cluster-name>.local).
This must match a DNS SAN in the backend certificate.
Optional: {}

BackupRetention

BackupRetention defines retention policy for backups.

Appears in:

FieldDescriptionDefaultValidation
maxCount integerMaxCount is the maximum number of backups to retain (0 = unlimited).Minimum: 0
Optional: {}
maxAge stringMaxAge is the maximum age of backups to retain, e.g., “168h” for 7 days.
Backups older than this are deleted after successful new backup upload.
Optional: {}

BackupRetentionOutcome

Underlying type: string

BackupRetentionOutcome separates cleanup results from snapshot results.

Validation:

  • Enum: [Succeeded Failed Skipped]

Appears in:

FieldDescription
Succeeded
Failed
Skipped

BackupRetentionResult

BackupRetentionResult is the last independently observed cleanup outcome.

Appears in:

FieldDescriptionDefaultValidation
sourceJobUID UID
name string
key stringKey identifies the successful snapshot that triggered this attempt.
startedAt Time
finishedAt Time
outcome BackupRetentionOutcomeEnum: [Succeeded Failed Skipped]
reason stringReason is a stable reason code. Message describes the outcome and next action.
message string
deletedByCount integerDeletedByCount and DeletedByAge count confirmed successful batch deletions.
A failed batch can have partial effects; its unknown partial count is not reported as success.
Minimum: 0
deletedByAge integerMinimum: 0

BackupRetentionRun

BackupRetentionRun records the immutable deletion boundary and workload identity.

Appears in:

FieldDescriptionDefaultValidation
name stringName is the deterministic retention Job name.
uid UIDUID binds the observed Job. Absence after submission is uncertain, not permission to retry.Optional: {}
sourceJobName stringSourceJobName identifies the successful scheduled backup Job.
sourceJobUID UIDSourceJobUID pins the successful backup Job.
generation integerGeneration pins the source configuration used by the backup Job.
key stringKey protects the last successful snapshot throughout retention.
prefix stringPrefix confines deletion to scheduled snapshots directly under this cluster prefix.
restoreTestKey stringRestoreTestKey protects a previously reserved restore-test snapshot.Optional: {}
policy BackupRetentionPolicy is the frozen retention policy.
startedAt TimeStartedAt records reservation time.
deadlineAt TimeDeadlineAt is the absolute worker deadline, including time spent awaiting submission.
submittedAt TimeSubmittedAt records the single permitted Create attempt before the API call.Optional: {}

BackupRetentionStatus

BackupRetentionStatus holds one active workload and one last result.

Appears in:

FieldDescriptionDefaultValidation
active BackupRetentionRunActive pins the retention plan until its workload has stopped.Optional: {}
last BackupRetentionResultLast records the last finished or skipped retention attempt.Optional: {}
conditions Condition arrayConditions report retention progress independently of snapshot success.Optional: {}

BackupSchedule

BackupSchedule defines when and where snapshots are stored.

Appears in:

FieldDescriptionDefaultValidation
restoreTest RestoreTestRestoreTest periodically restores the latest successful snapshot into a disposable target.Optional: {}
schedule stringSchedule is a cron-style schedule, for example “0 3 * * *”.MinLength: 1
target BackupTargetTarget is the object storage configuration for backups.
jwtAuthRole stringJWTAuthRole is the name of the JWT Auth role configured in OpenBao
for backup operations. When set, the backup executor will use JWT Auth
(projected ServiceAccount token) instead of a static token. This is the preferred authentication
method as tokens are automatically rotated by Kubernetes.
The role must be configured in OpenBao and must grant the “read” capability on
sys/storage/raft/snapshot. The role must bind to the backup ServiceAccount
(<cluster-name>-backup-serviceaccount) in the cluster namespace.
If OIDC is enabled in SelfInit and this field is empty, a default role
named “openbao-operator-backup” will be assumed/created.
Optional: {}
tokenSecretRef LocalObjectReferenceTokenSecretRef references a Secret containing an OpenBao API token to use
for backup operations when JWT Auth is not effective.
The Secret must exist in the same namespace as the OpenBaoCluster.
Cross-namespace references are not allowed for security reasons.
If an effective JWT role exists through JWTAuthRole or the SelfInit OIDC
default, this field is ignored in favor of JWT Auth. Otherwise this field
is required and must reference a token with permission to read
sys/storage/raft/snapshot. The operator does not infer or fall back to a
<cluster>-root-token Secret.
Optional: {}
retention BackupRetentionRetention defines optional backup retention policy.Optional: {}
image stringImage is the container image to use for backup operations.
If not specified, OPERATOR_BACKUP_IMAGE can supply a complete image reference, including a digest.
Otherwise, defaults to “<repo>:X.Y.Z” where <repo> is derived from OPERATOR_BACKUP_IMAGE_REPOSITORY
(default: “ghcr.io/kubebao/openbao-backup”) and the tag matches OPERATOR_VERSION.
This allows users to override the image for air-gapped environments or custom registries.
Optional: {}

BackupSnapshotSummary

BackupSnapshotSummary is the latest successful executor’s bounded observation. Identity and version are observed before and after streaming the snapshot.

Appears in:

FieldDescriptionDefaultValidation
digest stringDigest is sha256: followed by the lowercase digest of the uploaded snapshot.Pattern: ^sha256:[a-f0-9]\{64\}$
clusterID stringClusterID is the source native cluster ID observed during the backup.MaxLength: 128
version stringVersion is the source OpenBao version observed during the backup.MaxLength: 64
size integerSize is the snapshot size in bytes.Maximum: 8.589934592e+09
Minimum: 1

BackupStatus

BackupStatus tracks the state of backups for a cluster.

Appears in:

FieldDescriptionDefaultValidation
retention BackupRetentionStatusRetention stores the active cleanup workload and its last independent outcome.Optional: {}
successfulBackups integerSuccessfulBackups counts newly observed successful backup Jobs.Optional: {}
latestSnapshot BackupSnapshotSummaryLatestSnapshot contains the latest executor’s source observation.Optional: {}
restoreTest RestoreTestStatusRestoreTest stores one active run and one last result.Optional: {}
lastBackupTime TimeLastBackupTime is the timestamp of the last successful backup.Optional: {}
lastAttemptTime TimeLastAttemptTime is the timestamp of the last backup attempt, regardless of outcome.
This is used to avoid retry loops when a scheduled backup fails.
Optional: {}
lastAttemptScheduledTime TimeLastAttemptScheduledTime is the scheduled time of the last backup attempt.
It is derived from the cron schedule and used to ensure at-most-once execution
per scheduled window.
Optional: {}
lastHandledManualTrigger stringLastHandledManualTrigger is the last observed manual trigger token that
has progressed into an actual backup attempt.
Optional: {}
lastBackupSize integerLastBackupSize is the size in bytes of the last successful backup.Optional: {}
lastBackupDuration stringLastBackupDuration is how long the last backup took (e.g., “45s”).Optional: {}
lastBackupName stringLastBackupName is the object key/path of the last successful backup.Optional: {}
nextScheduledBackup TimeNextScheduledBackup is when the next backup is scheduled.Optional: {}
consecutiveFailures integerConsecutiveFailures is the number of consecutive backup failures.Optional: {}
lastFailureReason stringLastFailureReason is the low-cardinality reason code for the last backup failure (if applicable).Optional: {}
lastFailureMessage stringLastFailureMessage is the detailed message for the last backup failure (if applicable).Optional: {}
lastFailureTime TimeLastFailureTime is when the last backup failure was recorded.Optional: {}

BackupTarget

BackupTarget describes a generic, cloud-agnostic object storage destination.

Appears in:

FieldDescriptionDefaultValidation
provider stringProvider selects the storage backend. Defaults to “s3” for backward compatibility.s3Enum: [s3 gcs azure]
Optional: {}
endpoint stringEndpoint is the HTTP(S) endpoint for the object storage service.
For S3: Required (e.g., “https://s3.amazonaws.com” or MinIO endpoint).
For GCS: Optional (defaults to googleapis.com).
For Azure: Optional (derived from StorageAccount if not specified).
Optional: {}
bucket stringBucket is the bucket or container name for every provider. For Azure, a
nonempty azure.container compatibility alias takes precedence.
MinLength: 1
pathPrefix stringPathPrefix is an optional prefix within the bucket for this cluster’s snapshots.Optional: {}
credentialsSecretRef LocalObjectReferenceCredentialsSecretRef optionally references a Secret containing credentials for the object store.
The Secret must exist in the same namespace as the owning OpenBao resource.
Cross-namespace references are not allowed for security reasons.
For S3: Expected keys are “accessKeyId” and “secretAccessKey” (optional: “sessionToken”, “region”, “caCert”).
For GCS: Expected key is “credentials.json” containing a service account JSON key.
For Azure: Expected keys are “accountKey” or “connectionString”.
Hardened clusters require an explicit storage identity path: credentialsSecretRef,
workloadIdentity metadata, or the effective S3 roleArn. Omitting those paths relies
on ambient/default credentials and is rejected for Hardened clusters.
Optional: {}
workloadIdentity WorkloadIdentityConfigWorkloadIdentity optionally applies provider-specific metadata required by cloud workload identity integrations.
Use this for ambient identity setups such as EKS Pod Identity or IRSA, GKE Workload Identity, or Azure Workload Identity.
When omitted, backup and restore workloads can still use any credentials exposed through the pod’s default provider chain.
Hardened clusters reject that ambient/default path unless credentialsSecretRef is set,
workloadIdentity metadata is present, or an S3 target uses the effective roleArn.
Optional: {}
partSize integerPartSize is the size of each part in multipart uploads (in bytes).
Defaults to 10MB (10485760 bytes). Larger values may improve performance for large snapshots
on fast networks, while smaller values may be better for slow or unreliable networks.
10485760Minimum: 5.24288e+06
Optional: {}
concurrency integerConcurrency is the number of concurrent parts to upload during multipart uploads.
Defaults to 3. Higher values may improve throughput on fast networks but increase
memory usage and may overwhelm slower storage backends.
3Maximum: 10
Minimum: 1
Optional: {}
s3 S3TargetConfigS3 groups S3-specific configuration. Each configured field takes precedence
over its top-level compatibility field. Omitted fields use the top-level value.
Only used when Provider is “s3”.
Optional: {}
region stringRegion is the AWS region to use for S3-compatible clients.
For AWS, this should match the bucket region (for example, “eu-west-1”).
For many S3-compatible stores (MinIO/Ceph), this can be any non-empty value.
Only used when Provider is “s3”.
Compatibility field: use s3.region for new configurations.
us-east-1Optional: {}
roleArn stringRoleARN is the IAM role ARN (or S3-compatible equivalent) to assume via Web Identity.
When set, backup and restore Jobs mount a projected ServiceAccount token and set the
AWS Web Identity environment variables explicitly.
Only used when Provider is “s3”.
Outside Hardened S3 targets, leave this empty when relying on ambient workload identity
or provider-managed default credentials instead. For Hardened S3 targets, roleArn is
one accepted explicit identity path. It does not satisfy Hardened identity requirements
for GCS or Azure.
Compatibility field: use s3.roleArn for new configurations.
Optional: {}
usePathStyle booleanUsePathStyle controls whether to use path-style addressing (s3.amazonaws.com/bucket/object)
or virtual-hosted-style addressing (bucket.s3.amazonaws.com/object).
Set to true for MinIO and S3-compatible stores that require path-style.
Set to false for AWS S3 (default, as AWS is deprecating path-style).
Only used when Provider is “s3”.
Compatibility field: use s3.usePathStyle for new configurations.
falseOptional: {}
gcs GCSTargetConfigGCS contains Google Cloud Storage specific configuration.
Only used when Provider is “gcs”.
Optional: {}
azure AzureTargetConfigAzure contains Azure Blob Storage specific configuration.
Only used when Provider is “azure”.
Optional: {}
insecureSkipVerify booleanInsecureSkipVerify allows skipping TLS verification (useful for MinIO/LocalStack/Azurite with self-signed certs).
This applies to all providers that support TLS.
Hardened clusters reject insecureSkipVerify.
Optional: {}

BlueGreenConfig

BlueGreenConfig configures the behavior when Type is BlueGreen.

Appears in:

FieldDescriptionDefaultValidation
autoPromote booleanAutoPromote controls whether newly started blue/green upgrades
automatically switch traffic and delete the old cluster after sync.
If false when an upgrade starts, that upgrade stays in the Syncing
phase waiting for an explicit promotion request via spec.upgrade.requests.promote.
Changing this field while an upgrade is already in progress affects only
future upgrades.
true
verification VerificationConfigVerificationConfig allows defining custom health checks before promotion.Optional: {}
maxJobFailures integerMaxJobFailures is the maximum consecutive job failures before aborting/rolling back.
Defaults to 5 if not specified.
5Minimum: 1
Optional: {}
preUpgradeSnapshot booleanPreUpgradeSnapshot triggers a backup at the start of an upgrade.
Creates a recovery point before any changes are made.
Requires spec.backup to be configured.
Optional: {}
autoRollback AutoRollbackConfigAutoRollback configures automatic rollback behavior.Optional: {}

BlueGreenPhase

Underlying type: string

BlueGreenPhase is a high-level summary of blue/green upgrade state.

Validation:

  • Enum: [Idle DeployingGreen JoiningMesh Syncing Promoting DemotingBlue Cleanup RestoringReadReplicas RollingBack RollbackCleanup]

Appears in:

FieldDescription
IdlePhaseIdle indicates no blue/green upgrade is in progress.
DeployingGreenPhaseDeployingGreen indicates the Green StatefulSet is being created and pods are becoming ready.
This phase includes waiting for pods to be unsealed.
JoiningMeshPhaseJoiningMesh indicates Green pods are joining the Raft cluster as non-voters.
SyncingPhaseSyncing indicates waiting for Green nodes to catch up with Blue nodes.
PromotingPhasePromoting indicates Green nodes are being promoted to voters.
DemotingBluePhaseDemotingBlue indicates Blue nodes are being demoted to non-voters.
CleanupPhaseCleanup indicates Blue StatefulSet is being deleted.
RestoringReadReplicasPhaseRestoringReadReplicas indicates the steady-state read-replica pool is
being restored after cutover cleanup and must converge before the upgrade
returns to Idle.
RollingBackPhaseRollingBack indicates the upgrade is being rolled back.
Blue nodes are re-promoted and Green nodes are demoted.
RollbackCleanupPhaseRollbackCleanup indicates Green StatefulSet is being deleted after rollback.

BlueGreenStatus

BlueGreenStatus tracks the lifecycle of the “Green” revision during blue/green upgrades.

Appears in:

FieldDescriptionDefaultValidation
phase BlueGreenPhasePhase is the current phase of the blue/green upgrade.Enum: [Idle DeployingGreen JoiningMesh Syncing Promoting DemotingBlue Cleanup RestoringReadReplicas RollingBack RollbackCleanup]
operationID stringOperationID identifies the current blue/green upgrade attempt.Optional: {}
blueRevision stringBlueRevision is the hash/name of the currently active cluster.
blueControllerRevision stringBlueControllerRevision is the Kubernetes StatefulSet controller revision
of Blue. It identifies an unrevisioned rolling workload after switching to
BlueGreen without requiring the existing Pods to be restarted or relabeled.
Optional: {}
blueImage stringBlueImage is the container image used by the Blue cluster.
This ensures the Blue cluster is not actively upgraded when spec.image changes.
blueReplicas integerBlueReplicas is the voter population captured when the upgrade starts.
It remains fixed until Green becomes the stable workload.
Minimum: 1
Optional: {}
greenImage stringGreenImage is the image selected for the in-flight target.Optional: {}
greenVersion stringGreenVersion is the version selected for the in-flight target.Optional: {}
greenReplicas integerGreenReplicas is the replica count selected for the in-flight target.Minimum: 1
Optional: {}
greenRevision stringGreenRevision is the hash/name of the next cluster (if upgrade in progress).
manualPromotionRequired booleanManualPromotionRequired snapshots whether the current in-flight blue/green
upgrade requires an explicit spec.upgrade.requests.promote request before
promotion can proceed. It is derived from spec.upgrade.blueGreen.autoPromote
when the upgrade starts.
Optional: {}
startTime TimeStartTime is when the current phase began.
jobFailureCount integerJobFailureCount tracks consecutive job failures in the current phase.
Reset to 0 on phase transition or successful job completion.
Optional: {}
lastJobFailure stringLastJobFailure records the name of the last failed job for debugging.Optional: {}
preUpgradeSnapshotJobName stringPreUpgradeSnapshotJobName is the name of the backup job triggered at upgrade start.Optional: {}
validationHook BlueGreenValidationHookStatusValidationHook records the expected identity and durable execution receipts
for the current pre-promotion validation hook.
Optional: {}
rollbackReason stringRollbackReason records why a rollback was triggered (if any).Optional: {}
rollbackStartTime TimeRollbackStartTime is when the rollback was initiated.Optional: {}
rollbackAttempt integerRollbackAttempt increments each time rollback automation is retried.
It is used to produce stable, deterministic Job names per attempt.
Optional: {}

BlueGreenValidationHookResult

Underlying type: string

BlueGreenValidationHookResult is the persisted terminal result of a pre-promotion validation hook Job.

Validation:

  • Enum: [Succeeded Failed]

Appears in:

FieldDescription
SucceededBlueGreenValidationHookResultSucceeded indicates that the validation hook
Job succeeded.
FailedBlueGreenValidationHookResultFailed indicates that the validation hook Job
failed.

BlueGreenValidationHookStage

Underlying type: string

BlueGreenValidationHookStage identifies the durable execution boundary reached by a pre-promotion validation hook.

Validation:

  • Enum: [Prepared Committed Created TerminalObserved Unknown]

Appears in:

FieldDescription
PreparedBlueGreenValidationHookStagePrepared indicates that the expected Job
identity is durable, but Job creation has not been committed.
CommittedBlueGreenValidationHookStageCommitted indicates that the controller
durably committed to one Job creation attempt. A missing Job after this
point is ambiguous and is not recreated automatically.
CreatedBlueGreenValidationHookStageCreated indicates that the controller
persisted the created Job identity.
TerminalObservedBlueGreenValidationHookStageTerminalObserved indicates that the controller
persisted the terminal Job result.
UnknownBlueGreenValidationHookStageUnknown indicates that the controller cannot
prove whether the committed validation hook ran.

BlueGreenValidationHookStatus

BlueGreenValidationHookStatus records the expected identity and durable receipts for one pre-promotion validation hook execution.

Appears in:

FieldDescriptionDefaultValidation
operationID stringOperationID identifies the blue/green upgrade attempt that owns this hook.
greenRevision stringGreenRevision identifies the Green revision validated by this hook.
specHash stringSpecHash identifies the normalized validation hook specification.
stage BlueGreenValidationHookStageStage is the latest durable execution boundary observed by the controller.Enum: [Prepared Committed Created TerminalObserved Unknown]
jobName stringJobName is the expected validation hook Job name.
jobUID UIDJobUID is the UID returned for the created validation hook Job.Optional: {}
preparedAt TimePreparedAt is when the expected hook identity became durable.Optional: {}
committedAt TimeCommittedAt is when the controller committed to one Job creation attempt.Optional: {}
createdAt TimeCreatedAt is when the controller persisted the created Job receipt.Optional: {}
terminalResult BlueGreenValidationHookResultTerminalResult is the persisted terminal Job result.Enum: [Succeeded Failed]
Optional: {}
terminalObservedAt TimeTerminalObservedAt is when the controller persisted the terminal Job result.Optional: {}

BreakGlassReason

Underlying type: string

BreakGlassReason describes why the operator required manual intervention.

Validation:

  • Enum: [RollbackConsensusRepairFailed RollbackCleanupPeerRemovalFailed]

Appears in:

FieldDescription
RollbackConsensusRepairFailed
RollbackCleanupPeerRemovalFailed

BreakGlassStatus

BreakGlassStatus captures safe-mode / break-glass state and recovery guidance.

Appears in:

FieldDescriptionDefaultValidation
active booleanActive indicates whether break glass mode is currently active.Optional: {}
reason BreakGlassReasonReason is a stable, typed reason for entering break glass mode.Enum: [RollbackConsensusRepairFailed RollbackCleanupPeerRemovalFailed]
Optional: {}
message stringMessage provides a short summary of the detected unsafe state.Optional: {}
nonce stringNonce is the acknowledgment token required to resume automation.Optional: {}
enteredAt TimeEnteredAt is when break glass mode became active.Optional: {}
steps string arraySteps provides deterministic recovery guidance.Optional: {}
acknowledgedAt TimeAcknowledgedAt records when break glass was acknowledged.Optional: {}

ClusterOperation

Underlying type: string

ClusterOperation identifies a mutually-exclusive operator operation.

Validation:

  • Enum: [Upgrade Backup Restore]

Appears in:

FieldDescription
Upgrade
Backup
Restore

ClusterPhase

Underlying type: string

ClusterPhase is a high-level summary of cluster state.

Validation:

  • Enum: [Initializing Running Upgrading BackingUp Failed]

Appears in:

FieldDescription
Initializing
Running
Upgrading
BackingUp
Failed

ClusterRestoreStatus

ClusterRestoreStatus retains restart observations from earlier operator releases. New restores report status, including managed restarts, on OpenBaoRestore.

Appears in:

FieldDescriptionDefaultValidation
name stringName identifies the OpenBaoRestore recorded by an earlier release.Optional: {}
uid stringUID identifies the OpenBaoRestore recorded by an earlier release.Optional: {}
restartCompletedAt TimeRestartCompletedAt is the legacy timestamp for a controller-observed voter
restart. Administrator-led recovery does not update this field.
Optional: {}

ControllerErrorStatus

ControllerErrorStatus captures a controller-scoped error signal that the status controller can translate into high-level conditions.

Appears in:

FieldDescriptionDefaultValidation
reason stringReason is a low-cardinality identifier for the error.Optional: {}
message stringMessage is a human-readable error message (best-effort).Optional: {}
at TimeAt is when the error was observed (best-effort).Optional: {}

ControllerJWTMode

Underlying type: string

ControllerJWTMode selects shared or target-specific controller credentials.

Validation:

  • Enum: [Shared Target]

Appears in:

FieldDescription
SharedControllerJWTModeShared uses the installation’s projected ServiceAccount JWT.
TargetControllerJWTModeTarget requests a JWT for this OpenBaoCluster’s UID.

DeletionPolicy

Underlying type: string

DeletionPolicy defines what happens to underlying resources when the CR is deleted.

Validation:

  • Enum: [Retain DeletePVCs DeleteAll]

Appears in:

FieldDescription
RetainDeletionPolicyRetain removes operator-managed compute and keeps PVCs and external backups.
DeletePVCsDeletionPolicyDeletePVCs removes operator-managed compute and PVCs, but retains external backups.
DeleteAllDeletionPolicyDeleteAll removes operator-managed compute and PVCs, but retains external object-store backups.

FileAuditOptions

FileAuditOptions configures options for file audit devices. See: https://openbao.org/docs/audit/file/

Appears in:

FieldDescriptionDefaultValidation
filePath stringFilePath is the path to where the audit log will be written.
Special keywords: “stdout” writes to standard output, “discard” discards output.
MinLength: 1
mode stringMode is a string containing an octal number representing the bit pattern for the file mode.
Defaults to “0600” if not specified. Set to “0000” to prevent OpenBao from modifying the file mode.
Optional: {}

GCPCloudKMSSealConfig

GCPCloudKMSSealConfig configures the GCP Cloud KMS seal type. See: https://openbao.org/docs/configuration/seal/gcpckms/

Appears in:

FieldDescriptionDefaultValidation
project stringProject is the GCP project ID.MinLength: 1
region stringRegion is the GCP region where the key ring lives.MinLength: 1
keyRing stringKeyRing is the name of the GCP KMS key ring.MinLength: 1
cryptoKey stringCryptoKey is the name of the GCP KMS crypto key.MinLength: 1
credentials stringCredentials is the path to the GCP credentials JSON file.
Note: It is strongly recommended to use CredentialsSecretRef or Workload Identity instead.
Optional: {}

GCSTargetConfig

GCSTargetConfig holds Google Cloud Storage specific configuration.

Appears in:

FieldDescriptionDefaultValidation
project stringProject is the GCP project ID. Optional if using ADC with default project or
if the credentials JSON includes the project.
Optional: {}

GatewayConfig

GatewayConfig configures Kubernetes Gateway API access for the OpenBao cluster. This is an alternative to Ingress for external access, using the more modern and expressive Gateway API.

Appears in:

FieldDescriptionDefaultValidation
enabled booleanEnabled activates Gateway API support for this cluster.
When true, the Operator creates an HTTPRoute for the cluster.
listenerName stringListenerName optionally targets a specific listener (sectionName) on the referenced Gateway.
When set, the generated Route (HTTPRoute or TLSRoute) attaches only to that listener.
This is useful when a Gateway exposes multiple listeners for the same hostname (e.g. Traefik
“web” and “websecure”) and you want deterministic attachment.
Optional: {}
gatewayRef GatewayReferenceGatewayRef references an existing Gateway resource that will handle
traffic for this OpenBao cluster. The Gateway must already exist.
hostname stringHostname for routing traffic to this OpenBao cluster.
This hostname will be automatically added to the TLS SANs.
MinLength: 1
path stringPath prefix for the HTTPRoute (defaults to “/”).Optional: {}
annotations object (keys:string, values:string)Annotations to apply to the HTTPRoute resource.Optional: {}
backendTLS BackendTLSConfigBackendTLS configures BackendTLSPolicy for end-to-end TLS between the Gateway and OpenBao.
When enabled, the Operator creates a BackendTLSPolicy that configures the Gateway to use
HTTPS when communicating with the OpenBao backend service and validates the backend
certificate using the cluster’s CA certificate.
Optional: {}
tlsPassthrough booleanTLSPassthrough enables TLS passthrough mode using TLSRoute instead of HTTPRoute.
When true, the Operator creates a TLSRoute that routes encrypted TLS traffic based on SNI
without terminating TLS at the Gateway. OpenBao terminates TLS directly.
When false (default), the Operator creates an HTTPRoute with TLS termination at the Gateway.
Note: TLSRoute and HTTPRoute are mutually exclusive - only one can be used per cluster.
BackendTLSPolicy is not needed when TLSPassthrough is enabled since the Gateway does not
decrypt traffic. The Gateway listener must be configured with protocol: TLS and mode: Passthrough.
Optional: {}

GatewayReference

GatewayReference identifies a Gateway resource.

Appears in:

FieldDescriptionDefaultValidation
name stringName of the Gateway resource.MinLength: 1
namespace stringNamespace of the Gateway resource. If empty, uses the OpenBaoCluster namespace.Optional: {}

HTTPAuditOptions

HTTPAuditOptions configures options for HTTP audit devices. See: https://openbao.org/docs/audit/http/

Appears in:

FieldDescriptionDefaultValidation
uri stringURI is the URI of the remote server where the audit logs will be written.MinLength: 1
headers JSONHeaders is a JSON object describing headers. Must take the shape map[string][]string,
i.e., an object of headers, with each having one or more values.
Headers without values will be ignored. The operator renders this object as OpenBao’s
expected JSON-encoded options.headers string.
Optional: {}

ImageVerificationConfig

ImageVerificationConfig configures supply chain security checks for container images. When enabled, verification applies to all operator-managed images for this cluster (StatefulSets, Deployments, and Jobs).

Appears in:

FieldDescriptionDefaultValidation
enabled booleanEnabled controls whether image verification is enforced.
publicKey stringPublicKey is the Cosign public key content used to verify the signature.
Required for static key verification. If empty, keyless verification will be used
(requires Issuer and Subject to be set).
Optional: {}
issuer stringIssuer is the OIDC issuer for keyless verification (e.g., https://token.actions.githubusercontent.com).
Required for keyless verification when PublicKey is not provided.
For GitHub Actions keyless verification, use: https://token.actions.githubusercontent.com
Optional: {}
subject stringSubject is the OIDC subject for keyless verification.
Required for keyless verification when PublicKey is not provided.
Example (GitHub Actions): https://github.com/kubebao/openbao-operator/.github/workflows/release.yml@refs/tags/<VERSION>
The version in the subject MUST match the image tag version.
Optional: {}
issuerRegExp stringIssuerRegExp is a regular expression for the OIDC issuer when using keyless verification.
Use this to allow a controlled set of issuers instead of a single exact issuer string.
Requires SubjectRegExp when PublicKey is not provided.
Optional: {}
subjectRegExp stringSubjectRegExp is a regular expression for the OIDC subject when using keyless verification.
Use this to allow a controlled set of workflow identities instead of a single exact subject.
Requires IssuerRegExp when PublicKey is not provided.
Optional: {}
failurePolicy stringFailurePolicy defines behavior on verification failure.
“Block” blocks reconciliation of the affected workload when verification fails.
“Warn” logs an error and emits a Kubernetes Event but proceeds.
BlockEnum: [Warn Block]
ignoreTlog booleanIgnoreTlog controls whether to verify against the Rekor transparency log.
When false (default), signatures are verified against Rekor for non-repudiation.
When true, only signature verification is performed without transparency log checks.
falseOptional: {}
imagePullSecrets LocalObjectReference arrayImagePullSecrets is a list of references to secrets in the same namespace
to use for pulling images from private registries during verification.
These secrets must be of type kubernetes.io/dockerconfigjson or kubernetes.io/dockercfg.
Optional: {}

IngressConfig

IngressConfig controls optional HTTP(S) ingress in front of the OpenBao Service.

Appears in:

FieldDescriptionDefaultValidation
enabled booleanEnabled controls whether the Operator manages an Ingress for external access.Optional: {}
className stringClassName is an optional IngressClassName (for example, “nginx”, “traefik”).Optional: {}
host stringHost is the primary host for external access, for example “bao.example.com”.MinLength: 1
path stringPath is the HTTP path to route to OpenBao, defaulting to “/”.Optional: {}
pathType IngressPathTypePathType identifies how the ingress controller should interpret Path.PrefixEnum: [Prefix Exact ImplementationSpecific]
Optional: {}
tlsSecretName stringTLSSecretName is an optional TLS Secret name; when empty the cluster TLS Secret is used.Optional: {}
annotations object (keys:string, values:string)Annotations are additional annotations to apply to the Ingress.Optional: {}
readinessMode IngressReadinessModeReadinessMode identifies when the operator should consider ingress
integration ready for endpoint publication.
LoadBalancerPublishedEnum: [Created LoadBalancerPublished]
Optional: {}

IngressPathType

Underlying type: string

IngressPathType identifies how a Kubernetes Ingress path should match requests.

Validation:

  • Enum: [Prefix Exact ImplementationSpecific]

Appears in:

FieldDescription
PrefixIngressPathTypePrefix uses prefix path matching.
ExactIngressPathTypeExact uses exact path matching.
ImplementationSpecificIngressPathTypeImplementationSpecific defers path matching to the controller.

IngressReadinessMode

Underlying type: string

IngressReadinessMode identifies how the operator decides whether ingress integration is ready for endpoint publication.

Validation:

  • Enum: [Created LoadBalancerPublished]

Appears in:

FieldDescription
CreatedIngressReadinessModeCreated considers ingress integration ready once the
managed Ingress object exists.
LoadBalancerPublishedIngressReadinessModeLoadBalancerPublished considers ingress integration
ready only after the managed Ingress reports a published load balancer
address in status.

InitContainerConfig

InitContainerConfig configures the init container used to render OpenBao configuration. The init container is responsible for rendering the final config.hcl from a template using environment variables such as HOSTNAME and POD_IP.

The operator relies on this init container to render config.hcl at runtime. Disabling the init container is not supported and will be rejected by validation.

Appears in:

FieldDescriptionDefaultValidation
enabled booleanEnabled controls whether the init container is used to render the configuration.
The operator requires the init container; disabling it is not supported.
trueOptional: {}
image stringImage is the container image to use for the init container.
If not specified, OPERATOR_INIT_IMAGE can supply a complete image reference, including a digest.
Otherwise, defaults to “<repo>:X.Y.Z” where <repo> is derived from OPERATOR_INIT_IMAGE_REPOSITORY
(default: “ghcr.io/kubebao/openbao-init”) and the tag matches OPERATOR_VERSION.
Optional: {}

InitialRecoveryKeysConfig

InitialRecoveryKeysConfig declares the first recovery-key set that OpenBao should create through the authenticated recovery-key rotation endpoint during self-initialization.

The Operator always renders this request with backup=true so encrypted recovery shares can be retrieved through OpenBao’s recovery backup endpoint after bootstrap. Decrypted recovery shares must stay outside Kubernetes and outside the Operator.

Appears in:

FieldDescriptionDefaultValidation
shares integerShares is the total number of recovery-key shares to create.Maximum: 255
Minimum: 1
threshold integerThreshold is the number of recovery-key shares required for recovery
operations such as generate-root.
Maximum: 255
Minimum: 1
recipients RecoveryKeyRecipient arrayRecipients lists the public OpenPGP recipients for encrypted recovery
shares. Each recipient is passed to OpenBao as one pgp_keys entry; use
fingerprints for custody mapping instead of relying on share numbering.
MaxItems: 255
MinItems: 1

KMIPSealConfig

KMIPSealConfig configures the KMIP seal type. See: https://openbao.org/docs/configuration/seal/kmip/

Appears in:

FieldDescriptionDefaultValidation
endpoint stringEndpoint is the KMIP server endpoint.MinLength: 1
kmsKeyID stringKMSKeyID is the unique identifier of the KMIP key to use.MinLength: 1
clientCert stringClientCert is the path to the client certificate used for KMIP communication.MinLength: 1
clientKey stringClientKey is the path to the private key used for KMIP communication.MinLength: 1
caCert stringCACert is the path to the CA certificate for KMIP communication.Optional: {}
serverName stringServerName is the TLS server name to use when connecting to the KMIP endpoint.Optional: {}
timeout integerTimeout is the timeout in seconds for KMIP requests.Minimum: 1
Optional: {}
encryptAlg stringEncryptAlg is the encryption algorithm used for KMIP requests.Enum: [AES_GCM RSA_OAEP_SHA256 RSA_OAEP_SHA384 RSA_OAEP_SHA512]
Optional: {}
tls12Ciphers stringTLS12Ciphers configures the TLS 1.2 cipher suites to use when connecting
to the KMIP endpoint.
Optional: {}
disabled booleanDisabled disables this seal configuration, for example during seal migration.Optional: {}

KMSPluginSealConfig

KMSPluginSealConfig configures a plugin-backed KMS seal. The referenced plugin must be declared in spec.plugins with type “kms”.

Appears in:

FieldDescriptionDefaultValidation
pluginName stringPluginName is the name of the plugin registered through a matching
plugin “kms” stanza. OpenBao uses this value as the seal stanza label.
MinLength: 1
config object (keys:string, values:string)Config contains plugin-specific seal configuration rendered as string
attributes inside seal “<pluginName>”. Keys must be valid HCL identifiers.
Values are stored in the OpenBaoCluster resource; use file paths to
credentialsSecretRef-mounted files for sensitive material instead of inline
secrets.
MaxProperties: 64
Optional: {}

KubernetesServiceAccountSubject

Underlying type: string

KubernetesServiceAccountSubject is the exact subject claim in a projected Kubernetes ServiceAccount token.

Validation:

  • MaxLength: 340
  • Pattern: ^system:serviceaccount:[a-z0-9]([-a-z0-9]*[a-z0-9])?:[a-z0-9]([-a-z0-9.]*[a-z0-9])?$

Appears in:

ListenerConfig

ListenerConfig allows tuning the API and metrics TCP listeners.

Appears in:

FieldDescriptionDefaultValidation
tlsDisable booleanTLSDisable controls TLS on the listener.
Note: This is typically managed by the operator based on spec.tls.enabled.
Hardened clusters reject tlsDisable=true.
Optional: {}
tlsMinVersion TLSVersionTLSMinVersion sets the minimum TLS version on the API and metrics listeners.
If omitted, OpenBao uses TLS 1.2. TLS must be enabled.
Enum: [tls12 tls13]
Optional: {}
tlsMaxVersion TLSVersionTLSMaxVersion sets the maximum TLS version on the API and metrics listeners.
If omitted, OpenBao uses TLS 1.3. TLS must be enabled.
Enum: [tls12 tls13]
Optional: {}
tlsKeyExchangePreferences TLSKeyExchangeGroup arrayTLSKeyExchangePreferences selects allowed key exchange groups on the API
and metrics listeners. List order does not control preference; Go uses its
internal preference order. If omitted, OpenBao uses Go’s default groups.
Requires OpenBao >= 2.7.0 and TLS enabled. A list containing only hybrid PQ
groups requires TLSMinVersion=tls13 and rejects classical-only clients.
This setting does not configure cluster traffic on port 8201.
Enum: [CurveP256 CurveP384 CurveP521 X25519 X25519MLKEM768 SecP256r1MLKEM768 SecP384r1MLKEM1024]
MaxItems: 7
MinItems: 1
Optional: {}
proxyProtocolBehavior stringProxyProtocolBehavior configures PROXY protocol on the API listener.
Supported values are use_always, allow_authorized, and deny_unauthorized.
The legacy allow_any value remains in the schema for compatibility but is
rejected by the operator. Use allow_authorized to trust selected proxies.
Enum: [use_always allow_any allow_authorized deny_unauthorized]
Optional: {}
proxyProtocolAuthorizedAddrs string arrayProxyProtocolAuthorizedAddrs lists trusted proxy source IP addresses or CIDRs.
Required for allow_authorized and deny_unauthorized. With allow_authorized,
connections from other sources use the peer IP address instead of PROXY metadata.
This setting applies only to the API listener, not the metrics listener.
MinItems: 1
items:MinLength: 1
Optional: {}

LoggingConfig

LoggingConfig allows configuring logging behavior for OpenBao.

Appears in:

FieldDescriptionDefaultValidation
format stringFormat specifies the log format.Enum: [standard json]
Optional: {}
file stringFile is the path to the log file.
If not specified, logs are written to stderr.
Optional: {}
rotateDuration stringRotateDuration specifies how often to rotate logs (e.g., “24h”, “7d”).Optional: {}
rotateBytes integerRotateBytes specifies the maximum size in bytes before rotating logs.Minimum: 0
Optional: {}
rotateMaxFiles integerRotateMaxFiles is the maximum number of rotated log files to keep.Minimum: 0
Optional: {}
pidFile stringPIDFile is the path to write the PID file.Optional: {}

MaintenanceConfig

MaintenanceConfig defines supported maintenance operations. This is intended to provide a first-class workflow for day-2 operations in clusters that enforce managed-resource mutation locks via admission policy.

Appears in:

FieldDescriptionDefaultValidation
enabled booleanEnabled enables maintenance mode for this cluster.
When true, the operator annotates managed resources (Pods/StatefulSet) with
openbao.org/maintenance=true to allow controlled restarts/deletes where
admission policies require an explicit maintenance signal.
Optional: {}

MetricsConfig

MetricsConfig configures metrics collection.

Appears in:

FieldDescriptionDefaultValidation
enabled booleanEnabled configures the OpenBao telemetry stanza and creates a ServiceMonitor.false
scrapeProfile stringScrapeProfile selects which OpenBao pods are targeted by generated scrape resources.
Active targets only the active OpenBao pod. AllNodes targets every OpenBao pod and
requires a dedicated metrics-only listener.
ActiveEnum: [Active AllNodes]
Optional: {}
metricsOnlyListener MetricsOnlyListenerConfigMetricsOnlyListener configures a dedicated listener for metrics scraping.
It is enabled automatically when scrapeProfile is AllNodes.
Optional: {}
serviceMonitor ServiceMonitorConfigServiceMonitor controls whether to create a Prometheus Operator ServiceMonitor.Optional: {}

MetricsOnlyListenerConfig

MetricsOnlyListenerConfig configures a dedicated metrics-only TCP listener.

Appears in:

FieldDescriptionDefaultValidation
enabled booleanEnabled controls whether to render the dedicated metrics-only listener.
When omitted, the listener is enabled automatically for the AllNodes scrape profile.
Optional: {}
port integerPort is the dedicated metrics listener port.8202Maximum: 65535
Minimum: 1
Optional: {}
unauthenticatedMetricsAccess booleanUnauthenticatedMetricsAccess allows unauthenticated access to /v1/sys/metrics
on the metrics-only listener. AllNodes scraping needs this so standby nodes can
expose metrics. Restrict this listener with NetworkPolicy.
Optional: {}

NetworkConfig

NetworkConfig configures network-related settings for the OpenBaoCluster.

Appears in:

FieldDescriptionDefaultValidation
apiServerEgress APIServerEgressConfigAPIServerEgress adds a CNI-specific Kubernetes API egress policy alongside
the standard NetworkPolicies. Omit this field for standard IP-based rules.
Optional: {}
apiServerCIDR stringAPIServerCIDR is an optional CIDR block for the Kubernetes API server.
When specified, this value is used instead of auto-detection for NetworkPolicy egress rules.
This is useful when you want an explicit allow-list (or when the in-cluster service VIP
injected into pods is unavailable/unusable in your environment).
Example: “10.43.0.0/16” for service network or “192.168.1.0/24” for control plane nodes.
Optional: {}
apiServerEndpointIPs string arrayAPIServerEndpointIPs is an optional list of Kubernetes API server endpoint IPs.
When set, the operator adds least-privilege NetworkPolicy egress rules for these IPs on port 6443.
Use this on CNI implementations where egress enforcement happens on the post-NAT
destination (the API server endpoint) rather than the kubernetes Service IP (10.43.0.1:443).
The operator does not auto-detect these endpoint IPs because doing so reliably requires broader
cluster permissions (list/watch). Configure this field explicitly when needed.
Example (k3d): [“192.168.166.2”]
Optional: {}
dnsNamespace stringDNSNamespace specifies the namespace where the cluster DNS service resides.
Defaults to “kube-system” if not specified.
kube-systemOptional: {}
dnsEndpointIPs string arrayDNSEndpointIPs is an optional list of DNS resolver endpoint IPs that should be
allow-listed directly in the operator-managed NetworkPolicy on TCP/UDP port 53.
Use this for clusters that resolve DNS through node-local or host-networked caches
instead of pod-backed DNS Services in a namespace. These IP-based rules are additive
to the namespace-based allow-list controlled by DNSNamespace.
The operator does not auto-detect these endpoint IPs because doing so reliably would
require environment-specific node or DNS discovery logic outside the current trust model.
Example: [“169.254.20.10”]
Optional: {}
egressRules NetworkPolicyEgressRule arrayEgressRules allows users to specify additional egress rules that will be merged into
the operator-managed NetworkPolicy. This is useful for allowing access to external
services such as transit seal backends, object storage endpoints, or other dependencies.
The operator’s default egress rules (DNS, API server, cluster pods) are always included
and cannot be overridden. User-provided rules are appended to the operator-managed rules.
Hardened clusters require every user-provided egress rule to be port-scoped and to target
explicit non-wildcard peers.
Example: Allow egress to a transit seal backend in another namespace:
egressRules:
- to:
- namespaceSelector:
matchLabels:
kubernetes.io/metadata.name: transit-namespace
ports:
- protocol: TCP
port: 8200
Optional: {}
ingressRules NetworkPolicyIngressRule arrayIngressRules allows users to specify additional ingress rules that will be merged into
the operator-managed NetworkPolicy. This is useful for allowing access from external
services, monitoring tools, or other components that need to reach OpenBao pods.
The operator’s default ingress rules (cluster pods and operator-managed jobs)
are always included and cannot be overridden. User-provided rules are appended to
the operator-managed rules. Gateway or ingress-controller data-plane reachability
should be modeled with trustedIngressPeers.
Hardened clusters reject raw ingress rules; use trustedIngressPeers or managed
Gateway/Ingress integration for application access.
Example: Allow ingress from a monitoring namespace:
ingressRules:
- from:
- namespaceSelector:
matchLabels:
kubernetes.io/metadata.name: monitoring
ports:
- protocol: TCP
port: 8200
Optional: {}
trustedIngressPeers NetworkPolicyPeer arrayTrustedIngressPeers allows users to declare ingress-controller or passthrough-proxy peers
that should be allowed to reach OpenBao on the API port without writing full raw
NetworkPolicy ingress rules.
This is useful for user-managed TCP passthrough or external ingress components that the
operator does not manage directly. The operator adds least-privilege ingress rules for
port 8200 using these peers.
Hardened clusters require trusted ingress peers to select explicit non-wildcard sources.
Example: Allow a Traefik namespace to reach OpenBao on port 8200:
trustedIngressPeers:
- namespaceSelector:
matchLabels:
kubernetes.io/metadata.name: traefik
Example: Allow only specific ingress-controller pods in another namespace:
trustedIngressPeers:
- namespaceSelector:
matchLabels:
kubernetes.io/metadata.name: ingress-system
podSelector:
matchLabels:
app.kubernetes.io/name: traefik
Optional: {}

OCIKMSSealConfig

OCIKMSSealConfig configures the OCI KMS seal type. See: https://openbao.org/docs/configuration/seal/ocikms/

Appears in:

FieldDescriptionDefaultValidation
keyID stringKeyID is the OCID of the master encryption key.MinLength: 1
cryptoEndpoint stringCryptoEndpoint is the OCI KMS crypto endpoint.MinLength: 1
managementEndpoint stringManagementEndpoint is the OCI KMS management endpoint.MinLength: 1
authTypeAPIKey booleanAuthTypeAPIKey enables OCI API key authentication through an OCI SDK config file.
When false or omitted, OpenBao uses the default OCI principal flow for the runtime
environment, such as instance principal.
Optional: {}
disabled booleanDisabled disables this seal configuration, for example during seal migration.Optional: {}

ObservabilityConfig

ObservabilityConfig configures observability features.

Appears in:

FieldDescriptionDefaultValidation
metrics MetricsConfigMetrics configures integration with Prometheus/OpenMetrics.Optional: {}

OpenBaoCluster

OpenBaoCluster is the Schema for the openbaoclusters API.

FieldDescriptionDefaultValidation
apiVersion stringopenbao.org/v1alpha1
kind stringOpenBaoCluster
spec OpenBaoClusterSpecSpec defines the desired state of OpenBaoCluster.
status OpenBaoClusterStatusStatus defines the observed state of OpenBaoCluster.Optional: {}

OpenBaoClusterSpec

OpenBaoClusterSpec defines the desired state of an OpenBaoCluster. The Operator owns certain protected OpenBao configuration stanzas (for example, listener “tcp”, storage “raft”, and seal “static” when using default unseal). Users must not override these via spec.configuration.

Appears in:

FieldDescriptionDefaultValidation
version stringVersion is the semantic OpenBao version, used for upgrade orchestration.
The Operator uses static auto-unseal, which requires OpenBao v2.4.0 or later.
Versions below 2.4.0 do not support the static seal feature and will fail to start.
MinLength: 1
Pattern: ^v?(0|[1-9][0-9]*)\.(0|[1-9][0-9]*)\.(0|[1-9][0-9]*)(-(0|[1-9][0-9]*|[0-9]*[A-Za-z-][0-9A-Za-z-]*)(\.(0|[1-9][0-9]*|[0-9]*[A-Za-z-][0-9A-Za-z-]*))*)?(\+[0-9A-Za-z-]+(\.[0-9A-Za-z-]+)*)?$
image stringImage is the container image to run; defaults may be derived from Version.Optional: {}
serviceAccount ServiceAccountConfigServiceAccount configures the Kubernetes ServiceAccount used by the OpenBao Pods.Optional: {}
podMetadata PodMetadataConfigPodMetadata configures additional labels and annotations for the OpenBao Pod template.
This is useful for platform integrations that select Pods via metadata, such as
Azure Workload Identity. Operator-managed Pod metadata takes precedence.
Optional: {}
imagePullSecrets LocalObjectReference arrayImagePullSecrets is a list of references to secrets in the same namespace
to use for pulling any images used by this Cluster (server, init, sidecars).
Optional: {}
observability ObservabilityConfigObservability configures telemetry and metrics integration.Optional: {}
replicas integerReplicas is the desired number of quorum-carrying voter Pods.3Minimum: 1
resources ResourceRequirementsResources defines resource requests and limits for voter OpenBao containers.
Read replicas use spec.readReplicas.template.resources instead.
Optional: {}
readReplicas ReadReplicaConfigReadReplicas configures the steady-state non-voter read-replica pool.Optional: {}
paused booleanPaused, when true, pauses reconciliation for this OpenBaoCluster (except delete and finalizers).Optional: {}
maintenance MaintenanceConfigMaintenance configures supported maintenance workflows.Optional: {}
runtime RuntimeConfigRuntime configures explicit runtime control requests for the OpenBao workload.Optional: {}
breakGlassAck stringBreakGlassAck is an explicit acknowledgment token used to exit Break Glass / Safe Mode.
When the operator enters break glass mode, it writes a nonce to status.breakGlass.nonce.
To acknowledge and allow the operator to resume quorum-risk automation, set this field
to match that nonce.
Example:
kubectl -n <ns> patch openbaocluster <name> –type merge -p ‘{“spec”:{“breakGlassAck”:"<nonce>"}}’
Optional: {}
tls TLSConfigTLS configures TLS for the cluster.
storage StorageConfigStorage configures persistent storage for the cluster.
service ServiceConfigService configures the primary Service used to expose OpenBao inside or outside the cluster.Optional: {}
ingress IngressConfigIngress configures optional HTTP(S) ingress in front of the OpenBao Service.Optional: {}
configuration OpenBaoConfigurationConfiguration defines the server configuration.Optional: {}
backup BackupScheduleBackup configures scheduled backups for the cluster.Optional: {}
restore RestoreConfigRestore configures optional restore authentication bootstrap for the cluster.Optional: {}
deletionPolicy DeletionPolicyDeletionPolicy controls what happens to underlying resources when the CR is deleted.Enum: [Retain DeletePVCs DeleteAll]
Optional: {}
reconcilePolicies booleanReconcilePolicies restores the built-in operational policies after initialization.
Administrator-managed JWT authentication and exact-content approval are required.
OpenBao must independently approve their exact contents through the
openbao-operator-policy-approval policy. Bootstrap installs the initial approval;
existing clusters and later permission changes require administrator approval.
Auth methods, roles, and the approval policy are not reconciled.
Optional: {}
controllerJWTMode ControllerJWTModeControllerJWTMode selects the credential used by the controller for OpenBao.
Shared (also the behavior when omitted) preserves the installation-wide
projected JWT. Target requests a short-lived JWT whose sole audience is
urn:openbao:controller:<metadata.uid>. Prepare the OpenBao controller role
before switching an initialized cluster to Target. Target never falls back
to the shared JWT. Target requires self-init and self-init OIDC to be enabled.
Executor Job authentication is unchanged.
Enforced admission prevents removal or downgrade after selecting Target.
Enum: [Shared Target]
Optional: {}
selfInit SelfInitConfigSelfInit configures OpenBao’s native self-initialization feature.
When enabled, OpenBao initializes itself on first start using the configured
requests, and the root token is automatically revoked.
See: https://openbao.org/docs/configuration/self-init/
Optional: {}
recoveryKeys RecoveryKeysConfigRecoveryKeys configures Operator-assisted recovery-key bootstrap surfaces.
The Operator creates recovery keys only during initial self-initialization;
recovery share custody and proof ceremonies remain user-owned processes.
Optional: {}
gateway GatewayConfigGateway configures Kubernetes Gateway API access (alternative to Ingress).
When enabled, the Operator creates an HTTPRoute that routes traffic through
a user-managed Gateway resource.
Optional: {}
network NetworkConfigNetwork configures network-related settings for the cluster.Optional: {}
initContainer InitContainerConfigInitContainer configures the init container used to render OpenBao configuration.
The init container renders the final config.hcl from a template using environment
variables such as HOSTNAME and POD_IP.
Optional: {}
audit AuditDevice arrayAudit configures declarative audit devices for the OpenBao cluster.
See: https://openbao.org/docs/configuration/audit/
Optional: {}
auditFileStorage AuditFileStorageConfigAuditFileStorage configures a shared filesystem integration point for file audit devices.
When configured, file audit device paths must be under auditFileStorage.mountPath.
Optional: {}
plugins Plugin arrayPlugins configures declarative plugins for the OpenBao cluster.
See: https://openbao.org/docs/configuration/plugins/
Optional: {}
telemetry TelemetryConfigTelemetry configures telemetry reporting for the OpenBao cluster.
See: https://openbao.org/docs/configuration/telemetry/
Optional: {}
upgrade UpgradeConfigUpgrade configures upgrade operations.
Built-in upgrade executor Jobs authenticate with JWT auth using the
upgrade ServiceAccount (<cluster-name>-upgrade-serviceaccount). If
spec.selfInit.oidc.enabled is true during initial SelfInit bootstrap and
spec.upgrade.jwtAuthRole is empty, the operator creates the default
“openbao-operator-upgrade” role. Already-initialized clusters must keep
that role or configure spec.upgrade.jwtAuthRole explicitly.
Pre-upgrade snapshots use spec.backup configuration and backup
authentication rather than spec.upgrade credentials.
Optional: {}
unseal UnsealConfigUnseal defines the auto-unseal configuration.
If omitted, defaults to “static” mode managed by the operator.
Optional: {}
imageVerification ImageVerificationConfigImageVerification configures supply chain security checks.Optional: {}
operatorImageVerification ImageVerificationConfigOperatorImageVerification configures supply chain security checks for operator-managed helper images
(init container and backup/upgrade/restore executors) and custom BlueGreen validation-hook images.
Helper images are typically signed by the operator project (e.g., kubebao/openbao-operator)
rather than the OpenBao upstream project.
If omitted, helper image verification does not fall back to ImageVerification.
In Development, omitted means disabled. In Hardened, omitted means enabled.
Optional: {}
workloadHardening WorkloadHardeningConfigWorkloadHardening configures opt-in workload hardening features.Optional: {}
securityContext PodSecurityContextSecurityContext allows specifying the PodSecurityContext for the OpenBao Pods.
If set, these values override the default security context generated by the operator.
This is useful for OpenShift (SCC) compatibility or custom security requirements.
Optional: {}
profile ProfileProfile defines the security posture for this cluster.
When set to “Hardened”, the operator enforces strict security requirements:
- TLS must use External or ACME trust, with no TLS disablement or skip-verify paths
- Unseal must use external KMS (no static unseal)
- SelfInit must be enabled (no root token)
- Network additions must be explicit and least-privilege
- Backup/restore storage identity must be explicit
- Dangerous runtime flags and backend HTTP are rejected
When set to “Development”, relaxed security is allowed but a security warning
condition is set.
Enum: [Hardened Development]

OpenBaoClusterStatus

DriftStatus tracks drift detection and correction events for a cluster. OpenBaoClusterStatus defines the observed state of an OpenBaoCluster.

Appears in:

FieldDescriptionDefaultValidation
observedGeneration integerObservedGeneration is the most recent metadata.generation that has been
reconciled into this status.
Optional: {}
phase ClusterPhasePhase is a high-level summary of the cluster state.Enum: [Initializing Running Upgrading BackingUp Failed]
Optional: {}
activeLeader stringActiveLeader is the current Raft leader pod name, for example “prod-cluster-0”.Optional: {}
readyReplicas integerReadyReplicas is the number of replicas that are currently Ready.Optional: {}
readReplicas ReadReplicaStatusReadReplicas captures observed state for the read-replica pool.Optional: {}
currentVersion stringCurrentVersion is the OpenBao version currently running on the cluster.Optional: {}
acceptedUpgradeStrategy UpdateStrategyTypeAcceptedUpgradeStrategy is the upgrade strategy the operator has accepted
after applying idle-state transition guards. While a requested strategy
change is blocked, controllers continue using this strategy so an existing
operation can finish safely.
Enum: [RollingUpdate BlueGreen]
Optional: {}
initialized booleanInitialized indicates whether the OpenBao cluster has been initialized.
This is set to true after the first pod is initialized using bao operator init
or after self-initialization completes.
Optional: {}
selfInitialized booleanSelfInitialized indicates whether the cluster was initialized using
OpenBao’s self-initialization feature. When true, no root token Secret
exists for this cluster (the root token was auto-revoked).
Optional: {}
upgrade UpgradeProgressUpgrade tracks the state of an in-progress upgrade (if any).
When non-nil, an upgrade is in progress and the UpgradeManager is orchestrating
the pod-by-pod rolling update with leader step-down.
Optional: {}
upgradeRequests UpgradeRequestStatusUpgradeRequests tracks which explicit upgrade request values have already
been handled so one-shot requests are edge-triggered instead of level-triggered.
Optional: {}
backup BackupStatusBackup tracks the state of backups for this cluster.Optional: {}
restore ClusterRestoreStatusRestore retains post-restore restart status written by earlier releases.
It is deprecated: new restores report status on OpenBaoRestore, and the
operator reads this field only to preserve legacy Pod templates.
Optional: {}
blueGreen BlueGreenStatusBlueGreen tracks the state of blue/green upgrades (if enabled).Optional: {}
operationLock OperationLockStatusOperationLock prevents concurrent long-running operations (upgrade/backup/restore)
from acting on the same cluster at the same time.
Optional: {}
breakGlass BreakGlassStatusBreakGlass records when the operator has halted quorum-risk automation and requires
explicit operator acknowledgment to continue.
Optional: {}
workload WorkloadControllerStatusWorkload holds signals owned by the workload controller (infrastructure reconciliation).Optional: {}
adminOps AdminOpsControllerStatusAdminOps holds signals owned by the adminops controller (upgrade + backup).Optional: {}
conditions Condition arrayConditions represent the current state of the OpenBaoCluster resource.Optional: {}

OpenBaoConfiguration

OpenBaoConfiguration defines the server configuration for OpenBao.

Appears in:

FieldDescriptionDefaultValidation
ui booleanUI enables the built-in web interface.trueOptional: {}
logLevel stringLogLevel specifies the log level.infoEnum: [trace debug info warn err]
Optional: {}
listener ListenerConfigListener allows tuning the TCP listener.
Note: Address and ClusterAddress are managed by the operator and cannot be changed.
Optional: {}
raft RaftConfigRaft allows tuning the Raft storage backend.Optional: {}
acmeCARoot stringACMECARoot is the path to the ACME CA root certificate file.
This is used when TLS mode is ACME to specify a custom CA root for ACME certificate validation.
Optional: {}
logging LoggingConfigLogging allows configuring logging behavior.Optional: {}
plugin PluginConfigPlugin allows configuring plugin behavior.
Note: This is separate from spec.plugins which defines plugin instances.
Optional: {}
defaultLeaseTTL stringDefaultLeaseTTL is the default lease TTL for tokens and secrets (e.g., “720h”, “30m”).
If not specified, OpenBao uses its default.
Optional: {}
maxLeaseTTL stringMaxLeaseTTL is the maximum lease TTL for tokens and secrets (e.g., “8760h”, “1y”).
This must be greater than or equal to DefaultLeaseTTL.
If not specified, OpenBao uses its default.
Optional: {}
cacheSize integerCacheSize is the size of the cache in bytes.
If not specified, OpenBao uses its default cache size.
Minimum: 0
Optional: {}
disableCache booleanDisableCache disables the cache entirely.
When true, all caching is disabled.
Optional: {}
detectDeadlocks booleanDetectDeadlocks enables deadlock detection in OpenBao.
This is an experimental feature for debugging.
Hardened clusters reject detectDeadlocks=true.
Optional: {}
rawStorageEndpoint booleanRawStorageEndpoint enables the raw storage endpoint.
This is an experimental feature that exposes raw storage operations.
Hardened clusters reject rawStorageEndpoint=true.
Optional: {}
introspectionEndpoint booleanIntrospectionEndpoint enables the introspection endpoint.
This is an experimental feature for debugging and introspection.
Hardened clusters reject introspectionEndpoint=true.
Optional: {}
impreciseLeaseRoleTracking booleanImpreciseLeaseRoleTracking enables imprecise lease role tracking.
This is an experimental feature that may improve performance in some scenarios.
Optional: {}
unsafeAllowAPIAuditCreation booleanUnsafeAllowAPIAuditCreation allows API-based audit device creation.
This bypasses the normal audit device configuration validation.
Use with caution.
Hardened clusters reject unsafeAllowAPIAuditCreation=true.
Optional: {}
allowAuditLogPrefixing booleanAllowAuditLogPrefixing allows audit log prefixing.
This enables custom prefixes in audit log entries.
Optional: {}
enableResponseHeaderHostname booleanEnableResponseHeaderHostname enables the hostname in response headers.
When true, OpenBao includes the hostname in HTTP response headers.
Optional: {}
enableResponseHeaderRaftNodeID booleanEnableResponseHeaderRaftNodeID enables the Raft node ID in response headers.
When true, OpenBao includes the Raft node ID in HTTP response headers.
Optional: {}

OperationLockStatus

OperationLockStatus represents a status-based lock held by the operator.

Appears in:

FieldDescriptionDefaultValidation
operation ClusterOperationOperation is the operation currently holding the lock.Enum: [Upgrade Backup Restore]
Optional: {}
holder stringHolder is a stable identifier for the lock holder (controller/component).Optional: {}
message stringMessage provides human-readable context for why the lock is held.Optional: {}
acquiredAt TimeAcquiredAt is when the lock was first acquired.Optional: {}
renewedAt TimeRenewedAt is updated when the holder reasserts the lock during reconciliation.Optional: {}

PKCS11RuntimeConfig

PKCS11RuntimeConfig configures local runtime wiring needed by PKCS#11 vendor libraries. It is intentionally scoped to environment variables and library lookup paths so HSM integrations do not require custom wrapper scripts.

Appears in:

FieldDescriptionDefaultValidation
libraryPath stringLibraryPath sets LD_LIBRARY_PATH for the OpenBao process. Use this when
the configured PKCS#11 module depends on sibling vendor libraries that
are not in the image’s default dynamic linker search path.
Optional: {}
env PKCS11RuntimeEnvVar arrayEnv exposes literal environment variables from keys in
spec.unseal.credentialsSecretRef. Use this for vendor runtime settings
such as HSM endpoints or authentication key references.
MaxItems: 16
Optional: {}
fileEnv PKCS11RuntimeFileEnvVar arrayFileEnv exposes environment variables whose values are paths to files
mounted from keys in spec.unseal.credentialsSecretRef. Use this for vendor
settings that expect a config file path, for example SOFTHSM2_CONF or
vendor-specific PKCS#11 client configuration variables.
MaxItems: 16
Optional: {}

PKCS11RuntimeEnvVar

Underlying type: struct{Name string "json:\"name\""; SecretKey string "json:\"secretKey\""}

PKCS11RuntimeEnvVar maps a PKCS#11 runtime environment variable to a key in spec.unseal.credentialsSecretRef.

Appears in:

PKCS11RuntimeFileEnvVar

Underlying type: struct{Name string "json:\"name\""; SecretKey string "json:\"secretKey\""}

PKCS11RuntimeFileEnvVar maps a PKCS#11 runtime environment variable to the mounted file path for a key in spec.unseal.credentialsSecretRef.

Appears in:

PKCS11SealConfig

PKCS11SealConfig configures the PKCS#11 seal type. See: https://openbao.org/docs/configuration/seal/pkcs11/

Appears in:

FieldDescriptionDefaultValidation
lib stringLib is the path to the PKCS#11 library provided by the HSM vendor.MinLength: 1
slot stringSlot is the slot number where the HSM token is located.Optional: {}
tokenLabel stringTokenLabel is the token label of the HSM slot to use instead of Slot.Optional: {}
pin stringPIN is the PIN for accessing the HSM token.
Note: It is strongly recommended to use CredentialsSecretRef instead of setting this directly.
Optional: {}
keyLabel stringKeyLabel is the label for the encryption key used by OpenBao.MinLength: 1
keyID stringKeyID is the PKCS#11 key identifier to use instead of KeyLabel.Optional: {}
mechanism stringMechanism overrides the PKCS#11 wrapping or encryption mechanism.Optional: {}
disableSoftwareEncryption booleanDisableSoftwareEncryption disables the software encryption fallback.Optional: {}
disabled booleanDisabled disables this seal configuration, for example during seal migration.Optional: {}
rsaOAEPHash stringRSAOAEPHash specifies the hash algorithm to use for RSA with OAEP padding.
Valid values: sha1, sha224, sha256, sha384, sha512.
Enum: [sha1 sha224 sha256 sha384 sha512]
Optional: {}
runtime PKCS11RuntimeConfigRuntime configures local PKCS#11 vendor runtime wiring such as library
lookup paths and environment variables sourced from credentialsSecretRef.
Optional: {}

Plugin

Plugin defines a declarative plugin configuration. Declarative plugins require OpenBao 2.5.0 or newer; KMS plugins require 2.6.0 or newer. During upgrades, declarations must also meet the recorded running version’s requirements. See: https://openbao.org/docs/configuration/plugins/

Appears in:

FieldDescriptionDefaultValidation
type stringType is the plugin type (e.g., “secret”, “auth”).MinLength: 1
name stringName is the name of the plugin.MinLength: 1
image stringImage is the OCI image URL including registry and repository.
Before OpenBao 2.7.0, use an untagged repository and set Version separately.
Required if Command is not set. Conflicts with Command.
Optional: {}
command stringCommand is the command name of a manually downloaded plugin.
Required if Image is not set. Conflicts with Image.
Optional: {}
version stringVersion is the plugin version and, when Image has no tag, the image tag.
OpenBao 2.7 and later can infer it from the image tag. Command-based KMS
plugins on OpenBao 2.7 and later do not require a version.
MinLength: 1
Optional: {}
binaryName stringBinaryName is the name of the plugin binary file within the OCI image.
OpenBao 2.7 and later can infer it from the image ENTRYPOINT or CMD.
MinLength: 1
Optional: {}
sha256sum stringSHA256Sum is the expected SHA256 checksum of the plugin binary.
Must be a 64-character hexadecimal string.
OpenBao 2.7 and later allow omission for digest-pinned OCI images and
command-based plugins. Earlier versions require this field.
MaxLength: 64
MinLength: 64
Pattern: ^[0-9a-fA-F]\{64\}$
Optional: {}
args string arrayArgs are arguments to pass to the running plugin.
Only used if plugin_auto_register=true is set.
Optional: {}
env string arrayEnv are environment variables to pass to the running plugin.
Only used if plugin_auto_register=true is set.
Optional: {}

PluginConfig

PluginConfig allows configuring plugin behavior.

Appears in:

FieldDescriptionDefaultValidation
fileUID integerFileUID is the UID to use for plugin files.Optional: {}
filePermissions stringFilePermissions are the file permissions for plugin files (e.g., “0755”).Optional: {}
autoDownload booleanAutoDownload controls automatic plugin downloads from OCI registries.Optional: {}
autoRegister booleanAutoRegister controls automatic plugin registration.Optional: {}
downloadBehavior stringDownloadBehavior controls whether OpenBao startup fails or continues when
declarative OCI plugin downloads fail. Valid values are “fail” and
“continue”; OpenBao defaults to “fail” when unset.
Enum: [fail continue]
Optional: {}

PodMetadataConfig

PodMetadataConfig configures additional metadata for the OpenBao Pod template.

Appears in:

FieldDescriptionDefaultValidation
labels object (keys:string, values:string)Labels are merged into the generated OpenBao Pod template labels.
Operator-managed labels take precedence if the same key is specified here.
Optional: {}
annotations object (keys:string, values:string)Annotations are merged into the generated OpenBao Pod template annotations.
Operator-managed annotations take precedence if the same key is specified here.
Optional: {}

PolicyReconciliationStatus

PolicyReconciliationStatus records progress without granting OpenBao permissions.

Appears in:

FieldDescriptionDefaultValidation
revisions object (keys:string, values:string)Revisions contains the last verified content digest for each observed policy.
An empty digest means the policy was observed missing or different and awaits repair.
An absent entry means the policy has not been observed; it does not block operations.
Failed reads retain the last observation; OpenBao still authorizes every operation.
Optional: {}
attemptedRevision stringAttemptedRevision identifies the bundle used for the last attempt.
A desired bundle change bypasses the previous retry delay.
Optional: {}
lastVerified TimeLastVerified is when the complete desired bundle was last verified or repaired.
Unchanged successful observations are refreshed at most once every five minutes.
Optional: {}
retryAfter TimeRetryAfter delays policy requests after a failure, including during unrelated reconciles.Optional: {}
lastError ControllerErrorStatusLastError reports policy failures independently of infrastructure and Autopilot errors.Optional: {}

Profile

Underlying type: string

Profile defines the security posture for an OpenBaoCluster.

Validation:

  • Enum: [Hardened Development]

Appears in:

FieldDescription
HardenedProfileHardened enforces strict security requirements and rejects unsafe escape hatches.
DevelopmentProfileDevelopment allows relaxed security for development/testing.

RaftAutopilotConfig

RaftAutopilotConfig configures Raft Autopilot behavior for dead server cleanup. See: https://openbao.org/docs/concepts/integrated-storage/autopilot/

Appears in:

FieldDescriptionDefaultValidation
cleanupDeadServers booleanCleanupDeadServers enables automatic removal of dead Raft peers.
When enabled, Autopilot periodically removes servers that have been
unhealthy for longer than DeadServerLastContactThreshold.
Requires MinQuorum to be set (defaults to replicas/2 + 1).
trueOptional: {}
deadServerLastContactThreshold stringDeadServerLastContactThreshold is the duration after which a server
is considered dead if it hasn’t contacted the leader.
Minimum: “1m”. Default: “5m” (operator default, shorter than OpenBao’s 24h).
5mOptional: {}
minQuorum integerMinQuorum is the minimum number of servers before Autopilot can prune
dead servers. This prevents removing so many servers that quorum is lost.
If not specified, defaults to max(3, replicas/2 + 1).
Minimum: 3
Optional: {}
serverStabilizationTime stringServerStabilizationTime is the minimum time a server must be healthy
before being promoted to voter. Default: “10s”.
Optional: {}
lastContactThreshold stringLastContactThreshold is the limit on the amount of time a server can
go without leader contact before being considered unhealthy.
Default: “10s”.
Optional: {}
maxTrailingLogs integerMaxTrailingLogs is the amount of entries in the Raft Log that a server
can be behind before being considered unhealthy. Default: 1000.
Optional: {}

RaftConfig

RaftConfig allows tuning the Raft storage backend.

Appears in:

FieldDescriptionDefaultValidation
performanceMultiplier integerPerformanceMultiplier scales the Raft timing parameters.Minimum: 0
Optional: {}
autopilot RaftAutopilotConfigAutopilot configures Raft Autopilot settings.
By default, dead server cleanup is enabled with a 5-minute threshold.
Optional: {}

ReadReplicaConfig

ReadReplicaConfig defines the steady-state read-replica pool.

Appears in:

FieldDescriptionDefaultValidation
replicas integerReplicas is the desired number of permanent non-voters.Minimum: 0
Optional: {}
service ReadReplicaServiceConfigService configures an optional dedicated Service for read traffic.Optional: {}
template ReadReplicaTemplateConfigTemplate configures read-replica-specific Pod template overrides.Optional: {}
storage ReadReplicaStorageConfigStorage configures read-replica-specific storage overrides.Optional: {}

ReadReplicaSchedulingConfig

ReadReplicaSchedulingConfig defines scheduling overrides for read replicas.

Appears in:

FieldDescriptionDefaultValidation
nodeSelector object (keys:string, values:string)NodeSelector defines node-selection constraints for read-replica Pods.Optional: {}
tolerations Toleration arrayTolerations defines Pod tolerations for read-replica Pods.Optional: {}
affinity AffinityAffinity defines Pod affinity / anti-affinity rules for read-replica Pods.Optional: {}
topologySpreadConstraints TopologySpreadConstraint arrayTopologySpreadConstraints defines topology spread constraints for
read-replica Pods.
Optional: {}

ReadReplicaServiceConfig

ReadReplicaServiceConfig controls the optional read-only Service for the read-replica pool.

Appears in:

FieldDescriptionDefaultValidation
ipFamilyPolicy IPFamilyPolicyIPFamilyPolicy selects single-stack or dual-stack Service allocation.
When omitted, Kubernetes uses its default Service policy.
Two IP families require PreferDualStack or RequireDualStack.
Enum: [SingleStack PreferDualStack RequireDualStack]
Optional: {}
ipFamilies IPFamily arrayIPFamilies selects the Service IP families in primary-first order.
The primary family cannot change after the Service is created.
MaxItems: 2
items:Enum: [IPv4 IPv6]
Optional: {}
enabled booleanEnabled controls whether the operator creates a dedicated Service for the
read-replica pool.
Optional: {}
type ServiceTypeType is the Kubernetes Service type, for example “ClusterIP” or
“LoadBalancer”.
Optional: {}
annotations object (keys:string, values:string)Annotations are additional annotations to apply to the read Service.Optional: {}

ReadReplicaStatus

ReadReplicaStatus captures observed state for the read-replica pool.

Appears in:

FieldDescriptionDefaultValidation
desiredReplicas integerDesiredReplicas is the desired number of read replicas.Optional: {}
readyReplicas integerReadyReplicas is the number of Ready read-replica Pods observed.Optional: {}
registeredReplicas integerRegisteredReplicas is the number of observed non-voter peers registered in
Raft membership.
Optional: {}
healthyReplicas integerHealthyReplicas is the number of read-replica peers that are currently
healthy according to the Raft Autopilot state endpoint.
Optional: {}
storage ReadReplicaStorageStatusStorage captures read-replica-specific storage observation state.Optional: {}

ReadReplicaStorageConfig

ReadReplicaStorageConfig defines storage overrides for the read-replica StatefulSet.

Appears in:

FieldDescriptionDefaultValidation
size QuantitySize is the requested persistent volume size for read replicas.Optional: {}
storageClassName stringStorageClassName is an optional StorageClass for read-replica PVCs.Optional: {}

ReadReplicaStorageStatus

ReadReplicaStorageStatus captures observed storage state for the read-replica pool.

Appears in:

FieldDescriptionDefaultValidation
desiredPVCs integerDesiredPVCs is the number of data PVCs expected for the read-replica pool.Optional: {}
boundPVCs integerBoundPVCs is the number of observed data PVCs for the read-replica pool.Optional: {}
storageClassName stringStorageClassName is the effective StorageClass observed for the
read-replica PVCs when it is consistent.
Optional: {}

ReadReplicaTemplateConfig

ReadReplicaTemplateConfig defines Pod-template overrides for read replicas.

Appears in:

FieldDescriptionDefaultValidation
metadata PodMetadataConfigRefer to Kubernetes API documentation for fields of metadata.Optional: {}
resources ResourceRequirementsResources defines container resource requests and limits for read replicas.Optional: {}
scheduling ReadReplicaSchedulingConfigScheduling defines node-placement and topology overrides for read replicas.Optional: {}

RecoveryKeyRecipient

RecoveryKeyRecipient describes one public OpenPGP recipient for an encrypted recovery-key share. The public key material is not secret, but it must be fingerprint-verified before production use.

Appears in:

FieldDescriptionDefaultValidation
name stringName is a stable ceremony-local recipient identifier used only for review
and status/evidence mapping.
MaxLength: 64
MinLength: 1
Pattern: ^[A-Za-z0-9][A-Za-z0-9_.-]*$
fingerprint stringFingerprint is the expected OpenPGP public-key fingerprint for the
recipient. It is informational for the Operator and should be verified
out of band by the ceremony participants.
Pattern: ^([0-9A-Fa-f]\{40\}|[0-9A-Fa-f]\{64\})$
Optional: {}
pgpPublicKey stringPGPPublicKey is the base64-encoded binary OpenPGP public key material
expected by OpenBao’s sys/rotate/recovery/init pgp_keys field.
MinLength: 1

RecoveryKeysConfig

RecoveryKeysConfig configures OpenBao recovery-key bootstrap surfaces.

The Operator only creates recovery keys during first self-initialization. It does not distribute encrypted shares, collect decrypted shares, escrow share material, or run generate-root ceremonies.

Appears in:

FieldDescriptionDefaultValidation
initial InitialRecoveryKeysConfigInitial configures the first recovery-key generation request for a
self-initialized cluster using auto-unseal.
Optional: {}

RestoreClusterTemplate

RestoreClusterTemplate is the supported fresh recovery target profile. Administrators must prepare the destination namespace network boundary.

Appears in:

FieldDescriptionDefaultValidation
version stringVersion must match the administrator-observed snapshot source version.Enum: [2.7.0 2.7.1]
image stringImage defaults to the version-derived image.Optional: {}
storage StorageConfig
tls TLSConfig
service RestoreTargetServiceConfigService configures an optional ClusterIP Service for the destination.
When omitted, the target has only its internal headless Service.
Optional: {}
unseal UnsealConfigUnseal uses the same provider configuration as OpenBaoCluster. The target
must be able to decrypt the snapshot with the original seal key material.
serviceAccount ServiceAccountConfigServiceAccount configures credentials supplied through workload identity.Optional: {}
podMetadata PodMetadataConfigPodMetadata supplies provider-specific workload identity metadata.Optional: {}
plugins Plugin arrayPlugins declares KMS seal plugins required by Unseal. OpenBao 2.7 requires
plugins for AWS, Azure, GCP, OCI, and PKCS#11 seals.
Optional: {}
configuration RestoreTargetConfigurationConfiguration configures KMS plugin behavior for the target server.Optional: {}
resources ResourceRequirementsOptional: {}
initContainer InitContainerConfigOptional: {}
imagePullSecrets LocalObjectReference arrayMaxItems: 2
Optional: {}

RestoreConfig

RestoreConfig defines optional configuration for restore operations.

This is primarily used with self-init JWT bootstrap to pre-create a JWT role that can be referenced by OpenBaoRestore resources.

Appears in:

FieldDescriptionDefaultValidation
jwtAuthRole stringJWTAuthRole is the name of the JWT Auth role configured in OpenBao
for restore operations. When set, and when spec.selfInit.oidc.enabled is true,
the operator bootstraps a restore policy and JWT role bound to the restore ServiceAccount
(<cluster-name>-restore-serviceaccount).
If OIDC is enabled in SelfInit and this field is empty, a default role
named “openbao-operator-restore” will be assumed/created.
The role must grant “update” capability on sys/storage/raft/snapshot and
sys/storage/raft/snapshot-force. The force endpoint supports explicitly
requested break-glass restores.
Optional: {}

RestoreTargetConfiguration

RestoreTargetConfiguration exposes server settings needed by KMS seal plugins.

Appears in:

FieldDescriptionDefaultValidation
plugin PluginConfigPlugin controls downloads, registration, and file ownership for Plugins.
Set autoDownload to true to download declared OCI plugins on startup.
Optional: {}

RestoreTargetServiceConfig

RestoreTargetServiceConfig selects destination client Service IP families. These settings do not change Pod IP allocation or the internal peer Service.

Appears in:

FieldDescriptionDefaultValidation
ipFamilyPolicy IPFamilyPolicyIPFamilyPolicy selects single-stack or dual-stack Service allocation.
When omitted, Kubernetes uses its default Service policy.
Two IP families require PreferDualStack or RequireDualStack.
Enum: [SingleStack PreferDualStack RequireDualStack]
Optional: {}
ipFamilies IPFamily arrayIPFamilies selects the Service IP families in primary-first order.
The primary family cannot change after the Service is created.
MaxItems: 2
items:Enum: [IPv4 IPv6]
Optional: {}

RestoreTest

RestoreTest schedules one disposable restore at a time. The destination must be an administrator-prepared operator-managed namespace.

Appears in:

FieldDescriptionDefaultValidation
schedule stringSchedule uses five-field cron syntax and UTC.MaxLength: 128
MinLength: 1
Optional: {}
everySuccessfulBackups integerMaximum: 10000
Minimum: 1
Optional: {}
namespace stringMaxLength: 63
MinLength: 1
clusterTemplate RestoreClusterTemplate
credentialsSecretRef LocalObjectReferenceCredentialsSecretRef is the existing destination storage credential Secret.
Storage connection settings are inherited from the source backup target.
Optional: {}
serviceAccountName stringServiceAccountName selects an existing executor ServiceAccount in Namespace.
The operator does not create, modify, or delete this account. It must have
its own storage-reader identity; backup writer identities are not inherited.
MaxLength: 253
Pattern: ^[a-z0-9]([-a-z0-9.]*[a-z0-9])?$
Optional: {}
roleArn stringRoleARN selects the S3 reader role independently of the backup writer role.MinLength: 1
Optional: {}
workloadIdentity WorkloadIdentityConfigWorkloadIdentity supplies destination reader metadata. ServiceAccount
annotations must already exist on ServiceAccountName; PodLabels apply to
the executor Pod. The operator does not update the existing account.
Optional: {}
cleanupAfterSeconds integerCleanupAfterSeconds delays deletion after snapshot application to permit inspection.Maximum: 86400
Minimum: 0
Optional: {}

RestoreTestOutcome

Underlying type: string

RestoreTestOutcome reports whether a disposable restore test passed or failed.

Validation:

  • Enum: [Passed Failed]

Appears in:

FieldDescription
Passed
Failed

RestoreTestResult

RestoreTestResult contains no secret data or authentication tokens.

Appears in:

FieldDescriptionDefaultValidation
name stringName is the child OpenBaoRestore that produced this result.
finishedAt TimeFinishedAt records when the result was recorded.
namespace stringNamespace identifies the destination namespace.Optional: {}
key stringKey identifies the tested snapshot object in backup storage.Optional: {}
digest stringDigest is the pinned snapshot digest, when available.Optional: {}
reason stringReason and Message retain a bounded summary after the child is deleted.
They contain operator-defined diagnostics, never provider responses or logs.
MaxLength: 64
Optional: {}
message stringMessage contains the operator-defined diagnostic for this result.MaxLength: 512
Optional: {}
outcome RestoreTestOutcomeOutcome is Passed or Failed.Enum: [Passed Failed]

RestoreTestRun

RestoreTestRun reserves one child request and protects its source key.

Appears in:

FieldDescriptionDefaultValidation
namespace stringNamespace is the destination namespace of the child OpenBaoRestore.
name stringName is the generated name of the child OpenBaoRestore.
key stringKey is the snapshot object under test; retention protects it until the run ends.
startedAt TimeStartedAt records when the run was reserved.
uid UIDUID identifies the child OpenBaoRestore once its creation is observed.Optional: {}

RestoreTestStatus

RestoreTestStatus stores at most one active request and one last result.

Appears in:

FieldDescriptionDefaultValidation
active RestoreTestRunOptional: {}
last RestoreTestResultOptional: {}
lastSuccessTime TimeLastSuccessTime survives later failures and controller restarts.Optional: {}
lastScheduledAt TimeLastScheduledAt records the last time a restore test was started.Optional: {}
lastBackupCount integerLastBackupCount is the successful-backup count at the last started test.Optional: {}
conditions Condition arrayConditions reports scheduling and restore test outcomes without secret data.
The Passed condition summarizes the current state.
Optional: {}

RuntimeConfig

RuntimeConfig defines explicit runtime control requests for the OpenBao workload.

Appears in:

FieldDescriptionDefaultValidation
restartAt stringRestartAt triggers a rolling restart when changed.
The operator propagates this value as a Pod template annotation; any change
results in a new StatefulSet revision and a controlled restart.
Recommended value is an RFC3339 timestamp string.
MinLength: 1
Optional: {}

S3TargetConfig

S3TargetConfig holds S3-specific configuration. Omitted fields use their top-level BackupTarget compatibility values; this block has no defaults.

Appears in:

FieldDescriptionDefaultValidation
region stringRegion is the AWS region for S3-compatible requests. It overrides region
when configured. An empty value uses the default region, us-east-1.
Optional: {}
usePathStyle booleanUsePathStyle selects path-style addressing. A configured false value
overrides a true top-level usePathStyle value.
Optional: {}
roleArn stringRoleARN selects the IAM role assumed with the projected ServiceAccount
token. It overrides roleArn when configured. An empty value disables the
top-level roleArn path; other configured credentials still apply.
A nonempty value is an explicit storage identity for the Hardened profile.
Optional: {}

SelfInitAuditDevice

SelfInitAuditDevice provides structured configuration for enabling audit devices via self-init requests. This replaces the need for raw JSON in the Data field. See: https://openbao.org/api-docs/system/audit/

Appears in:

FieldDescriptionDefaultValidation
type stringType is the type of audit device (e.g., “file”, “syslog”, “socket”, “http”).Enum: [file syslog socket http]
MinLength: 1
description stringDescription is an optional description for the audit device.Optional: {}
fileOptions FileAuditOptionsFileOptions configures options for file audit devices.
Only used when Type is “file”.
Optional: {}
httpOptions HTTPAuditOptionsHTTPOptions configures options for HTTP audit devices.
Only used when Type is “http”.
Optional: {}
syslogOptions SyslogAuditOptionsSyslogOptions configures options for syslog audit devices.
Only used when Type is “syslog”.
Optional: {}
socketOptions SocketAuditOptionsSocketOptions configures options for socket audit devices.
Only used when Type is “socket”.
Optional: {}

SelfInitAuthMethod

SelfInitAuthMethod provides structured configuration for enabling auth methods via self-init requests. This replaces the need for raw JSON in the Data field. See: https://openbao.org/api-docs/system/auth/

Appears in:

FieldDescriptionDefaultValidation
type stringType is the type of auth method (e.g., “jwt”, “kubernetes”, “userpass”, “ldap”).MinLength: 1
description stringDescription is an optional description for the auth method.Optional: {}
config object (keys:string, values:string)Config contains optional configuration for the auth method mount.
Common fields include: default_lease_ttl, max_lease_ttl, listing_visibility, etc.
Optional: {}

SelfInitConfig

SelfInitConfig enables OpenBao’s self-initialization feature. When enabled, OpenBao initializes itself on first start using the configured requests, and the root token is automatically revoked. See: https://openbao.org/docs/configuration/self-init/

Appears in:

FieldDescriptionDefaultValidation
enabled booleanEnabled activates OpenBao’s self-initialization feature.
When true, the Operator injects initialize stanzas into config.hcl
and does NOT create a root token Secret (root token is auto-revoked).
WARNING: The root token is auto-revoked during initialization. You MUST
configure user authentication (e.g., userpass, JWT, Kubernetes auth) via
spec.selfInit.requests before enabling this. spec.selfInit.oidc.enabled
only provides Operator authentication for lifecycle tasks, NOT user access.
Enabling without user authentication results in permanent lockout.
false
oidc SelfInitOIDCConfigOIDC configures JWT authentication for the Operator to perform cluster
lifecycle operations (backups, upgrades, restores). When enabled, this
sets up the jwt-operator auth method, OIDC discovery, and operator roles.
This is for Operator authentication only - users must configure their own
authentication methods via spec.selfInit.requests.
Optional: {}
requests SelfInitRequest arrayRequests defines the API operations to execute during self-initialization.
Each request becomes a named request block inside an initialize stanza.
Optional: {}

SelfInitDataSource

SelfInitDataSource supplies one string field of a raw self-init request.

Appears in:

FieldDescriptionDefaultValidation
secretKeyRef SelfInitSecretKeyReferenceSecretKeyRef selects a required Secret key in the OpenBaoCluster namespace.

SelfInitOIDCAdditionalSubjects

SelfInitOIDCAdditionalSubjects adds recovery-target identities to the generated Operator JWT roles without combining their policies.

Appears in:

FieldDescriptionDefaultValidation
operator KubernetesServiceAccountSubject arrayOperator lists additional controller ServiceAccount subjects.MaxItems: 32
MaxLength: 340
Pattern: ^system:serviceaccount:[a-z0-9]([-a-z0-9]*[a-z0-9])?:[a-z0-9]([-a-z0-9.]*[a-z0-9])?$
Optional: {}
backup KubernetesServiceAccountSubject arrayBackup lists additional backup Job ServiceAccount subjects.MaxItems: 32
MaxLength: 340
Pattern: ^system:serviceaccount:[a-z0-9]([-a-z0-9]*[a-z0-9])?:[a-z0-9]([-a-z0-9.]*[a-z0-9])?$
Optional: {}
restore KubernetesServiceAccountSubject arrayRestore lists additional restore Job ServiceAccount subjects.MaxItems: 32
MaxLength: 340
Pattern: ^system:serviceaccount:[a-z0-9]([-a-z0-9]*[a-z0-9])?:[a-z0-9]([-a-z0-9.]*[a-z0-9])?$
Optional: {}
upgrade KubernetesServiceAccountSubject arrayUpgrade lists additional upgrade Job ServiceAccount subjects.MaxItems: 32
MaxLength: 340
Pattern: ^system:serviceaccount:[a-z0-9]([-a-z0-9]*[a-z0-9])?:[a-z0-9]([-a-z0-9.]*[a-z0-9])?$
Optional: {}

SelfInitOIDCConfig

SelfInitOIDCConfig configures OIDC identity for the cluster.

Appears in:

FieldDescriptionDefaultValidation
enabled booleanEnabled triggers the bootstrap logic.
audience stringAudience, if set, must match the operator installation audience used for
projected OpenBao auth tokens.
This field does not create a per-cluster TokenRequest audience override.
Optional: {}
issuer stringIssuer overrides the auto-discovered K8s issuer URL.
Critical for scenarios where OpenBao sees a different K8s URL than the Operator.
Optional: {}
additionalSubjects SelfInitOIDCAdditionalSubjectsAdditionalSubjects adds exact Kubernetes ServiceAccount subjects to the
generated Operator JWT roles. Use these bindings when a snapshot must
remain operable after restore to a target with different ServiceAccount
subjects. Configure the source cluster before self-initialization so the
bindings are present in each snapshot.
These bindings do not configure JWT issuer or signature verification for
another Kubernetes control plane. The jwt-operator auth method must also
trust the target’s projected ServiceAccount tokens.
Optional: {}

SelfInitOperation

Underlying type: string

SelfInitOperation defines valid operations for self-initialization requests.

Validation:

  • Enum: [create read update delete list patch]

Appears in:

FieldDescription
createSelfInitOperationCreate creates a new resource.
readSelfInitOperationRead reads an existing resource.
updateSelfInitOperationUpdate updates an existing resource.
patchSelfInitOperationPatch performs a partial update to an existing resource.
deleteSelfInitOperationDelete deletes an existing resource.
listSelfInitOperationList lists resources.

SelfInitPolicy

SelfInitPolicy provides structured configuration for creating/updating policies via self-init requests. This replaces the need for raw JSON in the Data field. See: https://openbao.org/api-docs/system/policy/

Appears in:

FieldDescriptionDefaultValidation
policy stringPolicy is the HCL or JSON policy content.
This is the actual policy rules that will be applied.
MinLength: 1

SelfInitRequest

SelfInitRequest defines a single API operation to execute during self-initialization.

Appears in:

FieldDescriptionDefaultValidation
name stringName is a unique identifier for this request (used as the block name).
Must match regex ^[A-Za-z_][A-Za-z0-9_-]*$
MaxLength: 64
MinLength: 1
Pattern: ^[A-Za-z_][A-Za-z0-9_-]*$
operation SelfInitOperationOperation is the API operation type: create, read, update, delete, or list.Enum: [create read update delete list patch]
path stringPath is the API path to call (e.g., “sys/audit/stdout”, “auth/kubernetes/config”).MinLength: 1
headers object (keys:string, values:string array)Headers contains additional HTTP headers to send with this self-init request.
Requires OpenBao 2.6.0 or newer.
Header names must not be empty. Values are rendered into OpenBao’s profile-engine
headers request field as map[string][]string.
Optional: {}
when JSONWhen controls whether OpenBao executes this request.
Requires OpenBao 2.6.0 or newer.
Omit it to execute the request. Set it to a JSON boolean for static gating
or to an OpenBao profile value object for dynamic evaluation, for example
{“eval_source”:“cel”,“eval_type”:“bool”,“expression”:“true”}.
Optional: {}
auditDevice SelfInitAuditDeviceAuditDevice configures an audit device when Path starts with “sys/audit/”.
This provides structured configuration for audit devices instead of raw JSON.
Only used when Path matches the pattern “sys/audit/*”.
Optional: {}
authMethod SelfInitAuthMethodAuthMethod configures an auth method when Path starts with “sys/auth/”.
This provides structured configuration for enabling auth methods.
Only used when Path matches the pattern “sys/auth/*”.
Optional: {}
secretEngine SelfInitSecretEngineSecretEngine configures a secret engine when Path starts with “sys/mounts/”.
This provides structured configuration for enabling secret engines.
Only used when Path matches the pattern “sys/mounts/*”.
Optional: {}
policy SelfInitPolicyPolicy configures a policy when Path starts with “sys/policies/”.
This provides structured configuration for creating/updating policies.
Only used when Path matches the pattern “sys/policies/*”.
Optional: {}
data JSONData contains the request payload for paths that don’t have structured types.
This must be a JSON/YAML object whose shape matches the target API endpoint.
Nested maps and lists are supported and are rendered into the initialize stanza as HCL objects.
Note: For common paths, use structured types instead:
- sys/audit/* → use auditDevice
- sys/auth/* → use authMethod
- sys/mounts/* → use secretEngine
- sys/policies/* → use policy
This payload is stored in the OpenBaoCluster resource and persisted in etcd;
it must not contain sensitive values such as tokens, passwords, or unseal keys.
Optional: {}
dataFrom object (keys:string, values:SelfInitDataSource)DataFrom maps top-level request fields to required keys in same-namespace
Secrets. Values are read as strings during first self-initialization.
Requires OpenBao 2.6.0 or newer. Use only with raw request payloads, not
auditDevice, authMethod, secretEngine, policy, or their reserved API paths.
Field names must match ^[A-Za-z_][A-Za-z0-9_-]*$. A field must not occur
in both data and dataFrom.
All requests together can reference at most two distinct Secrets. Mappings,
including their request and field names, are immutable after cluster creation.
Self-init must be enabled at creation and until initialization completes.
Missing inputs block startup before OpenBao initializes, including when
when is false or allowFailure is true. Changes after initialization do not
update OpenBao. The operator does not read or copy the Secret values.
MaxProperties: 64
Optional: {}
allowFailure booleanAllowFailure allows this request to fail without blocking initialization.
Defaults to false.
Optional: {}

SelfInitSecretEngine

SelfInitSecretEngine provides structured configuration for enabling secret engines via self-init requests. This replaces the need for raw JSON in the Data field. See: https://openbao.org/api-docs/system/mounts/

Appears in:

FieldDescriptionDefaultValidation
type stringType is the type of secret engine (e.g., “kv”, “pki”, “transit”, “database”).MinLength: 1
description stringDescription is an optional description for the secret engine.Optional: {}
options object (keys:string, values:string)Options contains optional configuration specific to the secret engine type.
For KV engines, common options include: version (“1” or “2”).
For other engines, options vary by type.
Optional: {}

SelfInitSecretKeyReference

SelfInitSecretKeyReference identifies a bootstrap input without containing its value.

Appears in:

FieldDescriptionDefaultValidation
name stringName is the Secret name. The submitting identity must be authorized to get it.MaxLength: 253
MinLength: 1
Pattern: ^[a-z0-9]([-a-z0-9.]*[a-z0-9])?$
key stringKey is the Secret data key. Its exact contents are used without trimming.MaxLength: 253
MinLength: 1
Pattern: ^[-._a-zA-Z0-9]+$

ServiceAccountConfig

ServiceAccountConfig configures the ServiceAccount used by OpenBao pods.

Appears in:

FieldDescriptionDefaultValidation
name stringName overrides the generated ServiceAccount name.
If not specified, defaults to “<cluster-name>-serviceaccount”.
Optional: {}
annotations object (keys:string, values:string)Annotations to add to the ServiceAccount.
Useful for cloud provider Workload Identity (e.g. eks.amazonaws.com/role-arn).
Optional: {}

ServiceConfig

ServiceConfig controls how the main OpenBao Service is exposed.

Appears in:

FieldDescriptionDefaultValidation
ipFamilyPolicy IPFamilyPolicyIPFamilyPolicy selects single-stack or dual-stack Service allocation.
When omitted, Kubernetes uses its default Service policy.
Two IP families require PreferDualStack or RequireDualStack.
Enum: [SingleStack PreferDualStack RequireDualStack]
Optional: {}
ipFamilies IPFamily arrayIPFamilies selects the Service IP families in primary-first order.
The primary family cannot change after the Service is created.
MaxItems: 2
items:Enum: [IPv4 IPv6]
Optional: {}
type ServiceTypeType is the Kubernetes Service type, for example “ClusterIP” or “LoadBalancer”.Optional: {}
annotations object (keys:string, values:string)Annotations are additional annotations to apply to the Service.Optional: {}

ServiceMonitorAuthorizationConfig

ServiceMonitorAuthorizationConfig configures Prometheus Operator endpoint authorization.

Appears in:

FieldDescriptionDefaultValidation
type stringType is the authorization type.
Defaults to Bearer when credentialsSecret is set.
Optional: {}
credentialsSecret ServiceMonitorKeySelectorCredentialsSecret references a Secret key containing the authorization credentials.
The Secret must exist in the same namespace as the ServiceMonitor.

ServiceMonitorConfig

ServiceMonitorConfig configures the Prometheus ServiceMonitor.

Appears in:

FieldDescriptionDefaultValidation
enabled booleanEnabled controls whether to create the ServiceMonitor.
Defaults to true if Metrics are enabled.
true
interval stringInterval is the scrape interval.30sOptional: {}
scrapeTimeout stringScrapeTimeout is the scrape timeout.10sOptional: {}
labels object (keys:string, values:string)Labels are added to the ServiceMonitor metadata.
Use this for Prometheus selectors, such as release labels used by kube-prometheus-stack.
Optional: {}
annotations object (keys:string, values:string)Annotations are added to the ServiceMonitor metadata.Optional: {}
jobLabel stringJobLabel selects the Service label Prometheus uses as the job label.
Defaults to app.kubernetes.io/name.
Optional: {}
authorization ServiceMonitorAuthorizationConfigAuthorization configures an optional ServiceMonitor authorization block.
Use this for authenticated /v1/sys/metrics scraping.
Optional: {}
tlsConfig ServiceMonitorTLSConfigTLSConfig configures TLS verification for the OpenBao scrape endpoint.Optional: {}

ServiceMonitorKeySelector

ServiceMonitorKeySelector identifies a key in a Secret or ConfigMap.

Appears in:

FieldDescriptionDefaultValidation
name stringName is the Secret or ConfigMap name.MinLength: 1
key stringKey is the key within the Secret or ConfigMap.
Defaults to token for authorization credentials and ca.crt for CA references.
Optional: {}

ServiceMonitorTLSConfig

ServiceMonitorTLSConfig configures TLS settings for the Prometheus Operator endpoint.

Appears in:

FieldDescriptionDefaultValidation
serverName stringServerName verifies the hostname in the OpenBao serving certificate.Optional: {}
insecureSkipVerify booleanInsecureSkipVerify disables TLS certificate verification.
Use only for temporary non-production environments.
Hardened clusters reject insecureSkipVerify=true.
Optional: {}
caConfigMap ServiceMonitorKeySelectorCAConfigMap references a ConfigMap key containing the CA certificate.
Mutually exclusive with CASecret.
Optional: {}
caSecret ServiceMonitorKeySelectorCASecret references a Secret key containing the CA certificate.
Mutually exclusive with CAConfigMap.
Optional: {}

SocketAuditOptions

SocketAuditOptions configures options for socket audit devices. See: https://openbao.org/docs/audit/socket/

Appears in:

FieldDescriptionDefaultValidation
address stringAddress is the socket server address to use.
Example: “127.0.0.1:9090” or “/tmp/audit.sock”.
Optional: {}
socketType stringSocketType is the socket type to use, any type compatible with net.Dial is acceptable.
Defaults to “tcp” if not specified.
Optional: {}
writeTimeout stringWriteTimeout is the (deadline) time in seconds to allow writes to be completed over the socket.
A zero value means that write attempts will not time out.
Defaults to “2s” if not specified.
Optional: {}

StaticSealConfig

StaticSealConfig configures the static seal type. This is the default seal type managed by the operator. See: https://openbao.org/docs/configuration/seal/static/

Appears in:

FieldDescriptionDefaultValidation
currentKey stringCurrentKey is the path to the static unseal key file.
Defaults to “file:///etc/bao/unseal/key” (operator-managed).
Optional: {}
currentKeyID stringCurrentKeyID is the identifier for the current unseal key.
Defaults to “operator-generated-v1” (operator-managed).
Optional: {}

StorageConfig

StorageConfig captures storage-related configuration for the StatefulSet.

Appears in:

FieldDescriptionDefaultValidation
size stringSize is the requested persistent volume size, for example “10Gi”.MinLength: 1
storageClassName stringStorageClassName is an optional StorageClass for the PVCs.Optional: {}

SyslogAuditOptions

SyslogAuditOptions configures options for syslog audit devices. See: https://openbao.org/docs/audit/syslog/

Appears in:

FieldDescriptionDefaultValidation
facility stringFacility is the syslog facility to use.
Defaults to “AUTH” if not specified.
Optional: {}
tag stringTag is the syslog tag to use.
Defaults to “openbao” if not specified.
Optional: {}

TLSConfig

TLSConfig captures TLS configuration for an OpenBaoCluster.

Appears in:

FieldDescriptionDefaultValidation
enabled booleanEnabled controls whether TLS is enabled for the cluster.Required: {}
mode TLSModeMode controls who manages the certificate lifecycle.OperatorManagedEnum: [OperatorManaged External ACME]
Optional: {}
acme ACMEConfigACME configures settings when Mode is ‘ACME’.Optional: {}
rotationPeriod stringRotationPeriod is a duration string (for example, “720h”) controlling certificate rotation.
Only used when Mode is OperatorManaged.
MinLength: 1
Optional: {}
extraSANs string arrayExtraSANs lists additional subject alternative names for server certificates.
In OperatorManaged mode, the operator includes these names when issuing the certificate.
In External mode, the operator requires the supplied certificate to contain them.
Values that parse as IP addresses are treated as IP SANs; all other values are DNS SANs.
Optional: {}

TLSKeyExchangeGroup

Underlying type: string

TLSKeyExchangeGroup identifies a classical or hybrid post-quantum TLS group. Pure MLKEM1024 is not supported by the operator’s default TLS clients.

Validation:

  • Enum: [CurveP256 CurveP384 CurveP521 X25519 X25519MLKEM768 SecP256r1MLKEM768 SecP384r1MLKEM1024]

Appears in:

FieldDescription
CurveP256
CurveP384
CurveP521
X25519
X25519MLKEM768
SecP256r1MLKEM768
SecP384r1MLKEM1024

TLSMode

Underlying type: string

TLSMode controls who manages the certificate lifecycle.

Validation:

  • Enum: [OperatorManaged External ACME]

Appears in:

FieldDescription
OperatorManagedTLSModeOperatorManaged: The operator acts as the CA, generating keys and rotating certs (Current Behavior).
ExternalTLSModeExternal: The operator assumes Secrets are managed by an external entity (cert-manager, user, or CSI driver).
The operator will mount them but NOT modify/rotate them.
ACMETLSModeACME: OpenBao uses its native ACME client to fetch certificates.
No Secrets are mounted. No sidecar is injected. Best for Zero Trust.

TLSVersion

Underlying type: string

TLSVersion identifies a supported TLS protocol version.

Validation:

  • Enum: [tls12 tls13]

Appears in:

FieldDescription
tls12TLSVersion12 selects TLS 1.2.
tls13TLSVersion13 selects TLS 1.3.

TelemetryConfig

TelemetryConfig defines telemetry reporting configuration. See: https://openbao.org/docs/configuration/telemetry/

Appears in:

FieldDescriptionDefaultValidation
usageGaugePeriod stringCommon telemetry options
UsageGaugePeriod specifies the interval at which high-cardinality usage data is collected.
Optional: {}
maximumGaugeCardinality integerMaximumGaugeCardinality is the maximum cardinality of gauge labels.Optional: {}
disableHostname booleanDisableHostname specifies if gauge values should be prefixed with the local hostname.Optional: {}
enableHostnameLabel booleanEnableHostnameLabel specifies if all metric values should contain the host label.Optional: {}
metricsPrefix stringMetricsPrefix specifies the prefix used for metric values.Optional: {}
leaseMetricsEpsilon stringLeaseMetricsEpsilon specifies the size of the bucket used to measure future lease expiration.Optional: {}
prometheusRetentionTime stringPrometheus-specific options
PrometheusRetentionTime specifies how long to retain metrics in Prometheus format.
Optional: {}
statsiteAddress stringStatsite-specific options
StatsiteAddress is the address of the statsite server.
Optional: {}
statsdAddress stringStatsD-specific options
StatsdAddress is the address of the StatsD server.
Optional: {}
dogStatsdAddress stringDogStatsD-specific options
DogStatsdAddress is the address of the DogStatsD server.
Optional: {}
dogStatsdTags string arrayDogStatsdTags are tags to add to all metrics.Optional: {}
circonusAPIKey stringCirconus-specific options
CirconusAPIKey is the API key for Circonus.
Optional: {}
circonusAPIApp stringCirconusAPIApp is the API app name for Circonus.Optional: {}
circonusAPIURL stringCirconusAPIURL is the API URL for Circonus.Optional: {}
circonusSubmissionInterval stringCirconusSubmissionInterval is the submission interval for Circonus.Optional: {}
circonusCheckID stringCirconusCheckID is the check ID for Circonus.Optional: {}
circonusCheckForceMetricActivation stringCirconusCheckForceMetricActivation forces metric activation in Circonus.Optional: {}
circonusCheckInstanceID stringCirconusCheckInstanceID is the instance ID for Circonus.Optional: {}
circonusCheckSearchTag stringCirconusCheckSearchTag is the search tag for Circonus.Optional: {}
circonusCheckDisplayName stringCirconusCheckDisplayName is the display name for Circonus.Optional: {}
circonusCheckTags stringCirconusCheckTags is the tags for Circonus.Optional: {}
circonusBrokerID stringCirconusBrokerID is the broker ID for Circonus.Optional: {}
circonusBrokerSelectTag stringCirconusBrokerSelectTag is the broker select tag for Circonus.Optional: {}
stackdriverProjectID stringStackdriver-specific options
StackdriverProjectID is the Google Cloud Project ID.
Optional: {}
stackdriverLocation stringStackdriverLocation is the GCP or AWS region.Optional: {}
stackdriverNamespace stringStackdriverNamespace is a namespace identifier for the telemetry data.Optional: {}
stackdriverDebugLogs booleanStackdriverDebugLogs specifies if OpenBao writes additional stackdriver debug logs.Optional: {}

TransitSealConfig

TransitSealConfig configures the Transit seal type. See: https://openbao.org/docs/configuration/seal/transit/

Appears in:

FieldDescriptionDefaultValidation
address stringAddress is the full HTTPS address to the OpenBao cluster providing the Transit seal.MinLength: 1
token stringToken is the OpenBao token to use for authentication.
Note: It is strongly recommended to use CredentialsSecretRef instead of setting this directly.
Optional: {}
keyName stringKeyName is the transit key to use for encryption and decryption.MinLength: 1
mountPath stringMountPath is the mount path to the transit secret engine.MinLength: 1
namespace stringNamespace is the namespace path to the transit secret engine.Optional: {}
disableRenewal booleanDisableRenewal disables automatic token renewal.
Set to true if token lifecycle is managed externally (e.g., by OpenBao Agent).
Optional: {}
tlsCACert stringTLSCACert is the path to the CA certificate file for TLS communication.Optional: {}
tlsClientCert stringTLSClientCert is the path to the client certificate for TLS communication.Optional: {}
tlsClientKey stringTLSClientKey is the path to the private key for TLS communication.Optional: {}
tlsServerName stringTLSServerName is the SNI host name to use when connecting via TLS.Optional: {}
tlsSkipVerify booleanTLSSkipVerify disables verification of TLS certificates.
Using this option is highly discouraged and decreases security.
Optional: {}

UnsealConfig

UnsealConfig defines the auto-unseal configuration for an OpenBaoCluster. If omitted, defaults to “static” mode managed by the operator.

Appears in:

FieldDescriptionDefaultValidation
type stringType specifies the seal type.
Defaults to “static”.
staticEnum: [static awskms gcpckms azurekeyvault transit kmip kms ocikms pkcs11]
static StaticSealConfigStatic configures the static seal type.
Optional when Type is “static” (operator provides defaults if omitted).
Optional: {}
transit TransitSealConfigTransit configures the Transit seal type.
Required when Type is “transit”.
Optional: {}
awskms AWSKMSSealConfigAWSKMS configures the AWS KMS seal type.
Required when Type is “awskms”.
Optional: {}
azureKeyVault AzureKeyVaultSealConfigAzureKeyVault configures the Azure Key Vault seal type.
Required when Type is “azurekeyvault”.
Optional: {}
gcpCloudKMS GCPCloudKMSSealConfigGCPCloudKMS configures the GCP Cloud KMS seal type.
Required when Type is “gcpckms”.
Optional: {}
kmip KMIPSealConfigKMIP configures the KMIP seal type.
Required when Type is “kmip”.
Optional: {}
kms KMSPluginSealConfigKMS configures a plugin-backed KMS seal.
Required when Type is “kms”.
Optional: {}
ocikms OCIKMSSealConfigOCIKMS configures the OCI KMS seal type.
Required when Type is “ocikms”.
Optional: {}
pkcs11 PKCS11SealConfigPKCS11 configures the PKCS#11 seal type.
Required when Type is “pkcs11”.
Optional: {}
credentialsSecretRef LocalObjectReferenceCredentialsSecretRef references a Secret containing provider credentials
(for example AWS access keys, GCP credentials.json, Azure client-secret keys,
OCI SDK config for authTypeAPIKey mode, or plugin-backed KMS runtime files).
If using Workload Identity (IRSA, GKE WI, Azure MSI), this can be omitted.
For static unseal, the Secret supplies the original key instead of an
operator-generated key. Its files are mounted at /etc/bao/unseal; the
default currentKey reads its “key” entry. The operator does not create,
modify, or take ownership of this Secret. A cluster that already owns an
operator-generated unseal key keeps that key and ignores this reference.
The Secret must exist in the same namespace as the OpenBaoCluster.
Cross-namespace references are not allowed for security reasons.
Optional: {}

UpdateStrategyType

Underlying type: string

UpdateStrategyType defines the type of update strategy to use.

Validation:

  • Enum: [RollingUpdate BlueGreen]

Appears in:

FieldDescription
RollingUpdateUpdateStrategyRollingUpdate uses a rolling update strategy (default).
BlueGreenUpdateStrategyBlueGreen uses a blue/green deployment strategy.

UpgradeConfig

UpgradeConfig defines configuration for upgrade operations.

Appears in:

FieldDescriptionDefaultValidation
image stringImage is the container image to use for upgrade operations.
This image is used by Kubernetes Jobs created during upgrades (for example, blue/green
cluster orchestration actions). The executor runs inside the tenant namespace and
authenticates to OpenBao using a projected ServiceAccount token (JWT auth).
If not specified, OPERATOR_UPGRADE_IMAGE can supply a complete image reference, including a digest.
Otherwise, defaults to “<repo>:X.Y.Z” where <repo> is derived from OPERATOR_UPGRADE_IMAGE_REPOSITORY
(default: “ghcr.io/kubebao/openbao-upgrade”) and the tag matches OPERATOR_VERSION.
Optional: {}
preUpgradeSnapshot booleanPreUpgradeSnapshot, when true, triggers a backup before any upgrade.
When enabled, the upgrade manager will create a backup using the backup
configuration (spec.backup.target, spec.backup.image, etc.) and
wait for it to complete before proceeding with the upgrade.
If the backup fails, the upgrade will be blocked and a Degraded condition
will be set with Reason=PreUpgradeBackupFailed.
Requires spec.backup to be configured with target, image, and
authentication (jwtAuthRole or tokenSecretRef).
Optional: {}
jwtAuthRole stringJWTAuthRole is the name of the JWT Auth role configured in OpenBao
for upgrade executor Jobs. The executor authenticates with a projected
ServiceAccount token from <cluster-name>-upgrade-serviceaccount.
The role must be configured in OpenBao and must grant the permissions
required by the selected upgrade strategy, including:
- “read” capability on sys/health
- “sudo” and “update” capability on sys/step-down
- “read” capability on sys/storage/raft/autopilot/state
- for Blue/Green, raft join/configuration/remove-peer/promote/demote operations
The role must bind to the upgrade ServiceAccount (<cluster-name>-upgrade-serviceaccount),
which is automatically created by the operator.
If OIDC is enabled during initial SelfInit bootstrap and this field is
empty, a default role named “openbao-operator-upgrade” will be created.
For already-initialized clusters, configure this role explicitly or keep
the default role created during initial bootstrap.
This is the supported authentication mechanism for built-in upgrade orchestration.
Optional: {}
strategy UpdateStrategyTypeStrategy defines the update strategy to use.RollingUpdateEnum: [RollingUpdate BlueGreen]
requests UpgradeRequestConfigRequests defines explicit one-shot operator requests for the current
upgrade workflow. The operator acts only when a request value changes.
Optional: {}
blueGreen BlueGreenConfigBlueGreen configures the behavior when Strategy is BlueGreen.Optional: {}

UpgradeProgress

UpgradeProgress tracks the state of an in-progress upgrade.

Appears in:

FieldDescriptionDefaultValidation
executionID stringExecutionID identifies the current rolling upgrade attempt.
It remains stable across controller restarts and changes when a retry is accepted.
Older in-flight upgrades can omit it until an explicit retry is accepted.
Optional: {}
targetVersion stringTargetVersion is the version being upgraded to.
fromVersion stringFromVersion is the version being upgraded from.
startedAt TimeStartedAt is when the upgrade began.Optional: {}
currentPartition integerCurrentPartition is the current StatefulSet partition value.
completedPods integer arrayCompletedPods lists ordinals of pods that have been successfully upgraded.Optional: {}
lastStepDownTime TimeLastStepDownTime records when the last leader step-down was performed.Optional: {}
failure ControllerErrorStatusFailure is the structured rolling-upgrade failure status.
When Failure.Reason is non-empty, the upgrade is considered failed.
Optional: {}

UpgradeRequestConfig

UpgradeRequestConfig defines one-shot operator requests for upgrade workflows.

Appears in:

FieldDescriptionDefaultValidation
retry stringRetry requests a retry of the current failed rolling upgrade when changed
to a new non-empty value.
The operator compares this value against status.upgradeRequests.lastHandledRetry
and acts only when the value changes. Recommended value is an RFC3339
timestamp string.
MinLength: 1
Optional: {}
promote stringPromote requests promotion of a held blue/green upgrade when changed to a
new non-empty value while spec.upgrade.blueGreen.autoPromote=false.
The operator compares this value against
status.upgradeRequests.lastHandledPromote and acts only when the value
changes. Recommended value is an RFC3339 timestamp string.
MinLength: 1
Optional: {}
rollback stringRollback requests a manual abort or rollback of the current blue/green
upgrade when changed to a new non-empty value.
The operator compares this value against
status.upgradeRequests.lastHandledRollback and acts only when the value
changes. Recommended value is an RFC3339 timestamp string.
MinLength: 1
Optional: {}

UpgradeRequestStatus

UpgradeRequestStatus tracks which explicit upgrade request values have already been handled.

Appears in:

FieldDescriptionDefaultValidation
lastHandledRetry stringLastHandledRetry is the last observed spec.upgrade.requests.retry value
that the operator has handled.
Optional: {}
lastHandledPromote stringLastHandledPromote is the last observed spec.upgrade.requests.promote
value that the operator has handled.
Optional: {}
lastHandledRollback stringLastHandledRollback is the last observed spec.upgrade.requests.rollback
value that the operator has handled.
Optional: {}

ValidationHookConfig

ValidationHookConfig defines a user-supplied validation Job.

Appears in:

FieldDescriptionDefaultValidation
image stringImage is the container image for the validation job.MinLength: 1
command string arrayCommand is the command to run.Optional: {}
args string arrayArgs are arguments passed to the command.Optional: {}
timeoutSeconds integerTimeoutSeconds is the job timeout (default: 300s).300Optional: {}

VerificationConfig

VerificationConfig allows defining custom health checks before promotion.

Appears in:

FieldDescriptionDefaultValidation
minSyncDuration stringMinSyncDuration ensures the Green cluster stays healthy as a non-voter
for at least this duration before promotion (e.g., “5m”).
Optional: {}
prePromotionHook ValidationHookConfigPrePromotionHook specifies a Job template to run before promoting Green.
The job must complete successfully (exit 0) for promotion to proceed.
If the job fails, the operator either aborts or rolls back automatically
when blueGreen.autoRollback.onValidationFailure is enabled; otherwise it
holds for manual resolution.
The operator assigns the hook a stable identity for each upgrade attempt.
It does not recreate a missing Job after Job creation is committed.
Optional: {}

WorkloadControllerStatus

WorkloadControllerStatus holds status owned by the workload controller.

Appears in:

FieldDescriptionDefaultValidation
policyRevision stringPolicyRevision identifies the last complete built-in policy bundle verified
or repaired successfully. This records reconciliation progress, not authorization.
Optional: {}
policyReconciliation PolicyReconciliationStatusPolicyReconciliation records individual policy observations and retry scheduling.Optional: {}
lastError ControllerErrorStatusLastError is the last workload-controller error observed for this cluster.Optional: {}

WorkloadHardeningConfig

WorkloadHardeningConfig configures optional workload hardening features.

Appears in:

FieldDescriptionDefaultValidation
appArmorEnabled booleanAppArmorEnabled controls whether the operator sets AppArmor profiles on
generated Pods and Jobs. Some Kubernetes environments do not support AppArmor;
this is opt-in to avoid scheduling failures.
Optional: {}

WorkloadIdentityConfig

WorkloadIdentityConfig configures cloud workload identity metadata for backup and restore workloads.

Appears in:

FieldDescriptionDefaultValidation
serviceAccountAnnotations object (keys:string, values:string)ServiceAccountAnnotations are merged into the generated backup or restore ServiceAccount.
An existing restore executor ServiceAccount must already have these annotations;
the operator validates them without modifying that account.
This is typically used for provider-specific bindings such as GKE Workload Identity
or webhook-based AWS/Azure workload identity integrations.
Optional: {}
podLabels object (keys:string, values:string)PodLabels are merged into the generated backup or restore Job pod template.
This is typically used for provider-specific selectors such as Azure Workload Identity.
Operator-managed labels take precedence if the same key is specified here.
Optional: {}

Search the handbook

Try “install”, “threat model”, or “compatibility”.