Skip to main content
Source

This page is generated from skills/eks-best-practices/references/argocd-patterns.md. Edit the source, not this page.

ArgoCD Patterns for EKS

Part of: eks-best-practices Purpose: ArgoCD architecture patterns, deployment strategies, and multi-tenant RBAC for Amazon EKS


Table of Contents

  1. ArgoCD Architecture on EKS
  2. App of Apps Pattern
  3. ApplicationSets
  4. GitOps Bridge Pattern
  5. Multi-Tenant RBAC
  6. EKS ArgoCD Capability (Managed)
  7. ACK and KRO Integration

ArgoCD Architecture on EKS

ArgoCD is a declarative GitOps continuous delivery tool for Kubernetes. It continuously monitors source repositories and reconciles the desired state with the live state in the cluster. ArgoCD supports multiple source types: Git repositories, Helm registries (HTTP and OCI), and OCI images — giving flexibility for different security and compliance requirements.

Core Components

ComponentRoleResource Profile
API ServerUI, CLI, API access, authenticationLow CPU, moderate memory
Repo ServerClones Git repos, renders manifests (Helm, Kustomize)CPU-intensive during sync
Application ControllerReconciliation loop, compares desired vs live stateMemory-intensive (caches cluster state)
RedisCaching layer for controller and API serverLow resource, critical for performance
Dex / SSOAuthentication (OIDC, SAML, LDAP)Low resource
Notifications ControllerSends alerts on sync status changesLow resource

Self-Managed vs EKS Managed ArgoCD

FactorSelf-Managed (Helm)EKS ArgoCD Capability
InstallationHelm chart, you manage upgradesAWS-managed, automatic upgrades
Control planeRuns in your clusterRuns in AWS-owned infrastructure
CustomizationFull (plugins, custom tooling, RBAC)Limited to supported configuration
Multi-clusterManual setup (cluster secrets)Built-in hub-and-spoke
IAM integrationManual OIDC/SAML setupNative IAM Identity Center
CostCluster compute onlyEKS Capability pricing
Best forCustom plugins, air-gapped, existing investmentMinimal ops, multi-account, new deployments

App of Apps Pattern

The App of Apps pattern uses a single "parent" ArgoCD Application that contains manifests defining other ArgoCD Applications. This enables declarative bootstrapping of an entire platform from a single entry point.

Structure

LevelWhat It ContainsExample
Root AppPoints to a directory of Application manifestsplatform-rootapps/ directory
Platform AppsInfrastructure add-ons (monitoring, ingress, cert-manager)apps/monitoring.yaml, apps/ingress.yaml
Tenant AppsTeam workloadsapps/team-a.yaml, apps/team-b.yaml

When to Use

ScenarioApp of AppsApplicationSets
Cluster bootstrappingYes — single entry point for all platform componentsPossible but more complex
Static set of appsGood fit — each app is an explicit manifestOverkill
Dynamic app generationPoor fit — must manually create each manifestBetter — template-based
Multi-clusterOne root app per clusterOne ApplicationSet generates across clusters

Benefits and Limitations

BenefitsLimitations
Single entry point for cluster bootstrapEach new app requires a new manifest file
Explicit — every app is visible in GitDoesn't scale well to hundreds of apps
Easy to understand and debugNo templating — each manifest is hand-written
Works with any manifest formatChanges require Git commit per app

ApplicationSets

ApplicationSets are a templating mechanism that generates multiple ArgoCD Applications from a single definition. They use generators to produce parameter sets, which are then applied to a template to create Applications.

Generators

GeneratorWhat It DoesUse Case
Git DirectoryCreates an app per directory in a Git repoMonorepo with one dir per service
Git FileCreates an app per config file in a Git repoConfig-driven app definitions
ClusterCreates an app per registered clusterMulti-cluster deployments
MatrixCombines two generators (cross-product)Per-cluster × per-environment
MergeCombines generators with override logicBase config + cluster-specific overrides
ListStatic list of parameter setsSmall, known set of targets
Pull RequestCreates app per open PRPreview environments

Common Patterns

PatternGeneratorDescription
Per-environmentGit Directoryenvironments/dev/, environments/staging/, environments/prod/
Per-clusterClusterDeploy same app to all registered clusters
Per-tenantGit FileOne config file per tenant defines their apps
Preview environmentsPull RequestEphemeral environment per PR
Matrix (cluster × env)MatrixDeploy to every cluster in every environment

ApplicationSets vs App of Apps

FactorApplicationSetsApp of Apps
ScalingHandles hundreds of apps via templatesManual — one manifest per app
Dynamic generationYes — new directory/file/cluster auto-generatesNo — must commit new manifest
ComplexityHigher (generator logic, template syntax)Lower (plain Application manifests)
DebuggingHarder (template rendering issues)Easier (explicit manifests)
RecommendationUse for dynamic, large-scale deploymentsUse for static platform bootstrapping

GitOps Bridge Pattern

