GitOps with Argo CD and Flux

GitOpsKubernetesArgo CDFluxPlatform Engineering

Git is the source of truth. The cluster reconciles to match. That's GitOps — and the two tools most teams actually evaluate are Argo CD and Flux. I've run both on platform teams supporting mobile backends, charging infrastructure, and internal developer platforms. Neither is universally better. The choice comes down to how your team wants to interact with deployments and how much UI versus composable controllers you want.

The shared model

Both tools watch a Git repository (or OCI artifact registry), compare desired state to live cluster state, and reconcile the diff. Both support Kustomize overlays, Helm charts, SOPS-encrypted secrets, and multi-environment promotion via branch or directory structure.

Where they diverge is ergonomics and architecture.

Argo CD: application-centric with a UI

Argo CD treats each deployable unit as an Application — a CRD pointing at a Git path, a target cluster, and a sync policy. The web UI is genuinely good: diff views, sync status, rollback, and a visual resource tree that non-platform engineers can read without learning kubectl.

apiVersion: argoproj.io/v1alpha1
kind: Application
metadata:
  name: ocpp-gateway
  namespace: argocd
spec:
  project: production
  source:
    repoURL: https://github.com/myorg/k8s-manifests
    targetRevision: main
    path: apps/ocpp-gateway/overlays/prod
  destination:
    server: https://kubernetes.default.svc
    namespace: charging
  syncPolicy:
    automated:
      prune: true
      selfHeal: true
    syncOptions:
      - CreateNamespace=true

Strengths I've leaned on:

Trade-offs:

Flux: composable controllers, Git-native

Flux v2 is not one binary — it's a set of controllers: Source (Git/OCI/Helm repos), Kustomize, Helm, Notification, and Image Automation. Each reconciles independently. There's no built-in UI; your Git history and flux get output are the interface.

apiVersion: source.toolkit.fluxcd.io/v1
kind: GitRepository
metadata:
  name: platform-manifests
  namespace: flux-system
spec:
  interval: 1m
  url: https://github.com/myorg/k8s-manifests
  ref:
    branch: main
---
apiVersion: kustomize.toolkit.fluxcd.io/v1
kind: Kustomization
metadata:
  name: ocpp-gateway
  namespace: flux-system
spec:
  interval: 5m
  sourceRef:
    kind: GitRepository
    name: platform-manifests
  path: ./apps/ocpp-gateway/overlays/prod
  prune: true
  healthChecks:
    - apiVersion: apps/v1
      kind: Deployment
      name: ocpp-gateway
      namespace: charging

Strengths I've leaned on:

Trade-offs:

Head-to-head

Concern Argo CD Flux
Web UI Built-in, excellent None (third-party or CLI)
Helm support Native in Application Dedicated HelmController
Multi-cluster Central instance, many clusters Per-cluster or mgmt pattern
Secret encryption SOPS, Vault plugins SOPS native, ESO integration
Image auto-update Argo CD Image Updater (addon) Built-in Image Automation
CNCF status Incubating (via Argo project) Graduated
Learning curve Lower (UI helps) Higher (more CRDs)
Resource footprint Heavier (UI + repo-server + Redis) Lighter (pick controllers)

How I choose

Pick Argo CD when:

Pick Flux when:

On the EV charging platform, we used Argo CD because ops engineers and field-support staff needed to see charger-gateway deployment status without kubectl access. On a later internal-tools cluster where only platform engineers touched deployments, Flux was the better fit — less to operate, and the team already reviewed everything through PRs.

Patterns that work regardless of tool

  1. One repo (or mono-repo path) per environment overlay. base/ + overlays/staging/ + overlays/prod/. Never maintain separate prod manifests that drift.
  2. Automated sync with prune in non-prod; manual or gated sync in prod. Self-heal everywhere; auto-prune only where you're confident.
  3. SOPS or External Secrets for secrets. Never commit plaintext. Both tools integrate cleanly.
  4. Health checks and sync waves. CRDs and namespaces before Deployments. Jobs before Deployments that depend on migrations.
  5. Audit trail in Git. Every production change is a merged PR. The GitOps controller is the enforcer, not the author.

GitOps doesn't replace CI — it replaces kubectl apply from laptops. Build and test in CI; GitOps reconciles the result. If your CI/CD pipelines are slow, fix that upstream. GitOps sync is fast; waiting forty minutes for a test suite is not.

Resources

Frequently asked questions

What is the main difference between Argo CD and Flux?

Argo CD is a centralized control plane with a rich UI, application-centric sync, and strong multi-cluster management. Flux is a modular toolkit of controllers (source, kustomize, helm, notification) that composes into a lighter, CNCF-graduated GitOps engine.

Can I use Helm with both Argo CD and Flux?

Yes. Argo CD renders Helm charts natively inside Application resources. Flux has a dedicated HelmController that watches HelmRelease CRDs and reconciles chart installs independently of Kustomize overlays.

Which GitOps tool is better for multi-tenancy?

Argo CD's AppProject RBAC and UI make it easier to give teams visibility into their own applications within a shared instance. Flux's namespace-scoped resources and lack of a built-in UI suit teams that prefer Git-as-the-UI and tighter per-namespace isolation.

Hiring a senior Android / Flutter engineer?

I architect and ship production mobile software — Kotlin, Jetpack Compose, Flutter — for robotics, EV infrastructure, fintech, and real-time systems. Open to remote roles in Europe and the US.

Get in touch →