Aller au contenu
CI/CD & Automatisation medium

ArgoCD — Concepts et architecture

15 min de lecture

ArgoCD fonctionne comme un gardien permanent de votre cluster Kubernetes : il compare en continu l’état souhaité (décrit dans Git) avec l’état réel (ce qui tourne dans le cluster), et corrige automatiquement les écarts. Ce guide explique comment ce mécanisme fonctionne, pourquoi il est plus fiable qu’un kubectl apply en fin de pipeline, et quels objets ArgoCD introduce dans votre cluster.

  • Le modèle de réconciliation : desired state, live state, control loop et drift
  • Les composants internes d’ArgoCD (argocd-server, repo-server, application-controller, Redis, Dex) et le rôle de chacun
  • L’objet Application : source Git, destination Kubernetes, politiques de sync
  • Les AppProject : périmètres d’autorisation pour isoler les équipes
  • L’ApplicationSet : génération automatique d’Applications depuis un template

ArgoCD est un opérateur GitOps — c’est-à-dire un programme qui tourne dans votre cluster Kubernetes et qui est spécialisé dans une seule tâche : garder le cluster synchronisé avec un dépôt Git.

L’analogie : Imaginez un contremaître sur un chantier. Il reçoit les plans de l’architecte (votre dépôt Git) et s’assure que les ouvriers (Kubernetes) construisent exactement ce qui est dessiné. Si quelqu’un modifie quelque chose sur le terrain sans passer par les plans, le contremaître le remet dans l’état prévu.

Ce qui distingue ArgoCD d’un simple kubectl apply dans un pipeline :

ApprocheCe qui se passeRisque
kubectl apply en CILe cluster est modifié une fois, puis oubliéDrift : le cluster peut dériver sans que personne ne le sache
ArgoCDArgoCD surveille en permanence, réconcilie en continuDrift détecté et corrigé automatiquement

Le cœur d’ArgoCD est une boucle de contrôle (control loop), qui effectue ces étapes en permanence :

1. OBSERVE → Lire l'état actuel du cluster (live state)
2. DIFF → Comparer avec l'état souhaité dans Git (desired state)
3. ACT → Si différents, appliquer les manifestes Git sur le cluster
4. REPEAT → Reprendre depuis le début

Ce cycle s’appelle la réconciliation. Par défaut, ArgoCD le déclenche toutes les 3 minutes (polling Git) et immédiatement à chaque webhook Git.

TermeDéfinitionOù ça vit
Desired stateCe que vous voulez (décrit dans Git)Dépôt Git
Live stateCe qui tourne réellementCluster Kubernetes
DriftÉcart entre desired et liveDétecté par ArgoCD

ArgoCD est lui-même une application Kubernetes composée de plusieurs pods, chacun avec un rôle précis :

Composants internes d'ArgoCD dans le namespace argocd : argocd-server, repo-server, application-controller, Redis et Dex

C’est le point d’entrée d’ArgoCD. Il expose :

  • L’interface web (dashboard) accessible depuis votre navigateur
  • L’API gRPC/REST que la CLI argocd et les outils externes utilisent

Il ne touche jamais directement au cluster de destination — c’est l’application-controller qui fait les synchronisations.

Son rôle : cloner vos dépôts Git et générer les manifestes Kubernetes finaux. C’est lui qui sait lire du Helm, du Kustomize, ou du YAML brut, et qui produit la liste de toutes les ressources à appliquer.

Le chef d’orchestre. Il :

  1. Appelle le repo-server pour obtenir le desired state
  2. Interroge l’API Kubernetes pour obtenir le live state
  3. Compare les deux
  4. Déclenche les synchronisations si nécessaire

C’est le composant le plus critique — si vous avez plusieurs clusters gérés, c’est lui qui doit scaler.

Un cache utilisé par l’application-controller pour stocker le résultat des comparaisons récentes et éviter de surcharger l’API Kubernetes.

Un service d’authentification OIDC qui permet à ArgoCD de déléguer la connexion à un fournisseur d’identité externe : GitHub, GitLab, LDAP, Active Directory, etc. Obligatoire en production dans une équipe.

ArgoCD étend Kubernetes avec des Custom Resource Definitions (CRD) qui représentent les concepts ArgoCD en tant que ressources Kubernetes.

