Le drift Kubernetes : quand la réalité diverge du code

En GitOps, le ‘drift’ désigne la divergence entre l’état décrit dans Git (la source de vérité) et l’état réel du cluster Kubernetes. Cette divergence peut survenir de nombreuses façons : un ingénieur qui modifie manuellement un déploiement en urgence via kubectl, un opérateur Kubernetes qui ajuste automatiquement les ressources (HPA, VPA), ou un processus externe qui crée des ressources non trackées.

Le drift est dangereux pour plusieurs raisons. D’abord, la reproductibilité : si votre cluster dérive de Git, vous ne pouvez plus recréer l’environnement exactement depuis votre code. Ensuite, la sécurité : un drift peut signifier qu’un attaquant a modifié une configuration de sécurité. Enfin, la confiance : un cluster qui dérive régulièrement indique des pratiques de déploiement non alignées avec GitOps.

ArgoCD est l’outil de référence pour la gestion GitOps Kubernetes en 2026. Son système de détection de drift compare en continu l’état du cluster avec les manifestes Git et offre plusieurs stratégies de réponse : alerter, synchroniser automatiquement, ou bloquer le drift via des politiques.

Configuration d’ArgoCD pour la détection de drift

ArgoCD poll Git toutes les 3 minutes par défaut pour détecter les changements. Pour une détection de drift plus réactive, configurez un webhook Git qui notifie ArgoCD immédiatement après chaque push. Dans GitHub/GitLab, ajoutez un webhook vers `https://argocd.votredomaine.com/api/webhook` — le délai de détection passe de 3 minutes à quelques secondes.

Pour détecter le drift dans l’autre sens (cluster → Git), ArgoCD compare l’état live du cluster (via l’API Kubernetes) avec le dernier commit Git de l’Application. Toute différence est marquée comme ‘OutOfSync’. Configurez ArgoCD pour inclure les annotations, labels et certaines ConfigMaps dans la comparaison — sans ça, des modifications mineures passent inaperçues.

La commande `argocd app diff monapp` affiche le diff exact entre l’état Git et l’état live, similaire à un `terraform plan`. Intégrez cette commande dans vos pipelines CI pour détecter les drifts potentiels avant déploiement.

Stratégies de synchronisation : manuelle vs automatique

ArgoCD propose deux modes de synchronisation. Le mode manuel (défaut) : ArgoCD détecte le drift et affiche une alerte, mais n’agit pas. Un ingénieur décide quand synchroniser (via l’UI ArgoCD, CLI, ou un webhook d’approbation). Ce mode convient aux environnements de production où chaque changement nécessite une validation humaine.

Le mode automatique : ArgoCD synchronise automatiquement dès qu’il détecte un drift. Idéal pour les environnements de développement et de staging, ou pour les organisations avec une confiance totale dans leurs pipelines Git. La synchronisation automatique peut être configurée avec un délai (ex: ne synchroniser que 5 minutes après le drift pour éviter les oscillations) et des politiques de retry.

La combinaison recommandée pour la production : synchronisation automatique activée UNIQUEMENT pour les changements venant de Git (nouvelle version déployée = sync auto), mais alertes uniquement pour le drift dans l’autre sens (modification manuelle du cluster = alerte + blocage, pas de sync auto qui écraserait le changement sans enquête).

Alertes Slack et PagerDuty pour le drift

ArgoCD supporte nativement les notifications via le plugin argocd-notifications. Configurez-le pour envoyer des alertes Slack quand une Application passe en état OutOfSync, Degraded, ou SyncFailed. Les alertes doivent inclure : le nom de l’application, le type de drift (quelle ressource a changé), le diff résumé, et un lien direct vers l’UI ArgoCD.

Pour les drifts critiques (modifications de SecurityContext, NetworkPolicy, ou RBAC), escaladez vers PagerDuty immédiatement. Ces types de drift peuvent indiquer une compromission ou une erreur humaine à fort impact. Configurez des règles de notification différenciées selon le type de ressource affectée.

