DevOps, Kubernetes, GitOps

Argo CD vs Flux: choosing a GitOps tool for AWS EKS

Last updated

Argo CD and Flux compared for teams running Kubernetes on AWS: application model, UI, multi-tenancy, image automation, progressive delivery — and why we chose Argo CD for an EKS migration.

2026-11-05•8 min read

Both Argo CD and Flux are CNCF-graduated GitOps controllers that pull the desired state of your Kubernetes clusters from Git and keep the clusters in line with it. They solve the same problem and both are production-grade; the difference is in how they model applications, how much they put in front of your developers, and how they fit a multi-team platform. Short version: Argo CD gives you an application-centric model with a first-party UI, SSO and RBAC out of the box — the better default when many teams will deploy through it and need to see what is happening. Flux is a set of composable controllers that feel like native Kubernetes resources — the better default for platform teams that want GitOps as infrastructure plumbing, with image automation built in and no UI to run. We used Argo CD for the EKS migration described in this case study; the reasons are at the end.

What they have in common

  • Pull-based reconciliation. A controller inside the cluster watches Git (or an OCI registry) and applies what it finds; CI never needs cluster credentials.
  • Helm and Kustomize as the main packaging formats, plus plain manifests.
  • Drift detection and self-healing — if someone edits a resource by hand, the tool notices and, if you let it, reverts it.
  • Multi-cluster from one control plane, and multi-tenancy controls so teams only touch their own namespaces.
  • Health and sync status exposed as Kubernetes resources, so both work with the same alerting and dashboards you already have.
  • Both are CNCF graduated projects with large communities and are packaged by the main Kubernetes vendors and cloud marketplaces.

If your requirement is "deploy from Git, safely, to EKS", either will do it. The choice is about the shape of the thing you operate afterwards.

Where they differ

Argo CDFlux
Core modelApplication (and ApplicationSet for fan-out across clusters/environments) in a central Argo CD instanceComposable controllers: GitRepository/OCIRepository sources, Kustomization and HelmRelease reconcilers, each a CRD
UIFirst-party web UI: app topology, diffs, sync history, logs, manual sync/rollbackNo first-party UI; CLI (flux) plus community dashboards
Access controlBuilt-in SSO (OIDC/SAML via Dex) and RBAC per project/app; useful when developers use the UIRelies on Kubernetes RBAC and service-account impersonation per Kustomization; nothing extra to secure, but nothing to show developers either
Multi-tenancyAppProject boundaries: allowed repos, clusters, namespaces, resource kindsNamespace-scoped reconcilers with serviceAccountName; tenants get their own sources and reconcilers
Ordering & hooksSync waves and phases, resource hooks (pre/post-sync jobs)dependsOn between Kustomizations/HelmReleases; Helm hooks via Helm itself
Image automationSeparate project (Argo CD Image Updater)Built in: image-reflector and image-automation controllers write new tags back to Git
Progressive deliveryArgo Rollouts (same project family): canary, blue/green, analysisFlagger (CNCF, Flux ecosystem): canary, A/B, blue/green with the usual service meshes and ingresses
NotificationsArgo CD Notifications (built in)notification-controller: alerts and webhooks per resource
OCIHelm charts from OCI registries; broader OCI artifact support arriving in recent versions — check your versionOCI artifacts as a first-class source (manifests, Kustomize, Helm)
FootprintOne control-plane install (API server, repo server, controller, Redis, UI); heavier, but one thing to runSeveral small controllers; lighter per cluster, easy to install per cluster
Developer experience"Open the UI, see the app, click sync/rollback""Read the YAML, run flux reconcile, read the events"

The table is honest about the trade: Argo CD carries more components so that it can give people a console; Flux carries fewer so that it can disappear into the cluster.

When to choose Argo CD

  • Several product teams will deploy through it and want to see state, diffs and history without learning the CLI or kubectl.
  • You want SSO and per-team RBAC on the deployment tool itself, with an audit trail of who synced what.
  • You run many environments and clusters from one place and ApplicationSet generators (per cluster, per Git directory, per pull request) map directly onto how you work.
  • Canary or blue/green releases are on the roadmap and you would rather stay in one project family (Argo Rollouts).