L’objet Application est la pièce centrale. Il déclare :

  • Où est la source (dépôt Git + chemin + révision)
  • Où déployer (cluster + namespace)
  • Comment synchroniser (manuel ou automatique)
apiVersion: argoproj.io/v1alpha1
kind: Application
metadata:
name: mon-app
namespace: argocd
spec:
# La source : quel dépôt Git et quel chemin
source:
repoURL: https://github.com/mon-org/config-repo
targetRevision: main
path: mon-app/overlays/production
# La destination : quel cluster et quel namespace
destination:
server: https://kubernetes.default.svc # cluster local
namespace: production
# La politique de synchronisation
syncPolicy:
automated: # synchronisation automatique
selfHeal: true # correction du drift automatique
prune: true # suppression des ressources retirées de Git

Un AppProject est un périmètre de sécurité autour d’un groupe d’Applications. Il répond à la question : “Qui a le droit de déployer quoi, où ?”

apiVersion: argoproj.io/v1alpha1
kind: AppProject
metadata:
name: equipe-backend
namespace: argocd
spec:
# Dépôts Git autorisés
sourceRepos:
- https://github.com/mon-org/config-repo
# Clusters et namespaces de destination autorisés
destinations:
- namespace: backend-*
server: https://kubernetes.default.svc
# Types de ressources Kubernetes autorisés
clusterResourceWhitelist:
- group: ''
kind: Namespace

Sans AppProject explicite, les Applications utilisent le projet default qui n’a aucune restriction. En production, chaque équipe doit avoir son propre AppProject.

Un ApplicationSet est un générateur d’Applications. Plutôt que de créer 20 objets Application à la main (un par environnement, ou un par dépôt), on crée un ApplicationSet qui les génère depuis un template :

apiVersion: argoproj.io/v1alpha1
kind: ApplicationSet
metadata:
name: apps-par-env
namespace: argocd
spec:
generators:
- list:
elements:
- env: dev
namespace: app-dev
- env: staging
namespace: app-staging
- env: production
namespace: app-production
template:
metadata:
name: 'mon-app-{{env}}'
spec:
source:
repoURL: https://github.com/mon-org/config-repo
path: 'mon-app/overlays/{{env}}'
targetRevision: main
destination:
server: https://kubernetes.default.svc
namespace: '{{namespace}}'
syncPolicy:
automated:
selfHeal: true
prune: true

Ce fichier crée automatiquement 3 Application ArgoCD : mon-app-dev, mon-app-staging, mon-app-production.

Les ApplicationSets seront détaillés dans le module Multi-environnements.

Quand vous regardez l’interface ArgoCD ou que vous utilisez le CLI, deux dimensions de statut s’affichent toujours :

StatutSignification
SyncedLe cluster correspond exactement à Git
OutOfSyncIl y a des différences — une synchro est nécessaire
UnknownImpossible de déterminer (problème de connexion, permissions)
StatutSignification
HealthyToutes les ressources sont saines (Pods Running, Services OK…)
ProgressingDéploiement en cours (rollout, Job en attente…)
DegradedErreur détectée (Pod CrashLoopBackOff, PVC non monté…)
SuspendedRessource intentionnellement pausée (CronJob suspendu…)
MissingLa ressource est dans Git mais n’existe pas dans le cluster
UnknownArgoCD ne peut pas déterminer l’état de santé

La partie syncPolicy d’une Application ne se limite pas à automated: true. ArgoCD propose des mécanismes avancés pour contrôler l’ordre et le comportement des synchronisations.

Quand une Application contient plusieurs ressources (un CRD, un Namespace, un Deployment…), ArgoCD les applique toutes en même temps par défaut. C’est un problème quand une ressource dépend d’une autre — par exemple, une ClusterPolicy Kyverno ne peut pas être créée si le CRD Kyverno n’existe pas encore.

Les sync-waves résolvent ce problème. Chaque ressource reçoit un numéro d’onde via une annotation — ArgoCD les applique dans l’ordre croissant :

# Le CRD s'installe en premier (wave 0)
apiVersion: argoproj.io/v1alpha1
kind: Application
metadata:
name: kyverno
annotations:
argocd.argoproj.io/sync-wave: "1"
# ...
# Les politiques s'installent après (wave 2)
apiVersion: argoproj.io/v1alpha1
kind: Application
metadata:
name: kyverno-policies
annotations:
argocd.argoproj.io/sync-wave: "2"
# ...

