feat(addons): add ACK backup-controller (Preview v0.1.1) as optional addon - #631
feat(addons): add ACK backup-controller (Preview v0.1.1) as optional addon#631allamand wants to merge 3 commits into
Conversation
…addon The EKS `ACK` capability is GA but does not currently bundle the `aws-controllers-k8s/backup-controller` (Preview v0.1.1) as of May 2026. Verified live on an EKS 1.31 hub cluster: enabling the `ACK` capability provisions ~180 `*.services.k8s.aws` CRDs but none of `backupplans/backupvaults/backupselections.backup.services.k8s.aws`. This PR adds the backup-controller Helm chart as an optional addon so users can deploy AWS Backup resources (BackupPlan/BackupVault/BackupSelection) declaratively via GitOps until AWS ships it inside the `ACK` capability. Changes: - gitops/addons/bootstrap/default/addons.yaml: new `ack-backup` entry, modeled after `ack-iam`/`ack-eks`. Chart: public.ecr.aws/aws-controllers-k8s/backup-chart:0.1.1, namespace ack-system, sync-wave -1, selector `enable_ack_backup=true`, same CRD ignoreDifferences as other ACK controllers. - platform/infra/terraform/hub-config.yaml: `enable_ack_backup: false` seed value added to the three cluster blocks, with a comment noting the Preview status. Out of scope (follow-up): - IAM role / Pod Identity binding for the `ack-backup-controller` ServiceAccount. Users must provide an ARN with AWSBackupFullAccess via the existing pod-identity annotation mechanism (same pattern as other ACK controllers). - Flip to EKS capability once AWS includes backup-controller in the bundled `ACK` capability. Signed-off-by: Sebastien Allamand <allamand@amazon.fr>
Adds a second pod-identity path in the application-sets chart, parallel to the existing Crossplane path, using the kro RGD podidentity.kro.run. When an addon sets enableACKKRO: true, the chart renders an additional Argo source pointing at gitops/addons/charts/kro/instances/pod-identity, which expands to: - iam.services.k8s.aws/Policy - iam.services.k8s.aws/Role (trust pods.eks.amazonaws.com) - eks.services.k8s.aws/PodIdentityAssociation enableACK (Crossplane) and enableACKKRO (kro+ACK) are mutually exclusive; enabling both triggers a helm template fail with a clear message. The ack-backup addon is wired with enableACKKRO: true and ships a least-privilege policyDocument covering backup:*, backup-storage:*, iam:PassRole (scoped to role/*), and the KMS actions required for cross-account encrypted snapshots (Decrypt, Encrypt, GenerateDataKey*, DescribeKey, CreateGrant). This closes the IRSA gap that otherwise leaves the backup-controller pod in CrashLoopBackOff. Files: - gitops/addons/charts/application-sets/templates/_pod_identity_kro.tpl (new) - gitops/addons/charts/application-sets/templates/application-set.yaml (mutex + second guard) - gitops/addons/bootstrap/default/addons.yaml (enableACKKRO + podIdentity block) Signed-off-by: Sebastien Allamand <allamand@amazon.com> Signed-off-by: Sébastien Allamand <allamand@users.noreply.github.com>
Update: Pod Identity wiring via kro + ACKSecond commit ( Added
IAM policy scope
Validation
Resolves the IRSA CrashLoopBackOff observed after deploying |
…path
The upstream ACK capability role grants workload-role management
(iam:CreateRole, PutRolePolicy, etc.) scoped per cluster, but is
missing the permissions needed by the kro+ACK pod-identity pattern:
- iam:CreatePolicy/GetPolicyVersion/... (RGD creates a managed
iam.services.k8s.aws/Policy, not an inline policy)
- iam:PassRole (eks.services.k8s.aws/PodIdentityAssociation needs
to pass the workload role to the EKS Pod Identity service)
- eks:*PodIdentityAssociation (to create the association itself)
Also: the existing ManageIRSARoles policy was filtered to exclude
control-plane clusters. Renamed the comment (the IAM actions are
trust-policy-agnostic — same perms work for both IRSA and Pod
Identity) and removed the control-plane filter so the hub can run
kro+ACK-wired addons too (e.g. ack-backup-controller).
Changes:
- ManageIRSARoles: removed environment != control-plane filter
- ManageWorkloadPolicies (new): iam:CreatePolicy/... scoped to
arn:aws:iam::ACCT:policy/${cluster.name}-*
- ManagePodIdentityAssociations (new): iam:PassRole (constrained
by iam:PassedToService = pods.eks.amazonaws.com) +
eks:*PodIdentityAssociation scoped to
cluster/${cluster.name} and
podidentityassociation/${cluster.name}/*
Validated end-to-end on hub eu-west-1 (account 586794472760):
- kro PodIdentity CR → RGD expands to ACK Policy + Role + PIA
- All 3 ACK CRs SYNCED=True without manual IAM intervention
- eks.list-pod-identity-associations returns the association
- ack-backup-controller pod Running 1/1 (was CrashLoopBackOff)
- BackupVault CR → AWS Backup vault created (ARN resolved)
Signed-off-by: Sebastien Allamand <allamand@amazon.com>
Signed-off-by: Sébastien Allamand <allamand@users.noreply.github.com>
Commit 3
|
Wire a new 'enableACKKRO' flag on per-addon chart configs in the appset-chart. When set, the addon ApplicationSet gets a second source pointing to gitops/addons/charts/kro/instances/pod-identity, which materializes ACK iam.Role + iam.Policy + eks.PodIdentityAssociation via the podidentity.kro.run RGD instead of the legacy Crossplane path. - 'enableACKKRO' and 'enableAckPodIdentity' are mutually exclusive; the template fails fast if both are set on the same addon. - All existing addons keep their behavior (no flag flip). - Required for ACK controllers not yet bundled in the EKS ACK capability (e.g. ack-backup, currently in preview at v0.1.1). Adapted from upstream PR aws-samples#631 to fit the appset-chart structure on the feature/platform-cluster-kro-ack base (PR aws-samples#642). Credit to the upstream author.
Register the ack-backup-controller (chart oci://public.ecr.aws/aws-controllers-k8s/backup-chart:0.1.1) as a regular addon in gitops/addons/registry/platform.yaml. Why an addon and not the EKS ACK capability? The backup ACK controller is in PREVIEW (v0.1.1, May 2026) and is NOT yet bundled in the managed 'ACK' capability. Until AWS ships it as part of the capability, it is deployed via Helm. How does it get its IAM? Through the new enableACKKRO=true path on appset-chart (previous commit). That path renders gitops/addons/charts/kro/instances/pod-identity, which expands via the podidentity.kro.run RGD to ACK iam.Role + iam.Policy + eks.PodIdentityAssociation for SA ack-backup-controller in ack-system. Policy follows least-privilege: - backup:* + backup-storage:* on all resources - iam:PassRole scoped to role/* (controller passes backup service roles) - kms:Decrypt/Encrypt/GenerateDataKey/CreateGrant for encrypted vaults Enabled only on the hub cluster via 'enable_ack_backup: true' in hub-config.yaml; spokes keep it false. Required prerequisite for the BackupPolicy RGD (PR aws-samples#644) to materialize its referenced backup.services.k8s.aws CRDs (BackupVault, BackupPlan, BackupSelection). Adapted from upstream PR aws-samples#631.
Wire a new 'enableACKKRO' flag on per-addon chart configs in the appset-chart. When set, the addon ApplicationSet gets a second source pointing to gitops/addons/charts/kro/instances/pod-identity, which materializes ACK iam.Role + iam.Policy + eks.PodIdentityAssociation via the podidentity.kro.run RGD instead of the legacy Crossplane path. - 'enableACKKRO' and 'enableAckPodIdentity' are mutually exclusive; the template fails fast if both are set on the same addon. - All existing addons keep their behavior (no flag flip). - Required for ACK controllers not yet bundled in the EKS ACK capability (e.g. ack-backup, currently in preview at v0.1.1). Adapted from upstream PR aws-samples#631 to fit the appset-chart structure on the feature/platform-cluster-kro-ack base (PR aws-samples#642). Credit to the upstream author.
Register the ack-backup-controller (chart oci://public.ecr.aws/aws-controllers-k8s/backup-chart:0.1.1) as a regular addon in gitops/addons/registry/platform.yaml. Why an addon and not the EKS ACK capability? The backup ACK controller is in PREVIEW (v0.1.1, May 2026) and is NOT yet bundled in the managed 'ACK' capability. Until AWS ships it as part of the capability, it is deployed via Helm. How does it get its IAM? Through the new enableACKKRO=true path on appset-chart (previous commit). That path renders gitops/addons/charts/kro/instances/pod-identity, which expands via the podidentity.kro.run RGD to ACK iam.Role + iam.Policy + eks.PodIdentityAssociation for SA ack-backup-controller in ack-system. Policy follows least-privilege: - backup:* + backup-storage:* on all resources - iam:PassRole scoped to role/* (controller passes backup service roles) - kms:Decrypt/Encrypt/GenerateDataKey/CreateGrant for encrypted vaults Enabled only on the hub cluster via 'enable_ack_backup: true' in hub-config.yaml; spokes keep it false. Required prerequisite for the BackupPolicy RGD (PR aws-samples#644) to materialize its referenced backup.services.k8s.aws CRDs (BackupVault, BackupPlan, BackupSelection). Adapted from upstream PR aws-samples#631.
Summary
The EKS
ACKcapability is GA but does not currently bundle theaws-controllers-k8s/backup-controller(Preview v0.1.1, May 2026). This PR adds the backup-controller Helm chart as an optional GitOps-managed addon so users can declaratively createBackupPlan/BackupVault/BackupSelectionresources from Kubernetes until AWS ships it inside the capability.Motivation
Working on a cross-region EKS DR reference (AWS Backup + kro + ACK), I needed
backup.services.k8s.awsCRDs on a PeEKS hub. Enabling theACKcapability on an EKS 1.31 cluster provisions ~180*.services.k8s.awsCRDs, but none of thebackup.services.k8s.awsgroup — confirmed live oneu-west-1. The only way to get them today is via the upstream Helm chart.Changes
gitops/addons/bootstrap/default/addons.yaml— newack-backupentry, modeled afterack-iamandack-eks:public.ecr.aws/aws-controllers-k8s/backup-chart:0.1.1ack-system-1(post-kro RGD)enable_ack_backup=trueignoreDifferencesas other ACK controllersack-backup-controller(override viaack_backup_service_accountannotation)platform/infra/terraform/hub-config.yaml—enable_ack_backup: falseseed added to the three cluster blocks, with a comment noting the Preview status.Out of scope (follow-up)
ack-backup-controllerSA. Users must provide an ARN withAWSBackupFullAccessthrough the existing pod-identity annotation mechanism (same pattern asack-iam,ack-eks).backup-controllerin the bundledACKcapability — at that pointenable_ack_backupshould flip back tofalseand the capability flag should take over.Validation
helm template oci://public.ecr.aws/aws-controllers-k8s/backup-chart --version 0.1.1 --namespace ack-systemrenders cleanlybackupplans,backupvaults,backupselectionsunderbackup.services.k8s.aws); controller pod starts (CrashLoops pending IRSA, as expected — out of scope here)Related
public.ecr.aws/aws-controllers-k8s/backup-chart:0.1.1