Mode 1 (the default
ClusterSecretStore setup) is available in APC 2.0 and later. Modes 2 and 3 and the other options in this document require APC 2.1 or later.- Mode 1 — Default shared identity: unchanged from previous releases. ESO uses its standard chart RBAC. No extra setup.
- Mode 2 — Hardened shared identity: you set
external-secrets.rbac.create: falseto disable the ESO sub-chart’s default RBAC, then apply Astronomer’s minimalClusterRoleandClusterRoleBinding. - Mode 3 — Customer-managed isolated identity: namespace pools, with per-namespace RBAC and a per-namespace secret store that you provision.
<release-name> is the Helm release name you install the Astronomer chart with (for example astronomer).
The manifests and chart values in this document assume the platform is installed in the
astronomer namespace. If you installed it into a different namespace, replace astronomer accordingly throughout.Prerequisites
- An APC data plane cluster with data plane failover enabled (
global.dataPlaneFailover.enabled: true). Mode 1 is available in APC 2.0 and later; Modes 2 and 3 require APC 2.1 or later. - ESO custom resource definitions installed on the cluster — either by the chart (default) or by you. See Install the ESO CRDs yourself.
- Backend authentication ready — either a workload identity (AWS IRSA, GKE Workload Identity, or Vault Kubernetes auth) or a cloud credential pair.
kubectlaccess to the cluster. For Mode 3, this can be a limited-privilege user.
Common setup (Modes 1 and 2)
The shared-identity modes need a platform namespace, backend credentials, and one secret store. Full manifests are in the manifests reference.1
Create the platform namespace
2
Create the credentials secret
Create the backend credentials in the
astronomer namespace. Skip this if you use workload identity.3
Create the secret store
Create a cluster-scoped
ClusterSecretStore. In Mode 2 you can instead create a namespaced SecretStore annotated with astronomer.io/commander-sync that the platform syncs to all Deployment namespaces. See Secret store manifests.If you use custom release names, set
forceDeleteWithoutRecovery: true on the AWS provider in your store. AWS Secrets Manager soft-deletes secrets by default, with a 30-day recovery window, so reusing a release name for a new Deployment can collide with the still-recoverable secret from the one you deleted. Hard-deleting avoids the collision, at the cost of no recovery window. See Force-delete secrets in AWS Secrets Manager.Runbook: Mode 1 — Default shared identity
No ESO-specific configuration is required beyond the common setup for most backends. Install the platform as usual. ESO uses its standard chart-managed RBAC — with ServiceAccount token creation disabled by default — and Deployments authenticate as the shared identity through the secret store you created. If your backend is Hashicorp Vault, re-enable token creation (unpinned) by settingexternal-secrets.rbac.serviceAccountTokenCreate: true, because Vault’s Kubernetes auth needs ESO to mint a ServiceAccount token.
Runbook: Mode 2 — Hardened shared identity
Start from Mode 1, then create ESO’s ServiceAccount and RBAC and disable the chart’s ESO RBAC and ServiceAccount creation, so ESO uses the objects you provisioned. Provision the ServiceAccount and RBAC before you install the platform, so ESO starts with them already in place.1
Complete the common setup
Create the credentials secret and a shared secret store.
2
Create the ESO ServiceAccount
Create the ESO controller ServiceAccount in the
astronomer namespace, so it exists before ESO starts. See ESO controller ServiceAccount.3
Apply the provided ESO RBAC manifests
Apply the minimal
ClusterRole and ClusterRoleBinding Astronomer provides, before you install the platform. They scope ESO’s cluster access and pin ServiceAccount token creation to the ServiceAccount you created in the astronomer namespace. See Mode 2 hardened ESO cluster RBAC.4
Set the platform values
Disable the ESO sub-chart’s default RBAC and ServiceAccount creation, point ESO at the ServiceAccount you created, and turn off the cluster-scoped secret processing the platform doesn’t use.
With
external-secrets.rbac.create: false, the chart skips its ESO RBAC entirely — including the serviceAccountTokenCreate token rule — so the pinned token creation comes from the manifests you applied in the previous step. With serviceAccount.create: false, the chart uses the ServiceAccount you created earlier instead of creating its own.5
Install or upgrade the platform and verify
Runbook: Mode 3 — Customer-managed isolated identity
The chart creates no cluster roles. You pre-provision the namespaces, per-namespace roles, and a per-namespace secret store, and install with a limited-privilege user. Use this for per-Deployment identity isolation, or when your organization requires you to provision all RBAC yourself. You can substitute your own role definitions for the generated ones. Mode 3 builds on the namespace pools feature. Complete the standard namespace pools setup first. The ESO objects described here are in addition to it.1
Pre-provision namespaces and the installer identity
Create the pool namespaces, then create a limited-privilege installer identity. Generate it with the provided script, or apply the reference installer
Role from the manifests reference:2
Create the ESO controller ServiceAccount
Create the ESO controller ServiceAccount
<release-name>-external-secrets in the astronomer namespace, so it exists before ESO starts. The chart doesn’t create it, because you set serviceAccount.create: false in the platform values (the next step). See ESO controller ServiceAccount.3
Pre-provision the per-namespace ESO chain
In each pool namespace, pre-provision the per-namespace ServiceAccount, namespaced For failover, pre-provision the same chain, with matching namespace names, on every cluster a Deployment can fail over to, and make sure your backend trust spans those clusters.
SecretStore, ESO reconcile Role and RoleBinding, and the resourceNames-pinned token-creation Role and RoleBinding. You must also provision the RBAC for the other platform components — Commander, kube-state-metrics, the Houston DB bootstrapper hook, Prometheus, and NGINX — not just ESO. See Component RBAC for restricted mode. Every namespace’s SecretStore must be named the same value as global.dataPlaneFailover.externalSecretManagerName, which you set per cluster when you enable data plane failover; only the name must match across namespaces, and each store’s contents can differ.Apply the full set from the manifests reference, or generate the platform RBAC with:4
Set the platform values
With the ServiceAccount and RBAC in place, install with cluster roles disabled, namespace pools enabled, and ESO pointed at the ServiceAccount you created.
5
Install and verify
Run the
helm upgrade with these values, then confirm the RBAC state. See Verify the RBAC state.Install the ESO CRDs yourself
By default the APC chart installs the ESO CRDs. To install them yourself — for example, when a separate infrastructure team owns CRD installation — set the chart value that disables CRD creation and apply the CRDs before installing the platform. This is optional and independent of the mode, and it’s most relevant to Modes 2 and 3.kubectl apply command, see Install the ESO CRDs yourself.
Use Vault as your backend
If your secret backend is Hashicorp Vault, ESO authenticates to Vault with the Kubernetes auth method — ESO presents its ServiceAccount token, and Vault validates it and issues a Vault token. AppRole and token auth aren’t supported in 2.1, because they would require storing a static credential in the cluster. Because ESO must mint its own ServiceAccount token to authenticate, Vault backends require ServiceAccount token creation to be enabled: in Mode 1, setexternal-secrets.rbac.serviceAccountTokenCreate: true (unpinned); Modes 2 and 3 grant it through their applied manifests, pinned to the relevant ServiceAccount.
For the full setup, see Configure Hashicorp Vault for data plane failover: create a Vault policy, enable a Kubernetes auth mount per data plane cluster, create a Vault role, and reference it from your SecretStore or ClusterSecretStore with a provider.vault block that uses auth.kubernetes.
The Vault role maps a Kubernetes ServiceAccount to the policy that grants the secret paths: map the shared ESO ServiceAccount in Modes 1 and 2, or the per-namespace ServiceAccount in Mode 3.
Run ESO with multiple replicas
For extra resiliency, run the ESO controller with more than one replica and enable leader election, so a single replica reconciles secrets at a time while the others stand by. This helps ESO survive Pod failures and restarts, which matters for disaster recovery. It’s optional and works with any mode.Role and RoleBinding in the astronomer namespace. See Leader-election RBAC. In Mode 1, the chart creates this RBAC for you.
Verify the RBAC state
The expected state depends on the mode.- Mode 1: ESO’s default chart RBAC is present — a cluster role and binding for external-secrets.
- Mode 2: the chart’s default ESO RBAC isn’t created, and the minimal
ClusterRoleandClusterRoleBindingyou applied are present, with token creation pinned to ESO’s ServiceAccount. - Mode 3: no cluster-scoped ESO roles exist; only per-namespace roles and bindings.
Upgrade from 2.0 to 2.1
- Upgrading to 2.1 requires no changes to keep your current configuration — Mode 1 is unchanged from previous releases.
- Modes 2 and 3 are opt-in. Adopt Mode 2 by setting the ESO chart flags and applying the provided manifests; adopt Mode 3 per cluster through namespace pools.
- If a later ESO version adds a new custom resource type the operator depends on, the Mode 2 minimal
ClusterRoleneeds a corresponding update as a step in the data plane upgrade runbook.