Two Approaches to GitOps
Both Flux and Argo CD sync Kubernetes state from Git. But their architectures differ fundamentally:
| Aspect | Flux CD | Argo CD |
|---|---|---|
| Architecture | Multi-controller (modular) | Single application (monolithic) |
| UI | β No built-in (Weave GitOps optional) | β Rich web UI |
| Multi-tenancy | β Native (Kustomization per tenant) | β οΈ Projects + AppSets |
| Helm support | β HelmRelease CRD | β Application source |
| OCI artifacts | β Native | β οΈ Limited |
| Notification | β Provider-agnostic (alerts CRD) | β Built-in |
| Image automation | β (Image Reflector + Updater) | β (use Argo Image Updater) |
| CNCF status | Graduated | Graduated |
| GitHub stars | 7K | 18K |
| Adoption | Platform teams | App teams |
Flux CD Architecture
βββββββββββββββββββββββββββββββββββββββββββββββ
β Flux Controllers β
β β
β βββββββββββββββ ββββββββββββββββββββββββ β
β β Source β β Kustomize β β
β β Controller β β Controller β β
β ββββββββ¬βββββββ ββββββββββββ¬ββββββββββββ β
β β β β
β ββββββββΌβββββββ βββββββββββΌβββββββββββ β
β β Helm β β Notification β β
β β Controller β β Controller β β
β βββββββββββββββ ββββββββββββββββββββββ β
β β
β βββββββββββββββββββββββββββββββββββββββ β
β β Image Reflector + Image Updater β β
β βββββββββββββββββββββββββββββββββββββββ β
βββββββββββββββββββββββββββββββββββββββββββββββFlux Example
apiVersion: source.toolkit.fluxcd.io/v1
kind: GitRepository
metadata:
name: app-repo
namespace: flux-system
spec:
interval: 1m
url: https://github.com/myorg/app-deployments
ref:
branch: main
---
apiVersion: kustomize.toolkit.fluxcd.io/v1
kind: Kustomization
metadata:
name: production-apps
namespace: flux-system
spec:
interval: 5m
path: ./clusters/production
sourceRef:
kind: GitRepository
name: app-repo
prune: true
healthChecks:
- apiVersion: apps/v1
kind: Deployment
name: payment-service
namespace: paymentsArgo CD Architecture
βββββββββββββββββββββββββββββββββββββββ
β Argo CD Server β
β β
β βββββββββββ ββββββββββββββββββββ β
β β API β β Web UI β β
β β Server β β (React) β β
β ββββββ¬βββββ ββββββββββ¬ββββββββββ β
β β β β
β ββββββΌββββββββββββββββββΌβββββββββ β
β β Application Controller β β
β β (reconciliation loop) β β
β βββββββββββββββββ¬ββββββββββββββββ β
β β β
β βββββββββββββββββΌββββββββββββββββ β
β β Repo Server β β
β β (Helm template, Kustomize) β β
β βββββββββββββββββββββββββββββββββ β
βββββββββββββββββββββββββββββββββββββββDecision Framework
Choose Flux when:
- β Platform engineering team manages infrastructure
- β Need multi-tenancy with strict isolation
- β Want modular, composable controllers
- β Image automation (auto-update on new container image)
- β OCI artifact support
- β Donβt need a web UI
Choose Argo CD when:
- β Teams want visual deployment status
- β Need a web UI for non-CLI users
- β ApplicationSets for managing many environments
- β Progressive delivery (with Argo Rollouts)
- β Larger community, more plugins
- β SSO/RBAC for multiple teams in UI
Choose Both (Yes, Really):
Some orgs use Flux for infrastructure (Crossplane, cert-manager, monitoring) and Argo CD for applications (team-facing deployments with UI).
Performance at Scale
| Metric | Flux (1000 apps) | Argo CD (1000 apps) |
|---|---|---|
| Memory | 512MB (split across controllers) | 2-4GB (single process) |
| Reconciliation time | 30s (parallel per controller) | 60-120s (sequential) |
| Git polling | Per-source (efficient) | Per-application |
| Multi-cluster | β (Kustomization per cluster) | β (Cluster secrets) |