The GitOps Bridge pattern separates infrastructure provisioning (Terraform) from application/add-on management (ArgoCD). Terraform creates the cluster and bootstraps ArgoCD; ArgoCD manages everything else.

How It Works

PhaseToolWhat It Does
1. InfrastructureTerraformProvisions VPC, EKS cluster, node groups, IAM roles
2. BootstrapTerraformInstalls ArgoCD via Helm, creates root Application
3. Add-onsArgoCDManages all cluster add-ons (monitoring, ingress, policy engine)
4. ApplicationsArgoCDManages all workload deployments

Integration with terraform-aws-modules/eks

The terraform-aws-modules/eks module provisions the cluster. Terraform then installs ArgoCD and creates a bootstrap Application pointing to the GitOps repository. From that point, ArgoCD takes over management of add-ons and applications.

Terraform ManagesArgoCD Manages
VPC, subnets, NATCluster add-ons (monitoring, ingress, cert-manager)
EKS cluster, node groupsPolicy engine (Kyverno, Gatekeeper)
IAM roles (cluster, node, Pod Identity)Application deployments
KMS keys, S3 bucketsNamespace configuration, RBAC
ArgoCD installation (bootstrap only)ArgoCD self-management (after bootstrap)

Multi-Tenant RBAC

ArgoCD Projects provide tenant isolation by restricting what each team can deploy, where they can deploy, and what cluster resources they can access.

AppProject Scoping

RestrictionWhat It ControlsExample
Source reposWhich Git repos the project can readhttps://github.com/org/team-a-*
DestinationsWhich clusters and namespaces apps can deploy tocluster: in-cluster, namespace: team-a-*
Cluster resourcesWhich cluster-scoped resources are allowedDeny ClusterRole, Namespace creation
Namespaced resourcesWhich namespaced resources are allowed/deniedAllow Deployment, Service; deny ResourceQuota

SSO Integration

ProviderIntegration MethodNotes
OIDCDex connector or built-in OIDCMost common; works with Okta, Azure AD, Google
SAMLDex connectorEnterprise SSO
LDAPDex connectorOn-premises directory
IAM Identity CenterEKS ArgoCD Capability onlyNative AWS SSO

RBAC Model

RoleScopePermissions
Platform adminAll projectsFull access — create/delete apps, manage projects
Tenant adminOwn projectCreate/sync/delete apps within project boundaries
Tenant developerOwn projectSync apps, view logs; cannot create or delete
ViewerAll or specific projectsRead-only — view app status, logs

Multi-Cluster Architecture Patterns

When deploying ArgoCD (managed or self-managed) across multiple clusters, three patterns emerge:

Hub-and-Spoke (Centralized)

All capabilities run on a central management cluster that orchestrates workloads and infrastructure across spoke clusters.

ComponentWhere It RunsWhat It Does
ArgoCDManagement clusterDeploys apps to all workload clusters
ACKManagement clusterProvisions AWS resources (RDS, S3, IAM) for all clusters
KROManagement clusterCreates portable abstractions across all clusters

Best for: Centralized platform teams, audit/compliance requirements, fleet management.

Decentralized

Each cluster runs its own capabilities independently.

ComponentWhere It RunsWhat It Does
ArgoCDEach clusterManages local applications only
ACKEach clusterProvisions resources for local workloads
KROEach clusterLocal resource compositions

Best for: Autonomous teams, independent clusters, minimal cross-cluster dependencies.

Hybrid (Hub + Local ACK)

Combines centralized GitOps delivery with local resource management based on scope.

ComponentHub ClusterSpoke Clusters
ArgoCDDeploys to all clustersN/A (managed from hub)
ACKAdmin-scoped resources (production DBs, IAM, VPCs)Workload-scoped resources (S3 buckets, SQS queues)
KROReusable platform abstractionsLocal building block patterns

Best for: Platform teams managing critical infrastructure centrally while enabling self-service for application teams.

Choosing a Pattern

FactorHub-and-SpokeDecentralizedHybrid
Org structureCentralized platform teamAutonomous teamsPlatform team + app teams
ComplianceEasiest to auditHardest to auditBalanced
Operational complexityFewer instances, possible bottleneckMore instances to manageModerate
Self-serviceVia KRO abstractions from hubFull autonomyAdmin from hub, workload locally

You can start with one pattern and evolve — capabilities are independent and can be deployed differently across clusters.


EKS ArgoCD Capability (Managed)

The EKS ArgoCD Capability is an AWS-managed ArgoCD service that runs in AWS-owned infrastructure, separate from your cluster. AWS handles scaling, patching, and upgrading. It does not consume worker node resources.

FeatureDetail
Control planeRuns in AWS infrastructure (not in your cluster, no node resource consumption)
Multi-clusterBuilt-in hub-and-spoke — manage multiple EKS clusters from one instance
AuthenticationNative IAM Identity Center integration (3 roles: admin, editor, viewer)
UpgradesAWS-managed, automatic
SourcesGit (HTTPS/SSH), Helm registries (HTTP/OCI), OCI images, CodeCommit, CodeConnections (GitHub, GitLab, Bitbucket)
SecretsNative Secrets Manager integration
RegistryNative ECR integration (OCI Helm charts)
Private clustersTransparent access — no VPC peering or special networking needed
Remote clustersUses EKS access entries — no IRSA or cross-account role assumptions needed
PricingHourly per capability + hourly per managed K8s resource

