Aller au contenu
CI/CD & Automatisation medium

ArgoCD, Concepts et architecture

20 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 introduit 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.

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.

Ces trois termes reviennent en permanence dans ArgoCD, il faut les distinguer avant d'aller plus loin. Lisez le tableau comme une correspondance entre chaque état et l'endroit où il se matérialise : le desired state vit dans Git, le live state dans le cluster, et leur écart s'appelle le drift.

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

Pour réconcilier, ArgoCD doit savoir quelles ressources lui appartiennent. Il marque chacune avec un identifiant de suivi (tracking id). Depuis ArgoCD 3.0, ce marquage se fait par annotation et non plus par label comme en 2.x, ce qui évite d'entrer en collision avec les labels applicatifs. Sur une ressource déployée, l'annotation ressemble à ceci :

argocd.argoproj.io/tracking-id: guestbook:apps/Deployment:guestbook/guestbook-ui

Elle relie la ressource à son Application (guestbook) et à son type. Si vous migrez depuis la 2.x, notez ce changement de défaut : pour conserver l'ancien suivi par label, positionnez application.resourceTrackingMethod: label dans argocd-cm.

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 : n'importe quelle Application peut déployer n'importe où. 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 :

Le Sync Status répond à une seule question : le cluster est-il conforme à Git ? Il ne dit rien de la santé des workloads, seulement de l'écart entre le desired state et le live state. Voici les trois valeurs que vous croiserez.

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)

Le Health Status est indépendant du Sync Status : il évalue la santé réelle des ressources déployées, pas leur conformité à Git. Une Application peut être Synced mais Degraded si un pod tombe en erreur. Chaque valeur ci-dessous correspond à un état de vie des workloads.

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é

C'est la vue la plus utile de l'interface. Elle affiche l'arbre des ressources d'une Application : l'objet Application à gauche, puis ce qu'il génère en cascade. Chaque nœud porte son état de santé et de synchronisation, ce qui rend le diagnostic immédiat.

Arbre de ressources ArgoCD v3.4.5 : l'Application guestbook Healthy et Synced, reliée à son Service, son Deployment, son ReplicaSet et son Pod running

On lit la filiation Kubernetes de gauche à droite : l'Application guestbook pilote un Service et un Deployment, le Deployment crée un ReplicaSet, qui crée le Pod running 1/1. Le bouton HISTORY AND ROLLBACK en haut donne accès à l'historique des déploiements, utile pour revenir en arrière.

La synchronisation peut être finement ordonnée (sync-waves), ajustée (sync options comme CreateNamespace ou ServerSideApply) et fiabilisée face aux contrôleurs d'admission qui mutent les ressources après leur création. Ces mécanismes avancés sont détaillés dans la leçon dédiée Maîtriser la synchronisation, et le cas particulier des admission controllers (Kyverno, Gatekeeper) dans Admission Controllers.

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 tracking. Un soutien, même symbolique, m'aide à couvrir l'hébergement et à garder ces ressources gratuites. Merci pour votre appui.

Le formulaire ne s'affiche pas ? Ouvrir Ko-fi dans un onglet.

Abonnez-vous et suivez mon actualité DevSecOps sur LinkedIn