Skip to main content
/ DevOps

ArgoCD in 2026: Why 60% of Kubernetes Teams Choose It for GitOps

Sacha Roussakis-NotterSacha Roussakis-Notter
16 min read
Kubernetes
Terraform
Share

The definitive guide to ArgoCD and GitOps. Covers architecture, ApplicationSets, multi-cluster management, sync strategies, when to use ArgoCD, when to avoid it, and production best practices.

GitOps Has Won — And ArgoCD Is Leading the Charge

According to the July 2025 CNCF End User Survey, nearly 60% of Kubernetes clusters now rely on ArgoCD for deployments. The CNCF-graduated project has become the de facto standard for GitOps continuous delivery.

But what makes ArgoCD so dominant? And more importantly — is it right for your team?

flowchart

GitOps (Pull)

Pulls

Applies

Git Repo

ArgoCD

Kubernetes

Traditional (Push)

Push creds

CI Server

Kubernetes

Risk: Creds distributed

Secure: No external access

Ctrl+scroll to zoom • Drag to pan52%

What is GitOps?

GitOps is a methodology coined by Weaveworks that uses Git as the single source of truth for infrastructure and application configurations. The name comes from their experience recovering their entire production environment from a catastrophic failure — simply by reapplying their Git-stored configurations.

The Four GitOps Principles

flowchart

GitOps Principles

Loop

1. Declarative
2. Versioned
3. Pulled Automatically
4. Continuously Reconciled
Ctrl+scroll to zoom • Drag to pan46%
PrincipleDescription
DeclarativeEntire system described as code (YAML manifests)
VersionedAll changes tracked in Git with full audit trail
Pulled AutomaticallyGitOps agent pulls and applies changes
Continuously ReconciledAny drift from desired state is automatically corrected

Pull vs Push: Why Pull Wins

Push-Based (Traditional CI/CD):

bash
1# CI pipeline pushes to cluster - requires distributed credentials
2kubectl apply -f manifests/ --kubeconfig=$KUBE_CONFIG

Pull-Based (GitOps):

yaml
1# ArgoCD pulls from Git - no external credentials needed
2apiVersion: argoproj.io/v1alpha1
3kind: Application
4metadata:
5 name: my-app
6spec:
7 source:
8 repoURL: https://github.com/org/repo.git
9 path: manifests/
10 destination:
11 server: https://kubernetes.default.svc

The pull model is inherently more secure — credentials never leave your cluster.

ArgoCD: The GitOps Powerhouse

ArgoCD is a declarative, GitOps continuous delivery tool that continuously monitors your applications and compares the live state against the desired state in Git. Any deviation triggers an "OutOfSync" status, and ArgoCD can automatically (or manually) reconcile the difference.

CNCF Graduated Status

  • Accepted to CNCF: March 2020
  • Graduated: December 2022
  • Current Version: 3.x (2025-2026)
  • Adoption: ~60% of surveyed Kubernetes clusters

Architecture Deep Dive

flowchart

ArgoCD Components

API Server

Repo Server

Application Controller

Redis Cache

Dex SSO

Web UI / CLI

Kubernetes Cluster(s)

Git Repositories

Ctrl+scroll to zoom • Drag to pan44%
ComponentPurpose
API ServerExposes REST/gRPC API, serves Web UI, handles RBAC
Repo ServerClones Git repos, generates Kubernetes manifests
Application ControllerWatches applications, detects drift, triggers sync
RedisCaches manifests and repo data for performance
DexSSO integration (OIDC, SAML, LDAP, GitHub, etc.)

ArgoCD Features That Matter

1. Application CRD: Your Deployment Definition

Everything in ArgoCD starts with the Application custom resource:

yaml
1apiVersion: argoproj.io/v1alpha1
2kind: Application
3metadata:
4 name: frontend
5 namespace: argocd
6spec:
7 # Which ArgoCD project (for RBAC)
8 project: default
9
10 # Where to get manifests
11 source:
12 repoURL: https://github.com/buun-group/frontend.git
13 targetRevision: HEAD
14 path: k8s/
15
16 # Where to deploy
17 destination:
18 server: https://kubernetes.default.svc
19 namespace: frontend
20
21 # Automation settings
22 syncPolicy:
23 automated:
24 prune: true # Delete resources removed from Git
25 selfHeal: true # Revert manual kubectl changes
26 syncOptions:
27 - CreateNamespace=true

2. Sync Policies: Control Your Deployments

yaml
1syncPolicy:
2 automated:
3 prune: true # Remove resources not in Git
4 selfHeal: true # Auto-revert manual changes
5 allowEmpty: false # Prevent empty deployments
6
7 syncOptions:
8 - CreateNamespace=true
9 - PrunePropagationPolicy=foreground
10 - PruneLast=true
11 - ApplyOutOfSyncOnly=true
12
13 retry:
14 limit: 5
15 backoff:
16 duration: 5s
17 factor: 2
18 maxDuration: 3m
PolicyEffect
prune: trueDeletes resources removed from Git
selfHeal: trueReverts manual kubectl changes automatically
PruneLast: trueDeletes resources only after new ones are healthy
ApplyOutOfSyncOnly: trueOnly syncs changed resources (faster)

3. ApplicationSets: Scale to Hundreds of Apps

ApplicationSets dynamically generate Applications based on rules:

yaml
1apiVersion: argoproj.io/v1alpha1
2kind: ApplicationSet
3metadata:
4 name: microservices
5 namespace: argocd
6spec:
7 goTemplate: true
8 generators:
9 # Generate app for each directory in services/
10 - git:
11 repoURL: https://github.com/buun-group/gitops.git
12 revision: HEAD
13 directories:
14 - path: services/*
15
16 template:
17 metadata:
18 name: '{{.path.basename}}'
19 spec:
20 project: default
21 source:
22 repoURL: https://github.com/buun-group/gitops.git
23 path: '{{.path.path}}'
24 destination:
25 server: https://kubernetes.default.svc
26 namespace: '{{.path.basename}}'
27 syncPolicy:
28 automated:
29 prune: true
30 selfHeal: true

Generator Types:

GeneratorUse Case
Git DirectoryApp per directory in repo
Git FileApp per config file (JSON/YAML)
ClusterDeploy to multiple clusters
ListManual list of applications
MatrixCombine multiple generators
Pull RequestPreview environments for PRs
SCM ProviderAuto-discover repos from GitHub/GitLab org

4. Multi-Cluster Management

Deploy across clusters from a single ArgoCD instance:

bash
1# Add external cluster
2argocd cluster add production-cluster-context
3
4# List managed clusters
5argocd cluster list
6# SERVER NAME VERSION STATUS
7# https://kubernetes.default.svc in-cluster 1.28 Successful
8# https://prod.k8s.example.com production 1.28 Successful
yaml
1# ApplicationSet for multi-cluster deployment
2apiVersion: argoproj.io/v1alpha1
3kind: ApplicationSet
4metadata:
5 name: multi-cluster-app
6spec:
7 generators:
8 - clusters:
9 selector:
10 matchLabels:
11 tier: production
12 template:
13 metadata:
14 name: 'app-{{.name}}'
15 spec:
16 destination:
17 server: '{{.server}}'
18 namespace: my-app

5. Resource Hooks: Orchestrate Complex Deployments

Run jobs at specific points in the sync lifecycle:

yaml
1# PreSync Hook: Database migration before deployment
2apiVersion: batch/v1
3kind: Job
4metadata:
5 name: db-migrate
6 annotations:
7 argocd.argoproj.io/hook: PreSync
8 argocd.argoproj.io/hook-delete-policy: HookSucceeded
9spec:
10 template:
11 spec:
12 containers:
13 - name: migrate
14 image: my-app:migrate
15 command: ["./migrate.sh"]
16 restartPolicy: Never
17---
18# PostSync Hook: Smoke tests after deployment
19apiVersion: batch/v1
20kind: Job
21metadata:
22 name: smoke-tests
23 annotations:
24 argocd.argoproj.io/hook: PostSync
25 argocd.argoproj.io/hook-delete-policy: HookSucceeded
26spec:
27 template:
28 spec:
29 containers:
30 - name: test
31 image: my-app:test
32 command: ["./smoke-test.sh"]
33 restartPolicy: Never
HookWhen It Runs
PreSyncBefore sync (migrations, backups)
SyncDuring sync (complex orchestration)
PostSyncAfter successful sync (tests, notifications)
SyncFailIf sync fails (alerting)
PreDeleteBefore app deletion (cleanup) — new in v3.3

6. App of Apps Pattern

Bootstrap entire environments with a single Application:

yaml
1# Root Application manages all other Applications
2apiVersion: argoproj.io/v1alpha1
3kind: Application
4metadata:
5 name: production-apps
6 namespace: argocd
7spec:
8 project: default
9 source:
10 repoURL: https://github.com/buun-group/gitops.git
11 path: apps/production/ # Contains Application manifests
12 destination:
13 server: https://kubernetes.default.svc
14 namespace: argocd
15 syncPolicy:
16 automated:
17 prune: true
18 selfHeal: true
text
1gitops-repo/
2 apps/
3 production/
4 frontend.yaml # Application CRD
5 backend.yaml # Application CRD
6 database.yaml # Application CRD
7 monitoring.yaml # Application CRD
8 manifests/
9 frontend/
10 backend/
11 database/
12 monitoring/

One kubectl apply bootstraps your entire environment.

7. RBAC and Multi-Tenancy

ArgoCD Projects enable team isolation:

yaml
1apiVersion: argoproj.io/v1alpha1
2kind: AppProject
3metadata:
4 name: team-frontend
5 namespace: argocd
6spec:
7 description: Frontend team's project
8
9 # Allowed source repositories
10 sourceRepos:
11 - 'https://github.com/buun-group/frontend-*'
12
13 # Allowed deployment targets
14 destinations:
15 - namespace: 'frontend-*'
16 server: https://kubernetes.default.svc
17
18 # Allowed cluster resources
19 clusterResourceWhitelist:
20 - group: ''
21 kind: Namespace
22
23 # Team roles
24 roles:
25 - name: frontend-admin
26 policies:
27 - p, proj:team-frontend:frontend-admin, applications, *, team-frontend/*, allow
28 groups:
29 - frontend-team-github-group

8. SSO Integration

Connect to your identity provider:

yaml
1# argocd-cm ConfigMap
2apiVersion: v1
3kind: ConfigMap
4metadata:
5 name: argocd-cm
6 namespace: argocd
7data:
8 url: https://argocd.buun.io
9 dex.config: |
10 connectors:
11 - type: github
12 id: github
13 name: GitHub
14 config:
15 clientID: $github-client-id
16 clientSecret: $github-client-secret
17 orgs:
18 - name: buun-group

Supported Providers: GitHub, GitLab, Google, Okta, Azure AD, LDAP, SAML 2.0, OIDC

When to Use ArgoCD

flowchart

No

Yes

Yes

No

Yes

No

Yes

No

Do you use Kubernetes?

ArgoCD is Kubernetes-only

Multiple clusters or environments?

Use ArgoCD

Team > 5 developers?

Need audit trail / compliance?

Consider simpler alternatives

Visual dashboard, Multi-cluster, RBAC, Auto drift correction

Ctrl+scroll to zoom • Drag to pan35%

Ideal Scenarios

  • Kubernetes-native organizations — you're all-in on K8s
  • Multi-cluster deployments — dev, staging, production clusters
  • Large teams — need RBAC, audit trails, and visibility
  • Compliance requirements — audit logs for every change
  • Microservices architectures — managing 10+ services
  • Platform engineering — building internal developer platforms
  • Multi-cloud / hybrid — consistent deployments across providers

When NOT to Use ArgoCD

Overkill Scenarios

  • Single app, single environment — too much overhead
  • Non-Kubernetes workloads — ArgoCD is K8s-only
  • Teams of 1-3 developers — simpler tools suffice
  • Rapid prototyping — adds unnecessary complexity
  • No Git workflow — GitOps requires Git discipline

ArgoCD Limitations

LimitationWorkaround
CD only (no CI)Use GitHub Actions, GitLab CI, etc.
No security scanningAdd Trivy, Snyk, or Grype
No auto rollbackUse Argo Rollouts or external monitoring
Kubernetes onlyUse Terraform for non-K8s resources
Secret managementUse External Secrets, Sealed Secrets, or Vault

ArgoCD vs Alternatives

ArgoCD vs Flux CD

AspectArgoCDFlux CD
UIRich built-in Web UINo native UI (use Weave GitOps)
ArchitectureMonolithic applicationModular toolkit
Multi-tenancyProjects and RBACKubernetes-native RBAC
Learning curveLower (intuitive UI)Higher (more K8s-native)
Image updatesSeparate tool (Image Updater)Built-in
Best forTeams new to GitOpsKubernetes purists

Choose ArgoCD if you want a visual dashboard and simpler onboarding.

Choose Flux if you prefer lightweight, Kubernetes-native tooling.

ArgoCD vs Spinnaker

AspectArgoCDSpinnaker
FocusKubernetes GitOpsMulti-platform CD
ComplexityModerateHigh
ResourcesLightweightResource-intensive
PlatformsKubernetes onlyK8s, VMs, cloud services
Deployment strategiesBasic (use Argo Rollouts)Advanced built-in

Choose ArgoCD for Kubernetes-focused, simpler operations.

Choose Spinnaker for multi-platform deployments (VMs, cloud services).

Production Best Practices

Repository Structure

text
1gitops-repo/
2 apps/ # ArgoCD Applications
3 base/
4 overlays/
5 dev/
6 staging/
7 production/
8 manifests/ # Kubernetes manifests
9 frontend/
10 base/
11 overlays/
12 backend/
13 clusters/ # Cluster-specific configs
14 dev-cluster/
15 prod-cluster/
16 argocd/ # ArgoCD self-management
17 applications/
18 projects/

Anti-Patterns to Avoid:

  • ❌ Branches for environments (use directories)
  • ❌ Mixing app code with deployment configs
  • ❌ Storing secrets in plaintext

Secret Management

ArgoCD doesn't manage secrets — use these approaches:

Option 1: External Secrets Operator

yaml
1apiVersion: external-secrets.io/v1beta1
2kind: ExternalSecret
3metadata:
4 name: api-keys
5spec:
6 secretStoreRef:
7 name: vault
8 kind: ClusterSecretStore
9 target:
10 name: api-keys
11 data:
12 - secretKey: api-key
13 remoteRef:
14 key: secret/my-app/api-key

Option 2: Sealed Secrets

bash
1# Encrypt secret client-side
2kubeseal --format yaml < secret.yaml > sealed-secret.yaml
3# Commit sealed-secret.yaml to Git (safe!)

Sync Windows (Maintenance Windows)

Control when syncs can occur:

yaml
1apiVersion: argoproj.io/v1alpha1
2kind: AppProject
3spec:
4 syncWindows:
5 # Allow syncs only during business hours
6 - kind: allow
7 schedule: '0 9-17 * * 1-5' # Mon-Fri 9am-5pm
8 duration: 8h
9 applications:
10 - '*'
11 # Deny syncs during peak traffic
12 - kind: deny
13 schedule: '0 12 * * *' # Noon daily
14 duration: 2h
15 applications:
16 - 'production-*'

High Availability

For production ArgoCD:

yaml
1# Multiple API server replicas
2apiVersion: apps/v1
3kind: Deployment
4metadata:
5 name: argocd-server
6spec:
7 replicas: 3 # HA mode
8---
9# Redis HA with Sentinel
10apiVersion: apps/v1
11kind: StatefulSet
12metadata:
13 name: argocd-redis-ha
14spec:
15 replicas: 3

Notifications

Alert on sync events:

yaml
1apiVersion: v1
2kind: ConfigMap
3metadata:
4 name: argocd-notifications-cm
5data:
6 service.slack: |
7 token: $slack-token
8
9 trigger.on-sync-failed: |
10 - when: app.status.sync.status == 'Failed'
11 send: [app-sync-failed]
12
13 template.app-sync-failed: |
14 slack:
15 attachments: |
16 [{
17 "title": "{{.app.metadata.name}} sync failed",
18 "color": "#E96D76",
19 "fields": [{
20 "title": "Repository",
21 "value": "{{.app.spec.source.repoURL}}"
22 }]
23 }]

What's New in ArgoCD 3.x (2025-2026)

VersionFeature
3.0Architecture improvements, security enhancements
3.1OCI registry support, CLI plugins
3.2PR title filters for ApplicationSets
3.3PreDelete hooks, OIDC refresh tokens, enhanced RBAC

The PreDelete hook in v3.3 was one of the most requested features — finally enabling cleanup logic before application deletion.

Getting Started

Install ArgoCD

bash
1# Create namespace
2kubectl create namespace argocd
3
4# Install ArgoCD
5kubectl apply -n argocd -f https://raw.githubusercontent.com/argoproj/argo-cd/stable/manifests/install.yaml
6
7# Get initial admin password
8argocd admin initial-password -n argocd
9
10# Access UI (port-forward for testing)
11kubectl port-forward svc/argocd-server -n argocd 8080:443
12# Open https://localhost:8080

Deploy Your First App

bash
1# Login to ArgoCD
2argocd login localhost:8080
3
4# Create application
5argocd app create my-app \
6 --repo https://github.com/your-org/your-app.git \
7 --path k8s/ \
8 --dest-server https://kubernetes.default.svc \
9 --dest-namespace my-app
10
11# Sync application
12argocd app sync my-app

Or declaratively:

yaml
1apiVersion: argoproj.io/v1alpha1
2kind: Application
3metadata:
4 name: my-app
5 namespace: argocd
6spec:
7 project: default
8 source:
9 repoURL: https://github.com/your-org/your-app.git
10 path: k8s/
11 destination:
12 server: https://kubernetes.default.svc
13 namespace: my-app
14 syncPolicy:
15 automated:
16 prune: true
17 selfHeal: true

The Verdict

ArgoCD has earned its dominance. For Kubernetes teams wanting GitOps with a visual interface, multi-cluster support, and enterprise features — it's the obvious choice.

But it's not for everyone. If you're running a single app, prototyping, or working outside Kubernetes — simpler tools exist.

The 60% adoption figure isn't accidental. ArgoCD solves real problems for real teams at scale.

Brisbane GitOps Consulting

At Buun Group, we help Queensland organisations implement GitOps with ArgoCD:

  • GitOps Strategy — design Git workflows for infrastructure and applications
  • ArgoCD Implementation — install, configure, and secure ArgoCD
  • Multi-Cluster Setup — manage deployments across environments
  • Migration Support — transition from Jenkins/manual deployments to GitOps
  • Training — upskill your team on GitOps best practices

We've deployed ArgoCD for Australian enterprises. We know what works.

Topics

ArgoCD 2026GitOps KubernetesArgoCD vs FluxArgoCD tutorialKubernetes continuous deliveryGitOps best practicesArgoCD ApplicationSetArgoCD multi-cluster

Share this post

Share

Comments

Sign in to join the conversation

Login

No comments yet. Be the first to share your thoughts!

Found an issue with this article?

/ Let's Talk

Want to work with us?

Whether you need help with architecture, development, or technical consulting, our team is here to help bring your vision to life.