GitOps Principles Recap
GitOps rests on four fundamental principles defined by the CNCF OpenGitOps: the desired state is declarative, versioned in a Git repository that is the single source of truth, and a software agent automatically reconciles the actual state with the desired state. Both ArgoCD and Flux v2 implement these principles, but with radically different architectural philosophies.
ArgoCD Architecture
ArgoCD is composed of several microservices:
- argocd-server: REST API + graphical web interface
- argocd-repo-server: clones Git repositories and generates manifests (Helm, Kustomize, plain YAML)
- argocd-application-controller: compares desired state (Git) with actual state (cluster) and triggers syncs
- argocd-notifications: sends Slack, Teams, PagerDuty notifications on sync events
- argocd-dex: integrated IdP for SSO authentication (GitHub, SAML, OIDC)
Flux v2 Architecture
Flux v2 is a set of Kubernetes controllers (Flux CD GitOps Toolkit):
- source-controller: watches sources (GitRepository, HelmRepository, OCIRepository, Bucket)
- kustomize-controller: applies Kustomize or plain YAML manifests
- helm-controller: manages Helm releases (HelmRelease CRD)
- notification-controller: manages alerts and webhooks
- image-reflector-controller + image-automation-controller: watches for new Docker images and automatically updates Git manifests
Flux has no native web interface — everything is managed via kubectl and the flux CLI.
Feature Comparison Table
| Feature | ArgoCD | Flux v2 |
|---|---|---|
| Graphical web UI | Yes (rich) | No (Weave GitOps as option) |
| Multi-tenancy | Via Projects + RBAC | Via Tenants + namespace isolation |
| Native RBAC | Yes (argocd-rbac-cm) | Via standard Kubernetes RBAC |
| Helm support | Yes (helm template) | Yes (HelmRelease CRD, native) |
| Kustomize support | Yes | Yes |
| Image automation | ArgoCD Image Updater | Native (image-automation) |
| Progressive delivery | Argo Rollouts | Flagger (native integration) |
| SSO / OIDC | Integrated Dex | Via Weave GitOps or Kubernetes |
| Multi-cluster | ApplicationSet | Multi-tenant + remote clusters |
| Notifications | argocd-notifications | notification-controller |
| OCI Registry sources | Yes | Yes (OCIRepository) |
| Scalability | Good (sharding) | Excellent (operator pattern) |
ArgoCD ApplicationSet: Multi-Cluster Deployment
ApplicationSet generates ArgoCD Applications dynamically for multiple clusters or namespaces:
apiVersion: argoproj.io/v1alpha1
kind: ApplicationSet
metadata:
name: my-app-all-clusters
namespace: argocd
spec:
generators:
- clusters:
selector:
matchLabels:
environment: production
template:
metadata:
name: '{{name}}-my-app'
spec:
project: production
source:
repoURL: https://github.com/move2cloud/app-config
targetRevision: HEAD
path: 'overlays/{{metadata.labels.region}}'
destination:
server: '{{server}}'
namespace: my-app
syncPolicy:
automated:
prune: true
selfHeal: true
Flux Image Automation
Flux automatically watches for new Docker images and updates Git manifests — without an external CI/CD pipeline:
# ImageRepository: watch the registry
apiVersion: image.toolkit.fluxcd.io/v1beta2
kind: ImageRepository
metadata:
name: my-app
namespace: flux-system
spec:
image: ghcr.io/move2cloud/my-app
interval: 5m
---
# ImagePolicy: which update policy (semver)
apiVersion: image.toolkit.fluxcd.io/v1beta2
kind: ImagePolicy
metadata:
name: my-app
namespace: flux-system
spec:
imageRepositoryRef:
name: my-app
policy:
semver:
range: '>=1.0.0 <2.0.0'
---
# ImageUpdateAutomation: automatic Git commit
apiVersion: image.toolkit.fluxcd.io/v1beta1
kind: ImageUpdateAutomation
metadata:
name: flux-system
namespace: flux-system
spec:
interval: 1m
sourceRef:
kind: GitRepository
name: flux-system
git:
checkout:
ref:
branch: main
commit:
author:
email: fluxcdbot@move2cloud.com
name: fluxcdbot
messageTemplate: 'chore: update images'
push:
branch: main
update:
path: ./clusters/production
strategy: Setters
Argo Rollouts: Progressive Delivery
Argo Rollouts extends ArgoCD with native canary and blue/green strategies, with automatic metrics analysis to validate or rollback a deployment:
apiVersion: argoproj.io/v1alpha1
kind: Rollout
spec:
strategy:
canary:
steps:
- setWeight: 5
- pause: {duration: 10m}
- analysis:
templates:
- templateName: error-rate-check
- setWeight: 25
- pause: {duration: 10m}
- setWeight: 100
Multi-Tenancy: Flux Wins for Strict Isolation
For environments with multiple teams that must not have access to each other's configurations, Flux offers stricter isolation thanks to its operator-native model. Each tenant has its own ServiceAccount with standard Kubernetes RBAC, without needing a centralised control plane like ArgoCD Server.
Decision Matrix
| Context | Recommendation |
|---|---|
| Need a rich graphical UI for non-Kubernetes teams | ArgoCD |
| Granular RBAC on Applications with SSO | ArgoCD |
| Progressive delivery with Argo Rollouts | ArgoCD |
| Multi-cluster with ApplicationSet | ArgoCD |
| Pure operator approach, no UI, Kubernetes-native team | Flux v2 |
| Strict multi-tenant isolation without centralised control plane | Flux v2 |
| Image automation without dedicated CI pipeline | Flux v2 |
| High scalability (1000+ applications) | Flux v2 |
Conclusion
In 2026, both ArgoCD and Flux v2 are mature production tools. ArgoCD excels if you need a visual interface, advanced application RBAC, or progressive delivery via Argo Rollouts. Flux v2 is superior for environments with strict multi-tenant isolation, an operator-native philosophy, or a need for integrated image automation. The "best" tool is the one your team will actually adopt — and both are excellent.