Managed Capability Limitations

Features not available in the managed capability (use self-managed if you need these):

Unsupported FeatureWorkaround
Config Management Plugins (CMPs)Pre-render manifests in CI pipeline
Custom Lua health checksBuilt-in checks cover standard resources
Notifications controllerUse EventBridge + CloudWatch for alerting
Custom SSO providersOnly IAM Identity Center (supports third-party federation through Identity Center)
UI extensions / custom bannersN/A
Direct argocd-cm ConfigMap accessConfigure via capability API
Custom sync timeoutFixed at 120 seconds

Key Operational Differences

  • Single namespace: All ArgoCD CRs (Application, ApplicationSet, AppProject) must be created in one namespace (default: argocd). Workloads deploy to any namespace in any target cluster.
  • Only EKS targets: Deployment targets must be EKS clusters identified by ARN (not arbitrary Kubernetes API server URLs).
  • Local cluster not auto-registered: You must explicitly register the local cluster using its ARN to deploy to it.
  • CLI differences: Use argocd app sync namespace/appname (namespace prefix required). argocd admin and argocd login are not supported — use account or project tokens.
  • Namespace isolation: Keep only ArgoCD-relevant secrets in the ArgoCD namespace — the capability has access to all secrets in its namespace.

When to Use EKS Managed vs Self-Managed

ScenarioRecommendation
New deployment, minimal ops teamEKS Managed
Multi-account, hub-and-spokeEKS Managed
Need IAM Identity Center SSOEKS Managed
Private clusters with no extra networkingEKS Managed
Custom ArgoCD plugins (CMPs)Self-managed
Air-gapped environmentSelf-managed
Existing ArgoCD investmentSelf-managed (unless migrating)
Need specific ArgoCD versionSelf-managed
Need Notifications controllerSelf-managed

Migrating from Self-Managed to EKS Managed

  1. Review current config for unsupported features (CMPs, custom Lua, Notifications, UI extensions)
  2. Scale self-managed ArgoCD controllers to zero replicas
  3. Create ArgoCD capability resource on your cluster
  4. Export existing Applications, ApplicationSets, and AppProjects
  5. Migrate repository credentials and cluster secrets
  6. Update destination.server fields to use cluster names or EKS cluster ARNs
  7. Apply manifests to the managed instance
  8. Verify applications sync correctly
  9. Decommission self-managed installation

Existing Application/ApplicationSet manifests work with minimal modification — the managed capability uses the same Kubernetes APIs and CRDs.


ACK and KRO Integration

AWS Controllers for Kubernetes (ACK)

ACK lets you manage AWS resources using Kubernetes custom resources. Instead of using Terraform or CloudFormation for AWS resources, you define them as Kubernetes manifests that ArgoCD can manage via GitOps. ACK translates Kubernetes CR specs into AWS API calls and continuously reconciles to maintain desired state (detecting and correcting drift).

ACK ControllerAWS Resources Managed
S3Buckets, bucket policies
RDSDB instances, DB clusters, parameter groups
IAMRoles, policies
EC2Security groups, VPC resources
SQSQueues
SNSTopics, subscriptions
DynamoDBTables
ElastiCacheClusters, replication groups
LambdaFunctions, event source mappings
EKSClusters, node groups
FeatureDescription
Multi-account/multi-regionManage AWS resources across multiple AWS accounts and regions from a single cluster
Resource adoptionBring existing AWS resources under ACK management without recreation
Read-only resourcesObserve AWS resources without modification access
Retention annotationsOptionally retain AWS resources when Kubernetes CRs are deleted

Kube Resource Orchestrator (KRO)

KRO provides platform abstractions via ResourceGraphDefinitions (RGDs). Platform teams define golden path templates that combine multiple resources (Kubernetes + AWS via ACK) into a single custom resource that tenant teams consume. KRO automatically determines interdependencies and resource ordering, and uses Common Expression Language (CEL) for injecting values between resources and conditional logic.

ConceptWhat It DoesExample
ResourceGraphDefinitionDefines a custom API combining multiple resources"WebApp" = Deployment + Service + Ingress + RDS (via ACK)
InstanceA tenant creates an instance of the templatekind: WebApp, name: team-a-api
ReconciliationKRO creates and manages all child resourcesCreates Deployment, Service, Ingress, RDS instance

Combined Pattern: ArgoCD + ACK + KRO

LayerToolWhat It Manages
GitOps deliveryArgoCDSyncs all manifests from Git to cluster
AWS resourcesACKCreates/updates AWS resources (RDS, S3, SQS) as K8s CRDs
Platform abstractionsKROCombines K8s + ACK resources into golden path templates
Tenant self-serviceKRO instancesTenants create a single CR, get a full stack

Sources: