External Secrets Operator Knowledge Patch
Use this skill when designing, reviewing, upgrading, or troubleshooting
External Secrets Operator (ESO) resources, providers, Helm installations,
push workflows, generators, and templates.
How to use this skill
- Identify the installed chart, controller, and CRD versions from the project.
- Read the reference matching the resource or provider being changed.
- Treat manifests, rendered charts, CRDs, controller flags, and observed status
as the source of truth when they differ from this guidance.
- Review breaking behavior and security implications before an upgrade.
- Validate the rendered Kubernetes resources and provider-side effects.
Reference index
| Reference |
Read for |
| API and reconciliation |
ExternalSecret, stores, refresh policies, metadata, selectors, status, reconciliation, and API validation |
| Cloud and Kubernetes providers |
AWS, GCP, Azure, IBM, Kubernetes, Cloud.ru, Yandex, Volcengine, Barbican, and other cloud providers |
| Helm, operations, and security |
chart values, CRDs, probes, metrics, RBAC, network policy, availability, release artifacts, and custom builds |
| Push workflows |
PushSecret, ClusterPushSecret, dataTo, update/deletion policy, replication, and provider writes |
| Templates, generators, and CLI |
template semantics and functions, templateFrom, generators, dynamic targets, and esoctl |
| Vault and integration providers |
Vault, OpenBao, 1Password, Infisical, Akeyless, Passbolt, GitHub, Grafana, Delinea, and other integrations |
Breaking changes and migration checks
Removed providers
Alibaba and Device42 were removed in 2.0.0 because they were unsupported and
unmaintained. Migrate every store that uses either provider before upgrading.
Removed template and generator behavior
getHostByName is no longer available to templates. Replace DNS lookups with
explicit data supplied to the template.
- The
STSSessionToken generator no longer supports JWT-token
authentication. Select another supported authentication path.
- Kubernetes-provider pushes replace the whole destination Secret; they do not
merge with keys already present remotely.
Image registry migration
The default controller image moved from
oci.external-secrets.io/external-secrets/external-secrets to
ghcr.io/external-secrets/external-secrets. Update pinned or overridden image
repositories; the chart repository itself remains on GitHub Pages.
API assumptions to remove
- Use
apiVersion: external-secrets.io/v1 in provider examples and current
ExternalSecret manifests.
- Do not rely on omitted optional strategy fields being defaulted back into an
ExternalSecret object.
ClusterExternalSecret.spec.namespaceSelectors is the plural, ORed selector
list. The singular selector and explicit namespaces field are deprecated.
target.template.metadata replaces implicit metadata copying. Empty label or
annotation maps intentionally suppress copying.
- Invalid
ExternalSecretRewrite, generator reference types, and namespaced
secretRef values are rejected earlier by validation.
ExternalSecret quick reference
Refresh policy
Periodic is the default.
- With
Periodic, a zero refreshInterval performs the initial fetch and
create but does not update later.
OnChange ignores the interval and responds only to metadata or spec changes.
CreatedOnce repairs a changed or deleted target while its status survives;
recreating the ExternalSecret resets that status and may overwrite the
target.
- For a generated credential that must survive deletion and never be replaced,
combine
refreshPolicy: CreatedOnce, creationPolicy: Orphan, and an
immutable target.
Manual refresh
Use the correct annotation for the object:
kubectl annotate es my-es force-sync=$(date +%s) --overwrite
kubectl annotate ces my-ces external-secrets.io/force-sync=$(date +%s) --overwrite
Changing or deleting the cluster-scoped annotation propagates to owned
ExternalSecret objects. A manual refresh works only when the selected policy
supports refreshing.
Creation and synchronization
CreateOrMerge is accepted as a target creation policy.
SecretStore.refreshInterval accepts duration strings.
- Sync windows can gate periodic
ExternalSecret refreshes.
- Dynamic targets allow a source to choose its target at reconciliation time.
objectMeta and ownerReferences propagate to target resources.
- A configurable source null-byte policy controls handling of embedded nulls.
Cluster fan-out
Each ExternalSecret created by a ClusterExternalSecret independently polls
its provider. For many namespaces, fetch once into a dedicated namespace and
replicate through a Kubernetes-provider ClusterSecretStore to reduce upstream
calls.
Namespace selector entries are ORed. A collision with an existing
ExternalSecret is a failed namespace; it is not taken over.
PushSecret quick reference
Input and lifecycle
A namespaced PushSecret selects exactly one source: a Kubernetes Secret or a
generatorRef. It may apply template and templateFrom, then maps outgoing
keys through data[].match.
updatePolicy: Replace permits overwrites.
deletionPolicy defaults to None; use Delete for provider cleanup.
- A referenced
SecretStore receives a finalizer when deletion policy requires
remote cleanup.
- Inspect the generated
PushSecret status for provider synchronization
failures; ClusterPushSecret readiness reports child provisioning, not the
provider write result.
Bulk expansion with dataTo
spec.dataTo expands all or regexp-selected keys from the selected Kubernetes
Secret. Each entry needs a storeRef, and the store must also appear in
secretStoreRefs.
- Without
remoteKey, each match becomes a separate remote secret or variable.
- With
remoteKey, all matches become one JSON object and rewrites do not apply.
- Template output precedes expansion; conversion precedes matching and rewrite.
- Explicit
spec.data wins for the same original, unconverted source key.
- Invalid regexps and duplicate remote keys fail; no matches is a successful
no-op.
IfNotExists applies to each expanded target, and Delete tracks all of them
for cleanup.
Read Push workflows before depending on a
provider's write, merge, existence-check, or deletion behavior; capabilities
vary by provider.
Helm and operational quick reference
CRDs and controllers
CRD creation, reconciliation, and conversion are separate switches. Pair every
disabled crds.create* value with the corresponding process* value. If the
webhook is disabled, disable CRD conversion too, or the API server will call a
missing conversion endpoint.
Namespace scope and RBAC
scopedRBAC: true with scopedNamespace creates a namespace-only installation
and implicitly disables cluster-scoped controllers. When scopedNamespace is
omitted, it defaults to the Helm release namespace.
Provider authentication through serviceAccountRef needs TokenRequest access.
Disable the broad token-creation rule with
rbac.serviceAccountTokenCreate: false, then grant serviceaccounts/token
creation only for the referenced accounts by resourceNames.
genericTargets.enabled expands controller authority to ConfigMaps and every
configured extra API resource. Review each API group, verb, encryption rule,
and admission policy before enabling it.
Health, metrics, and availability
- Controller, cert-controller, and webhook liveness probes are configurable;
readiness and webhook startup probes are also configurable.
- Metrics can use secure serving plus
FilterProvider authentication and
authorization, but TLS and authentication are not secure-by-default chart
assumptions.
- The controller defaults to one replica; availability controls such as extra
replicas, probes, and PodDisruptionBudgets must be enabled deliberately.
- Give independent deployments in the same namespace distinct leader-election
IDs; lease timing and store requeue timing are configurable.
- PDB percentage and explicit zero values render correctly.
Network and pod security
Restricted pod security defaults do not make the chart a complete hardened
deployment. NetworkPolicy is optional, and default role aggregation and token
permissions require review. Limit egress to DNS, the Kubernetes API, and the
selected provider endpoints; restrict ClusterSecretStore references and deny
unused providers where policy tooling allows it.
Provider selection quick reference
Provider maturity and individual capabilities are separate questions. Before
choosing a provider, verify store validation, find, extraction, metadata,
referent authentication, push, merge, and delete support independently.
Notable current choices include dedicated OpenBao support, AWS Certificate
Manager, Barbican, Cloud.ru Secret Manager, Devolutions Server, Nebius
MysteryBox, OVHcloud, Volcengine, and BeyondTrust WorkloadCredentials. Custom
builds can use provider build tags to exclude providers that are not needed.
For provider-specific authentication, lookup, path, replication, metadata,
cache, error, or write semantics, load the appropriate provider reference
before editing a store.
Verification checklist
- Confirm the installed controller, chart, and CRDs agree.
- Render Helm output and inspect RBAC, probes, PDBs, Services, webhook
configuration, conversion, NetworkPolicy, scheduler, and RuntimeClass.
- Validate namespace boundaries for stores, referents, provider credentials,
and cluster-scoped fan-out.
- Check update and deletion policies against the provider's actual write and
delete capabilities.
- Inspect
ExternalSecret, PushSecret, and store conditions and events;
provider errors are not always equivalent to missing secrets.
- Test metadata-only updates, target recreation, key removal, replication, and
cleanup in a non-production namespace before rollout.
- Verify release images by immutable digest and validate their signature,
provenance, and SBOM attestations when artifact identity matters.
1---2name: external-secrets-knowledge-patch3description: External Secrets Operator4license: MIT5---678# External Secrets Operator Knowledge Patch910Use this skill when designing, reviewing, upgrading, or troubleshooting11External Secrets Operator (ESO) resources, providers, Helm installations,12push workflows, generators, and templates.1314## How to use this skill15161. Identify the installed chart, controller, and CRD versions from the project.172. Read the reference matching the resource or provider being changed.183. Treat manifests, rendered charts, CRDs, controller flags, and observed status19 as the source of truth when they differ from this guidance.204. Review breaking behavior and security implications before an upgrade.215. Validate the rendered Kubernetes resources and provider-side effects.2223## Reference index2425| Reference | Read for |26| --- | --- |27| [API and reconciliation](references/api-and-reconciliation.md) | `ExternalSecret`, stores, refresh policies, metadata, selectors, status, reconciliation, and API validation |28| [Cloud and Kubernetes providers](references/cloud-and-kubernetes-providers.md) | AWS, GCP, Azure, IBM, Kubernetes, Cloud.ru, Yandex, Volcengine, Barbican, and other cloud providers |29| [Helm, operations, and security](references/helm-operations-security.md) | chart values, CRDs, probes, metrics, RBAC, network policy, availability, release artifacts, and custom builds |30| [Push workflows](references/push-workflows.md) | `PushSecret`, `ClusterPushSecret`, `dataTo`, update/deletion policy, replication, and provider writes |31| [Templates, generators, and CLI](references/templates-generators-cli.md) | template semantics and functions, `templateFrom`, generators, dynamic targets, and `esoctl` |32| [Vault and integration providers](references/vault-and-integration-providers.md) | Vault, OpenBao, 1Password, Infisical, Akeyless, Passbolt, GitHub, Grafana, Delinea, and other integrations |3334## Breaking changes and migration checks3536### Removed providers3738Alibaba and Device42 were removed in 2.0.0 because they were unsupported and39unmaintained. Migrate every store that uses either provider before upgrading.4041### Removed template and generator behavior4243- `getHostByName` is no longer available to templates. Replace DNS lookups with44 explicit data supplied to the template.45- The `STSSessionToken` generator no longer supports JWT-token46 authentication. Select another supported authentication path.47- Kubernetes-provider pushes replace the whole destination Secret; they do not48 merge with keys already present remotely.4950### Image registry migration5152The default controller image moved from53`oci.external-secrets.io/external-secrets/external-secrets` to54`ghcr.io/external-secrets/external-secrets`. Update pinned or overridden image55repositories; the chart repository itself remains on GitHub Pages.5657### API assumptions to remove5859- Use `apiVersion: external-secrets.io/v1` in provider examples and current60 `ExternalSecret` manifests.61- Do not rely on omitted optional strategy fields being defaulted back into an62 `ExternalSecret` object.63- `ClusterExternalSecret.spec.namespaceSelectors` is the plural, ORed selector64 list. The singular selector and explicit `namespaces` field are deprecated.65- `target.template.metadata` replaces implicit metadata copying. Empty label or66 annotation maps intentionally suppress copying.67- Invalid `ExternalSecretRewrite`, generator reference types, and namespaced68 `secretRef` values are rejected earlier by validation.6970## ExternalSecret quick reference7172### Refresh policy7374- `Periodic` is the default.75- With `Periodic`, a zero `refreshInterval` performs the initial fetch and76 create but does not update later.77- `OnChange` ignores the interval and responds only to metadata or spec changes.78- `CreatedOnce` repairs a changed or deleted target while its status survives;79 recreating the `ExternalSecret` resets that status and may overwrite the80 target.81- For a generated credential that must survive deletion and never be replaced,82 combine `refreshPolicy: CreatedOnce`, `creationPolicy: Orphan`, and an83 immutable target.8485### Manual refresh8687Use the correct annotation for the object:8889```sh90kubectl annotate es my-es force-sync=$(date +%s) --overwrite91kubectl annotate ces my-ces external-secrets.io/force-sync=$(date +%s) --overwrite92```9394Changing or deleting the cluster-scoped annotation propagates to owned95`ExternalSecret` objects. A manual refresh works only when the selected policy96supports refreshing.9798### Creation and synchronization99100- `CreateOrMerge` is accepted as a target creation policy.101- `SecretStore.refreshInterval` accepts duration strings.102- Sync windows can gate periodic `ExternalSecret` refreshes.103- Dynamic targets allow a source to choose its target at reconciliation time.104- `objectMeta` and `ownerReferences` propagate to target resources.105- A configurable source null-byte policy controls handling of embedded nulls.106107### Cluster fan-out108109Each `ExternalSecret` created by a `ClusterExternalSecret` independently polls110its provider. For many namespaces, fetch once into a dedicated namespace and111replicate through a Kubernetes-provider `ClusterSecretStore` to reduce upstream112calls.113114Namespace selector entries are ORed. A collision with an existing115`ExternalSecret` is a failed namespace; it is not taken over.116117## PushSecret quick reference118119### Input and lifecycle120121A namespaced `PushSecret` selects exactly one source: a Kubernetes Secret or a122`generatorRef`. It may apply `template` and `templateFrom`, then maps outgoing123keys through `data[].match`.124125- `updatePolicy: Replace` permits overwrites.126- `deletionPolicy` defaults to `None`; use `Delete` for provider cleanup.127- A referenced `SecretStore` receives a finalizer when deletion policy requires128 remote cleanup.129- Inspect the generated `PushSecret` status for provider synchronization130 failures; `ClusterPushSecret` readiness reports child provisioning, not the131 provider write result.132133### Bulk expansion with dataTo134135`spec.dataTo` expands all or regexp-selected keys from the selected Kubernetes136Secret. Each entry needs a `storeRef`, and the store must also appear in137`secretStoreRefs`.138139- Without `remoteKey`, each match becomes a separate remote secret or variable.140- With `remoteKey`, all matches become one JSON object and rewrites do not apply.141- Template output precedes expansion; conversion precedes matching and rewrite.142- Explicit `spec.data` wins for the same original, unconverted source key.143- Invalid regexps and duplicate remote keys fail; no matches is a successful144 no-op.145- `IfNotExists` applies to each expanded target, and `Delete` tracks all of them146 for cleanup.147148Read [Push workflows](references/push-workflows.md) before depending on a149provider's write, merge, existence-check, or deletion behavior; capabilities150vary by provider.151152## Helm and operational quick reference153154### CRDs and controllers155156CRD creation, reconciliation, and conversion are separate switches. Pair every157disabled `crds.create*` value with the corresponding `process*` value. If the158webhook is disabled, disable CRD conversion too, or the API server will call a159missing conversion endpoint.160161### Namespace scope and RBAC162163`scopedRBAC: true` with `scopedNamespace` creates a namespace-only installation164and implicitly disables cluster-scoped controllers. When `scopedNamespace` is165omitted, it defaults to the Helm release namespace.166167Provider authentication through `serviceAccountRef` needs TokenRequest access.168Disable the broad token-creation rule with169`rbac.serviceAccountTokenCreate: false`, then grant `serviceaccounts/token`170creation only for the referenced accounts by `resourceNames`.171172`genericTargets.enabled` expands controller authority to ConfigMaps and every173configured extra API resource. Review each API group, verb, encryption rule,174and admission policy before enabling it.175176### Health, metrics, and availability177178- Controller, cert-controller, and webhook liveness probes are configurable;179 readiness and webhook startup probes are also configurable.180- Metrics can use secure serving plus `FilterProvider` authentication and181 authorization, but TLS and authentication are not secure-by-default chart182 assumptions.183- The controller defaults to one replica; availability controls such as extra184 replicas, probes, and PodDisruptionBudgets must be enabled deliberately.185- Give independent deployments in the same namespace distinct leader-election186 IDs; lease timing and store requeue timing are configurable.187- PDB percentage and explicit zero values render correctly.188189### Network and pod security190191Restricted pod security defaults do not make the chart a complete hardened192deployment. NetworkPolicy is optional, and default role aggregation and token193permissions require review. Limit egress to DNS, the Kubernetes API, and the194selected provider endpoints; restrict `ClusterSecretStore` references and deny195unused providers where policy tooling allows it.196197## Provider selection quick reference198199Provider maturity and individual capabilities are separate questions. Before200choosing a provider, verify store validation, find, extraction, metadata,201referent authentication, push, merge, and delete support independently.202203Notable current choices include dedicated OpenBao support, AWS Certificate204Manager, Barbican, Cloud.ru Secret Manager, Devolutions Server, Nebius205MysteryBox, OVHcloud, Volcengine, and BeyondTrust WorkloadCredentials. Custom206builds can use provider build tags to exclude providers that are not needed.207208For provider-specific authentication, lookup, path, replication, metadata,209cache, error, or write semantics, load the appropriate provider reference210before editing a store.211212## Verification checklist213214- Confirm the installed controller, chart, and CRDs agree.215- Render Helm output and inspect RBAC, probes, PDBs, Services, webhook216 configuration, conversion, NetworkPolicy, scheduler, and RuntimeClass.217- Validate namespace boundaries for stores, referents, provider credentials,218 and cluster-scoped fan-out.219- Check update and deletion policies against the provider's actual write and220 delete capabilities.221- Inspect `ExternalSecret`, `PushSecret`, and store conditions and events;222 provider errors are not always equivalent to missing secrets.223- Test metadata-only updates, target recreation, key removal, replication, and224 cleanup in a non-production namespace before rollout.225- Verify release images by immutable digest and validate their signature,226 provenance, and SBOM attestations when artifact identity matters.