Skip to main content
Secret values never live in git. They are stored in your secret backend and projected into the cluster by the External Secrets Operator. You configure very few of them by hand.

How secrets are delivered

Secret delivery contract showing names in git, secret values in the backend, External Secrets materialization, and runtime Kubernetes Secrets For the default gcpsm backend, make seed-secrets writes the internal random values via gcloud. For any other backend it has no assumed CLI, so it prints the key list plus the ESO provider docs link and you create the values yourself (scripts/seed-secrets.sh). Every ExternalSecret references one store named secret-store, so ESO materialises them as native Kubernetes Secrets at runtime. The backend is the single source of truth, which is why secrets survive a cluster rebuild.

The secrets

After make seed-secrets, a typical fork has zero to three secrets left to create by hand. A minimal run (local models, no public DNS) needs none.

Backend access

How the cluster authenticates to the backend itself:

No hosted secret store

You do not need a cloud secret manager. If you have none (bare metal, or you already manage secrets with Sealed Secrets or kubectl), point the store at the ESO Kubernetes provider, which reads Secrets from an in-cluster source namespace. ESO stays the single mechanism; only the store’s provider block changes.
You then create the source Secrets in secret-source however you like, including committing them as Sealed Secrets (encrypted, safe in git) that the sealed-secrets controller decrypts in place. Use the secret contract for the exact names and keys. One adaptation to know: a Kubernetes Secret is a key/value map, not a single string, so the Kubernetes provider needs remoteRef.property to name the data key (a hosted string backend like GSM does not). The platform’s ExternalSecrets are single-value, so under this provider add property: to each, matching the data key of your source Secret.

Secret contract

What each ExternalSecret produces. A non-GSM source (Kubernetes provider, Vault, etc.) must supply these keys; the consuming workloads mount the Kubernetes Secret by name regardless of backend. The static Dex admin password is never committed. make seed-secrets stores the retrievable operator copy in the backend as dex-admin-password, stores the bcrypt hash in dex-admin-hash, and mirrors the password into gitignored secrets/dex-admin-password. Dex reads only the hash from env via staticPasswords[].hashFromEnv. Existing hash-only forks cannot recover the password; run make reset-dex-admin once to rotate and persist both backend keys. See Configure for backend, DNS, and SSO setup.