“Should I use ArgoCD or Flux?”

I get this question over coffee, in Slack, in PR comments, probably once a week. People want me to declare a winner so they can stop thinking about it and go build something.

Here is my bias, up front, so you can weigh everything that follows: I run ArgoCD on my own clusters. I have a few years of it under my belt and I like it. That preference is going to leak through no matter how careful I am, so I am telling you now instead of pretending I am neutral.

But ArgoCD winning for me does not mean it wins for you. Both tools are CNCF graduated, both are boring in the good way, and the choice depends almost entirely on your context. So let me lay out the criteria I actually care about, walk both tools through each one, and then tell you where each one fits.

What I’m Comparing On

A feature checklist would be useless here. Both tools do Helm, both do Kustomize, both reconcile Git to clusters. If I just listed features you would learn nothing.

The things that decide this for me:

  • Operating model - how the tool wants to be installed, configured, and upgraded
  • Visibility - what you can see when something goes sideways
  • Failure behaviour - what happens when the GitOps engine itself falls over
  • Multi-cluster shape - how it scales from one cluster to twenty

These map directly to the values that drive most of my infrastructure choices. Understanding what I run (visibility), designing for things breaking (failure behaviour), and keeping operational friction low (operating model) are not abstract preferences. They decide which tool I can live with at 2am.

The Philosophy Split

Before the criteria, you need to understand that these tools disagree about something fundamental.

ArgoCD is application-centric. You define Applications that point at Git sources, and ArgoCD manages them through a central control plane that ships with a UI. The control plane is a thing you run and look after.

Flux is GitOps-native to the bone. It installs a set of controllers that watch Git repositories, and the entire system, including Flux’s own configuration, lives in Git. There is no central anything. There is no UI.

This split is the root of nearly every difference that follows.

AspectArgoCDFlux
ArchitectureCentralizedDistributed
ConfigurationCRDs + UIPure GitOps
BootstrappingManual or GitOpsGitOps from start
Multi-clusterHub-spokePer-cluster

ArgoCD: The Application Controller

ArgoCD watches Git repos and syncs them to clusters. What you get for running a central control plane is visibility and control, in one place, with a screen you can point at.

flowchart TD
    subgraph argo["ArgoCD Architecture"]
        subgraph control["ArgoCD Control Plane"]
            API["API Server"]
            UI["UI"]
            AppCtrl["Application Controller"]
        end
        control -->|"Watches Git, Syncs to clusters"| clusters
        subgraph clusters["Managed Clusters"]
            C1["Cluster 1"]
            C2["Cluster 2"]
            C3["Cluster 3"]
        end
    end

Where ArgoCD Earns Its Keep

The UI is genuinely useful, and I do not say that lightly. I am a terminal person. I avoid mice. And yet when a sync goes wrong, the ArgoCD resource tree showing me exactly which object is out of sync, with the diff right there, is faster than anything I would assemble from kubectl. For someone new to GitOps it does something even more valuable: it makes the link between a Git commit and cluster state visible, so the whole model clicks into place.

The application abstraction matches how teams think. Each Application is a unit you sync, roll back, or delete on its own. That maps cleanly onto how people already reason about services, which means less translation in your head.

Multi-cluster is a hub-spoke story. One ArgoCD installation manages many clusters. For a central platform team that is a tidy model: one place to look, one place to grant access.

The ecosystem is rich. Argo Rollouts for progressive delivery, ApplicationSets for generating Applications dynamically, Notifications for alerting. For most needs there is already a tool that plugs in.

Where ArgoCD Costs You

It is a system you operate. ArgoCD has its own state in Redis, needs regular upgrades, and can get unhappy at scale. You are not just running your apps now, you are running the thing that runs your apps.

It is not pure GitOps by default. ArgoCD’s own config tends to live in the UI or get applied with kubectl, rather than being managed by ArgoCD itself. You can close that gap with App-of-Apps, where ArgoCD manages its own Applications from Git, but that is work you have to do deliberately.

The control plane is a single point of failure. If ArgoCD goes down, syncing stops. Your clusters keep serving traffic, the reconciliation engine is what is offline, but you cannot ship updates until it comes back.

Flux: The GitOps Toolkit

Flux comes at the problem from the other side. It is a set of focused controllers, each handling one concern.

flowchart TD
    subgraph flux["Flux Architecture"]
        subgraph git["Git Repository"]
            clusters["clusters/<br/>├── production/<br/>│   ├── flux-system/<br/>│   ├── infrastructure/<br/>│   └── apps/<br/>└── staging/"]
        end
        git -->|"Flux controllers"| cluster
        subgraph cluster["Each Cluster"]
            Source["Source Controller"]
            Kustomize["Kustomize Controller"]
            Helm["Helm Controller"]
        end
    end

Where Flux Earns Its Keep

