External Secrets Operator#
Overview#
External Secrets Operator (ESO) syncs secrets from OpenBao KV into native Kubernetes Secret resources, for consumers that read their secrets from disk. ESO is delivered as an Argo CD Application after OpenBao, before the consumers that depend on it.
How it works#
ESO runs the upstream external-secrets controller and uses the OpenBao (HashiCorp Vault) provider to authenticate to OpenBao with the Kubernetes auth method and read KV-v2 paths under the nmc mount.
Each consumer owns its own integration objects rather than sharing a cluster-wide one:
A per-namespace
SecretStore, keyed to that consumer’s own Kubernetes auth role. The role scopes which KV paths the consumer can read.One or more
ExternalSecretresources that map KV fields into a namedSecretin the consumer’s namespace.
ESO reconciles each target Secret against its KV source. Keycloak owns its SecretStore and a database ExternalSecret. That ExternalSecret syncs keycloak/database into the keycloak-cnpg-cluster-password Secret in the keycloak namespace. Refer to Keycloak for how the database consumes that Secret. Launchpad reads the shared NGC image-pull credential the same way.
Configuration#
Add these settings under the externalSecrets key in values.yaml. The key
already carries the pinned version and syncWave from
Installing GitOps-Managed Components; the following fields are the ones you set. A field shown
with a value uses that value as its default when you omit it.
externalSecrets:
enabled: true # optional, deploy the ESO Application
replicaCount: 2 # optional, controller replicas for high availability
webhookReplicaCount: 1 # optional, webhook replicas
certControllerReplicaCount: 1 # optional, cert-controller replicas
serviceMonitorEnabled: true # optional, Prometheus ServiceMonitor
enabled– deploy the ESO Application. Defaulttrue.replicaCount– controller replica count. Default2for high availability.webhookReplicaCount– webhook replica count. Default1.certControllerReplicaCount– cert-controller replica count. Default1.serviceMonitorEnabled– emit aServiceMonitorfor Prometheus scraping. Defaulttrue.
The Application installs the ESO CRDs (SecretStore, ExternalSecret) consumed by the Keycloak and Launchpad tiers, so it must sync before any Application that declares those resources.
Secrets#
External Secrets Operator consumes no bootstrap secrets. It reads the OpenBao KV paths the configure Job populates, using each consumer’s reader role.
Verify#
Confirm the ESO Application is Healthy and Synced in Argo CD, then confirm the controller, webhook, and cert-controller pods are running:
kubectl -n external-secrets get pods
Confirm a target Secret is being reconciled from KV by checking that the consumer’s ExternalSecret reports Ready and that its target Secret is present:
kubectl -n keycloak get externalsecret
kubectl -n keycloak get secret keycloak-cnpg-cluster-password
A Ready ExternalSecret with its target Secret present confirms ESO read the KV source.