Intégrez argocd-notifications avec votre SIEM ou système de logs pour tracker historiquement tous les drifts : qui a modifié quoi, quand, et combien de temps avant la détection. Cette trace d’audit est précieuse pour les post-mortems et les audits de conformité.

Politiques de prévention du drift : ResourceHooks et RBAC

La meilleure défense contre le drift est sa prévention. La première ligne de défense : restreindre les droits kubectl sur le cluster de production. Personne ne devrait pouvoir modifier des resources de production directement — tout changement passe par Git. Implémentez des RBAC Kubernetes qui donnent aux ingénieurs des droits en lecture seule sur le namespace de production.

Pour les urgences qui nécessitent une modification manuelle urgente, établissez un processus de ‘break-glass’ documenté : un processus approuvé de deux personnes, avec logging obligatoire dans le ticket d’incident, et une tâche de follow-up pour ramener le changement dans Git dans les 24 heures. Ce processus reconnaît la réalité opérationnelle sans abandonner la discipline GitOps.

Les ResourceHooks ArgoCD permettent d’exécuter des Jobs Kubernetes avant et après la synchronisation — idéal pour des validations pre-sync (schéma correct, tests de migration de base de données) et des tâches post-sync (warm-up du cache, notification des équipes métier). Ces hooks rendent les synchronisations ArgoCD aussi robustes que les pipelines CI/CD traditionnels.

Multicluster GitOps : ArgoCD à l’échelle

Pour les organisations opérant plusieurs clusters Kubernetes (développement, staging, production, multi-région), ArgoCD propose le mode ApplicationSet — une manière de déployer la même Application sur plusieurs clusters depuis une seule définition Git. Un changement dans Git se propage automatiquement sur tous les clusters cibles selon les politiques définies.

L’architecture recommandée pour le multicluster : un cluster ArgoCD dédié (le ‘hub’) qui gère plusieurs clusters Kubernetes ‘spoke’. Le hub n’exécute pas de workloads applicatifs — il est entièrement dédié à la gestion GitOps. Cette séparation garantit qu’une panne applicative ne compromet pas les capacités de déploiement.

En 2026, des alternatives à ArgoCD comme Flux v2 et Fleet (Rancher) ont progressé et méritent évaluation. Flux v2 est plus léger et mieux adapté aux organisations qui préfèrent une approche décentralisée (chaque cluster gère sa propre synchronisation). ArgoCD reste le choix dominant pour les équipes qui valorisent une interface centralisée et des workflows d’approbation formels.

# ArgoCD Application avec notifications drift
apiVersion: argoproj.io/v1alpha1
kind: Application
metadata:
  name: monapp-production
  namespace: argocd
  annotations:
    notifications.argoproj.io/subscribe.on-sync-failed.slack: alertes-devops
    notifications.argoproj.io/subscribe.on-degraded.slack: alertes-devops
    notifications.argoproj.io/subscribe.on-out-of-sync.slack: alertes-devops
spec:
  project: default
  source:
    repoURL: https://github.com/monorg/monapp-k8s
    targetRevision: main
    path: kubernetes/production
  destination:
    server: https://kubernetes.default.svc
    namespace: production
  syncPolicy:
    automated:
      prune: false      # Ne pas supprimer les resources non trackées auto
      selfHeal: false   # Ne pas corriger le drift auto (alerte seulement)
    syncOptions:
    - CreateNamespace=true
    - ServerSideApply=true
    retry:
      limit: 3
      backoff:
        duration: 5s
        factor: 2
        maxDuration: 3m

---
# argocd-notifications configmap (extrait)
# trigger.on-out-of-sync: |
#   - when: app.status.sync.status == 'OutOfSync'
#     oncePer: app.status.sync.revision
#     send: [app-out-of-sync]
# template.app-out-of-sync: |
#   message: |
#     🔴 DRIFT DÉTECTÉ : {{.app.metadata.name}}
#     Namespace: {{.app.spec.destination.namespace}}
#     Lien: {{.context.argocdUrl}}/applications/{{.app.metadata.name}}

Sources et références

W
WP Admin Lab

Architecte web full-stack. WordPress, performance, data et sécurité. Notes de terrain, tests reproductibles et retours d'expérience.