Pure GitOps from the very first command. flux bootstrap writes all of Flux’s configuration into Git. After that, everything goes through pull requests, including Flux’s own upgrades. There is no out-of-band state to drift, because there is no out-of-band anything. If you want a system where Git is the only source of truth with no asterisks, this is it.

Lighter footprint. The controllers are small and focused, you install only the ones you need, and resource usage tends to land below ArgoCD. On small or constrained clusters that difference is real.

No central thing to lose. Each cluster runs its own Flux. One cluster’s Flux falling over does not touch the others, because there is no shared control plane to protect in the first place.

It nudges you toward GitOps discipline. With no UI to click, the path of least resistance is a pull request. The tool quietly removes the temptation to make a manual change, which is a feature disguised as an absence.

Where Flux Costs You

No UI. Flux ships no web interface. You work through kubectl, the flux CLI, or a third-party dashboard like Weave GitOps. For a terminal-native team that is fine. For people still learning GitOps, the missing visibility is a genuine barrier, the inverse of what makes ArgoCD so friendly to newcomers.

Steeper learning curve. The modular design means more CRDs to hold in your head: GitRepository, Kustomization, HelmRelease, HelmRepository. That modularity is power, and it is also more concepts to learn before anything works.

Multi-cluster is more effort. Flux runs per cluster. Twenty clusters means twenty Flux installations, and coordinating them needs external tooling. The thing that makes Flux resilient (no central plane) is the same thing that makes fleet management harder.

Head-to-Head

FeatureArgoCDFlux
Web UI✓ Built-in✗ Third-party
CLI✓ Full featured✓ Full featured
Helm support✓ Native✓ Native
Kustomize support✓ Native✓ Native
Multi-cluster✓ Hub-spoke✗ Per-cluster
Progressive delivery✓ Argo Rollouts✓ Flagger
Self-managingPartial✓ Full
Resource usageHigherLower
CNCF statusGraduatedGraduated

The “It Depends” Part

This is the bit that actually decides things, and a table cannot hold it.

Reach for ArgoCD when:

  • You run a platform for other teams. The UI lets developers see what is deployed without deep kubectl knowledge. Self-service with guardrails, which is exactly what a platform team is selling.
  • You want many clusters from one pane of glass. Hub-spoke is simpler for centralized management. ArgoCD on a management cluster, targeting your workload clusters, is a clean shape.
  • Your team is new to GitOps. The visual feedback builds intuition faster than reading reconciliation logs ever will.
  • You need progressive delivery in the box. Argo Rollouts integrates tightly, so canary deployments with automatic analysis are not a separate project.

Reach for Flux when:

  • GitOps purity is the point. If you want everything in Git with no exceptions and no manual escape hatch, Flux makes that the default rather than something you have to enforce.
  • Footprint matters. Edge deployments, small clusters, or a fleet large enough that ArgoCD’s overhead multiplies into real cost.
  • You run a decentralized model. Each team owns its cluster and its Flux, with no central platform team in the loop.
  • You are already in that ecosystem. If Weave GitOps or similar tools are part of your world, Flux is the natural fit.

There are hybrids too. Some shops run ArgoCD for the developer-facing apps and Flux for cluster bootstrap, letting each tool do the part it is best at. That is more moving pieces, but if the trade-offs line up that way for you, it is a real option rather than a hack.

My Take

I chose ArgoCD, and tying it back to my criteria from the top: I value the UI for understanding state, hub-spoke fits the multi-cluster shape I actually run, and the Application abstraction matches the way I already think about my workloads. Those are personal reasons rooted in my context, not a verdict.

Flip a couple of those and my answer flips with them. If I ran a single cluster, with a team of experienced Kubernetes people who lived in the terminal and wanted Git as the only source of truth with zero exceptions, I would seriously run Flux. The case for it is strong. It just is not my case.

Switching Later

If you pick one and want to move, the good news is the expensive part transfers.

ArgoCD to Flux: export your Application definitions and convert them to Flux Kustomizations and HelmReleases. The Git repos stay put.

Flux to ArgoCD: turn GitRepositories into ArgoCD repo connections and Kustomizations into Applications. Again, the repos do not move.

Because Git is the source of truth in both, the hard work (organizing your manifests sensibly) is the part you keep. The tool sitting on top is the cheap part to swap.

Don’t Overthink It

Here is what I tell people who ask:

  1. Try both on a throwaway cluster. A day with each tells you more than a week of reading comparisons like this one.
  2. Notice which one feels right. GitOps is a workflow before it is a tool. Pick the one that matches how your team already works.
  3. Start simple. Either tool covers the common 90% out of the box.
  4. Remember you can switch. Your investment lives in your Git repos, so the tool is not a lock-in.

The principles are what carry weight: declarative, versioned, reconciled. ArgoCD and Flux are two ways of honouring the same idea. The best one is the one your team will actually use, every day, without grumbling. Perfect GitOps with a tool nobody opens beats either of these gathering dust.