When to choose Flux

  • A small platform team treats GitOps as infrastructure plumbing and is comfortable in YAML and the CLI; nobody needs a console.
  • You want image automation in the core: new image tags committed back to Git without an extra component.
  • You deploy the same stack to many clusters and prefer a light per-cluster install over one central control plane.
  • OCI artifacts (not just Helm charts) are already how you ship manifests.
  • You are deep in the Flux ecosystem already — Flagger for canaries, Terraform-managed bootstrap, Weave-style multi-tenancy patterns.

What we chose for an EKS migration, and why

The engagement in our GitOps case study started from a legacy on-premises Kubernetes estate with Jenkins-based CI/CD, manual deployments, little visibility, and difficulty onboarding new teams into the pipeline. The target was AWS EKS provisioned with Terraform, GitHub Actions for CI, and GitOps for delivery.

We picked Argo CD with Helm, for reasons that follow directly from the table:

  • Visibility was the pain. Manual deployments and "where is it running?" were the client's complaints; the Argo CD UI gave every team the same picture of dev, staging and production without a CLI lesson.
  • Onboarding new teams was a stated goal. Argo CD projects with RBAC let us give each team its repos and namespaces and nothing else.
  • Versioned environments. Applications were refactored into Helm charts and Argo CD synced them per environment with health checks, which is what made the phased migration — low-risk services first, mission-critical last — observable at every step.
  • Jenkins was being replaced anyway. CI moved to GitHub Actions (matrix tests, Dockerised builds with cache, quality checks, artifact publishing); Argo CD only had to own the deployment side, which kept the two halves cleanly separated.

Outcomes, as published in the case study: deployment time down from hours to minutes, 100 % of deployments through GitOps, auditable releases, and a zero-downtime cutover for production services.

Would Flux have worked? Yes. For a single platform team with no appetite for a UI and a need for automated image bumps, we would have leaned the other way. The decision is not about which tool is "better"; it is about who will be looking at it on a Tuesday afternoon.

Moving from Jenkins-driven deployments to GitOps — what to expect

Whichever tool you pick, the migration pattern that worked for us:

  1. Separate CI from CD first. Build, test and publish artifacts in CI (GitHub Actions, GitLab CI, Jenkins — it doesn't matter); stop CI from running kubectl apply.
  2. Package applications as Helm charts or Kustomize overlays with one source of truth per environment.
  3. Bootstrap the GitOps controller on a fresh cluster (we provision EKS with Terraform and install the controller from the same repo) and point it at an empty environment.
  4. Migrate by risk, not by team: stateless, low-traffic services first; data-bearing and customer-facing services last, with a rollback path at every step.
  5. Make drift visible before you make it automatic. Run in "detect only" mode for a sprint, fix the sources of drift, then turn on self-heal.
  6. Give people the view they need — the UI for Argo CD, dashboards and alerts for Flux — before you switch off the old way.

If you want this done with you or for you — on EKS, with Terraform, GitHub Actions and either controller — that is the core of our DevOps practice and of DevOps as a Service.

Frequently asked questions

Can I run Argo CD and Flux together? Yes, and some platforms do during a migration or by team preference, but each controller must own distinct resources; two reconcilers fighting over the same Deployment is the classic failure. Pick one per cluster in the long run.

Which is more secure? Both pull from Git and keep cluster credentials out of CI, which is the main security win. Argo CD adds its own SSO/RBAC layer and API that you must secure and patch; Flux has no extra API surface and relies on Kubernetes RBAC. Neither is "more secure" in general — the Argo CD surface is a cost you pay for the console.

Does either work with EKS specifically? Both run on EKS without special handling. Use IAM roles for service accounts for any AWS access the controllers need (ECR, Secrets Manager, KMS) and keep the controllers' own credentials out of Git.

Do we need Argo Rollouts or Flagger from day one? No. Get plain sync-and-rollback working across environments first. Progressive delivery is the second step and both ecosystems add it without changing the base install.


Based on the projects' public documentation and on our own EKS delivery work. Argo CD and Flux are CNCF projects; feature details change between releases — verify against the versions you deploy.

Unified Techs engineering team

Related posts

Platform engineering in 2026: paved roads or bust →

Want to apply this to your stack?

Book a call with our team and we'll walk through the patterns on your own workloads.