The default ESO configuration (Mode 1) is available in every release that supports data plane failover, including APC 2.0. The hardened and isolated modes (Modes 2 and 3) and the other options described here — workload identity, self-managed CRDs, and pinned or disabled ServiceAccount token creation — require APC 2.1 or later.
What’s new in 2.1
- Two opt-in modes for tighter ESO access: in addition to the default configuration, you can choose a hardened shared-identity mode or a customer-managed isolated-identity mode. See Choose a mode.
- ServiceAccount token creation is off by default: the chart now disables ESO’s unconditional ServiceAccount token creation by default, closing the main gap from previous releases. The hardened and isolated modes go further, pinning token creation with Kubernetes
resourceNamesto a specific ServiceAccount. Hashicorp Vault backends are the exception and need it re-enabled — see Mode 1. - Workload identity support: you can authenticate ESO to your backend with workload identity such as AWS IAM Roles for Service Accounts (IRSA), GKE Workload Identity, or Vault Kubernetes auth, so no static credentials need to live in the cluster. Static credentials remain fully supported.
- Customer-managed CRD installation: a chart value lets you install the ESO custom resource definitions (CRDs) yourself, for organizations where CRD installation is owned by a separate infrastructure team. See ESO CRD installation.
Backend authentication
Independent of the mode you choose, you authenticate ESO to your secret backend in one of two ways:- Static credentials. A Kubernetes
Secretholding a cloud credential pair, as in previous releases. - Workload identity. AWS IRSA, GKE Workload Identity, or Vault Kubernetes auth, so no long-lived credentials are stored in the cluster.
Choose a mode
APC supports three modes. Mode 1 is available in APC 2.0 and later; Modes 2 and 3 require APC 2.1 or later. A cluster runs entirely in one mode, and Deployments inherit the cluster’s mode.Mode 1: Default shared identity
The default. ESO uses its standard chart-managed RBAC, with one change from previous releases: its unconditional ServiceAccount token creation is disabled by default, closing the main gap. All Deployments authenticate to the backend as one shared identity. No extra setup is required on upgrade, with one exception: if your backend is Hashicorp Vault, re-enable ESO’s ServiceAccount token creation (unpinned) withexternal-secrets.rbac.serviceAccountTokenCreate: true, because Vault’s Kubernetes auth needs ESO to mint a ServiceAccount token. You provision a single cluster-scoped ClusterSecretStore. See Secret store options.
Mode 2: Hardened shared identity
The same shared-identity model as Mode 1, with ESO’s Kubernetes access tightened. To use it, you:- Set the two ESO sub-chart flags that disable its default RBAC and its ServiceAccount token-create rule.
- Apply the minimal
ClusterRoleandClusterRoleBindingthat Astronomer provides. These scope ESO’s cluster access and restrict ServiceAccount token creation, withresourceNames, to ESO’s own ServiceAccount in theastronomernamespace.
ClusterSecretStore or a synced namespaced SecretStore. See Secret store options. Choose Mode 2 when you want a single shared backend identity but need ESO’s cluster access to be least-privilege and reviewed by your team.
Mode 3: Customer-managed isolated identity
Each Deployment gets its own backend identity, and you provision all of the required Kubernetes RBAC yourself. This mode builds on the namespace pools feature: you complete the standard namespace pools setup to pre-provision a fixed set of Deployment namespaces, then, in addition, pre-provision the ESO chain in each namespace — a per-namespace ServiceAccount (named after the pre-created namespace, since no Deployment exists yet), a namespacedSecretStore, and the per-namespace roles that grant ESO scoped access. The platform is installed without cluster-wide roles and can run with a limited-privilege user. You can substitute your own role definitions for the generated ones to match an internal RBAC standard.
The SecretStore in every pool namespace must use the same name, which is the value set for global.dataPlaneFailover.externalSecretManagerName when you enable data plane failover per cluster. Only the name must match across namespaces. Each store’s contents — provider, region, and identity — can differ, which is what gives each Deployment its own backend identity.
Secret store options
Both shared-identity modes use a single secret store. Mode 1 uses a cluster-scopedClusterSecretStore. Mode 2 can use either shape:
- Cluster-scoped
ClusterSecretStore. One store that every Deployment namespace references by name. - Namespaced
SecretStore, synced by the platform. You create oneSecretStoreand its credentialsSecretin theastronomernamespace with theastronomer.io/commander-syncannotation, and the platform syncs them into every Deployment namespace. This keeps a single shared backend identity while using namespaced stores instead of a cluster-wide one.
If your organization restricts cluster-scoped Kubernetes resources, choose the synced
SecretStore — it keeps everything namespace-scoped while you still author and rotate a single store. The synced SecretStore supports static credentials only: if you need workload identity, use the ClusterSecretStore, which is also the simpler choice when cluster-scoped resources are acceptable.
Mode 3 doesn’t use a shared store; each Deployment namespace has its own SecretStore.
ESO CRD installation
By default, the APC chart installs the ESO custom resource definitions. If CRD installation in your environment is owned by a separate infrastructure team, you can set the chart value that disables CRD creation and install the ESO CRDs yourself before installing the platform. This option is independent of the mode you choose and is most relevant to Modes 2 and 3. For the CRD bundle and command, see Install the ESO CRDs yourself.How this interacts with data plane failover
- A cluster runs entirely in one mode. Per-Deployment mixing within a cluster isn’t supported in 2.1.
- In Mode 3, the objects you pre-provision — namespace, ServiceAccount,
SecretStore, and roles — are preserved across a failover. The platform doesn’t delete the pool namespace during a move, and the pool slot is freed only when the Deployment is deleted. - At Deployment creation, and again on the destination cluster during a failover, the platform validates that the per-namespace ESO chain exists and reports any gaps.
- For Mode 3, 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.
- For extra resiliency, you can run the ESO controller with multiple replicas and leader election, so it survives Pod failures and restarts. See Run ESO with multiple replicas.