ArgoCD attend que chaque vague soit Healthy avant de passer à la suivante. C’est essentiel pour le pattern App-of-Apps avec des dépendances d’infrastructure.

WaveCe qu’on y metExemple
0Namespaces, CRDs systèmecert-manager, CRDs Kyverno
1–3Opérateurs, contrôleursKyverno, Prometheus Operator
4–6Politiques, configurationsClusterPolicy, PrometheusRule
7–9Applications métierVos microservices

SyncOptions : contrôler le comportement de la synchro

Section intitulée « SyncOptions : contrôler le comportement de la synchro »

Les syncOptions se configurent dans le champ spec.syncPolicy.syncOptions de l’Application. Voici les options les plus utiles :

OptionEffetQuand l’utiliser
CreateNamespace=trueCrée le namespace cible s’il n’existe pasToute Application qui cible un namespace dédié
ServerSideApply=trueUtilise le server-side apply de KubernetesObligatoire pour les CRDs volumineux (Kyverno, Prometheus, cert-manager) qui dépassent la limite de 262 Ko des annotations last-applied-configuration
Validate=falseDésactive la validation côté clientUtile avec des CRDs custom mal déclarés
RespectIgnoreDifferences=trueRespecte les ignoreDifferences même en sync autoQuand un opérateur modifie certains champs post-apply
PruneLast=trueSupprime les ressources obsolètes seulement après toutes les créationsRéduit le risque de disruption lors du pruning
spec:
syncPolicy:
automated:
selfHeal: true
prune: true
syncOptions:
- CreateNamespace=true
- ServerSideApply=true

Certains contrôleurs d’admission (comme Kyverno ou Gatekeeper) mutent les ressources après leur création — ils ajoutent des labels, des annotations ou modifient des champs. ArgoCD voit ces mutations comme un drift et marque l’Application OutOfSync en permanence.

Deux annotations sur l’Application corrigent ce problème :

apiVersion: argoproj.io/v1alpha1
kind: Application
metadata:
name: kyverno
annotations:
argocd.argoproj.io/compare-options: ServerSideDiff=true,IncludeMutationWebhook=true
OptionEffet
ServerSideDiff=trueCalcule les diffs côté serveur au lieu du client — prend en compte l’état réel après mutation
IncludeMutationWebhook=trueIntègre les modifications des webhooks mutants dans le calcul des diffs, évitant les faux positifs OutOfSync

Avant de passer à l’installation, assurez-vous de maîtriser ces termes :

ConceptDéfinition simple
Opérateur GitOpsProgramme K8s qui synchronise le cluster depuis Git
RéconciliationBoucle de contrôle : observe → compare → agit
Desired stateCe que Git dit (les manifestes)
Live stateCe qui tourne réellement dans le cluster
DriftÉcart entre desired et live
ApplicationObjet K8s ArgoCD : source Git → destination cluster
AppProjectPérimètre de sécurité autour d’Applications
ApplicationSetGénérateur automatique d’Applications
Sync StatusLe cluster est-il identique à Git ?
Health StatusLes workloads déployés sont-ils sains ?
  • ArgoCD est un opérateur Kubernetes qui tourne dans votre cluster et surveille Git en permanence.
  • La réconciliation est une boucle : observe → compare → agit. Elle tourne en continu, toutes les 3 minutes par défaut.
  • L’Application est l’objet central : elle lie une source Git à une destination Kubernetes.
  • L’AppProject ajoute des garde-fous de sécurité (qui peut déployer quoi où).
  • L’ApplicationSet génère des Applications automatiquement depuis des templates — indispensable pour gérer plusieurs environnements.
  • Deux statuts à surveiller : Sync Status (Git vs cluster) et Health Status (santé des workloads).

Ce site vous est utile ?

Sachez que moins de 1% des lecteurs soutiennent ce site.

Je maintiens +700 guides gratuits, sans pub ni tracing. Aujourd'hui, ce site ne couvre même pas mes frais d'hébergement, d'électricité, de matériel, de logiciels, mais surtout de cafés.

Un soutien régulier, même symbolique, m'aide à garder ces ressources gratuites et à continuer de produire des guides de qualité. Merci pour votre appui.

Abonnez-vous et suivez mon actualité DevSecOps sur LinkedIn