Stratégies de synchronisation
Table des matières
1 - Sync manuel vs automatique
Sync manuel
spec:
syncPolicy: {} # Pas de politique = manuel
# Synchroniser manuellement
argocd app sync my-app
Sync automatique
spec:
syncPolicy:
automated: {}
Comparaison
| Aspect | Manuel | Automatique |
|---|---|---|
| Contrôle | Total | Délégué à Argo CD |
| Vitesse | Dépend de l'humain | Instantané |
| Risque | Review possible | Déploiement immédiat |
| Cas d'usage | Production critique | Dev, staging |
🔝 Retour à la table des matières
2 - Auto-sync
Activation
spec:
syncPolicy:
automated:
prune: false # Ne pas supprimer les ressources orphelines
selfHeal: false # Ne pas corriger le drift
Comportement
- Argo CD détecte un changement dans Git (polling toutes les 3 min)
- Compare avec l'état du cluster
- Si OutOfSync → synchronise automatiquement
Configuration du polling
# argocd-cm ConfigMap
apiVersion: v1
kind: ConfigMap
metadata:
name: argocd-cm
namespace: argocd
data:
timeout.reconciliation: 180s # 3 minutes par défaut
Webhook pour sync instantané
# Configurer un webhook GitHub/GitLab
# POST https://argocd.example.com/api/webhook
# Argo CD synchronise immédiatement au lieu d'attendre le polling
🔝 Retour à la table des matières
3 - Self-heal
Définition
Self-heal corrige automatiquement le drift (modification manuelle du cluster).
spec:
syncPolicy:
automated:
selfHeal: true
Exemple de drift
# Git dit : replicas=3
# Quelqu'un fait :
kubectl scale deployment my-app --replicas=5
# Avec selfHeal=true :
# Argo CD détecte le drift et remet à 3 replicas
# Avec selfHeal=false :
# L'application reste OutOfSync jusqu'au prochain sync manuel
Workflow
Quand utiliser
| Scénario | selfHeal |
|---|---|
| Production stable | true |
| Debugging en cours | false |
| Tests manuels | false |
| Compliance stricte | true |
🔝 Retour à la table des matières
4 - Prune
Définition
Prune supprime les ressources du cluster qui ne sont plus dans Git.
spec:
syncPolicy:
automated:
prune: true
Exemple
# Git contient :
# - deployment.yaml
# - service.yaml
# Vous supprimez service.yaml de Git
# Avec prune=true :
# Le Service est supprimé du cluster
# Avec prune=false :
# Le Service reste dans le cluster (orphelin)
Protection contre la suppression
metadata:
annotations:
# Cette ressource ne sera jamais prunée
argocd.argoproj.io/sync-options: Prune=false
PruneLast
spec:
syncPolicy:
syncOptions:
- PruneLast=true # Prune après le sync des autres ressources
🔝 Retour à la table des matières
5 - Sync Options
Options disponibles
spec:
syncPolicy:
syncOptions:
- CreateNamespace=true # Créer le namespace si absent
- PruneLast=true # Prune à la fin
- ApplyOutOfSyncOnly=true # Appliquer seulement les ressources OutOfSync
- PrunePropagationPolicy=foreground # Politique de suppression
- Replace=true # Utiliser replace au lieu d'apply
- ServerSideApply=true # Server-side apply (K8s 1.22+)
CreateNamespace
spec:
destination:
namespace: new-namespace # Sera créé automatiquement
syncPolicy:
syncOptions:
- CreateNamespace=true
Retry
spec:
syncPolicy:
automated:
prune: true
selfHeal: true
retry:
limit: 5
backoff:
duration: 5s
factor: 2
maxDuration: 3m
Sync Waves
# Déployer dans un ordre spécifique
metadata:
annotations:
argocd.argoproj.io/sync-wave: "1" # Déployé en premier
# Ordre : -1 → 0 → 1 → 2 → ...
🔝 Retour à la table des matières
6 - Exercices pratiques
Exercice 1 : Tester le Self-heal
# 1. Créer une application avec self-heal
argocd app create test-heal \
--repo https://github.com/argoproj/argocd-example-apps.git \
--path guestbook \
--dest-server https://kubernetes.default.svc \
--dest-namespace default \
--sync-policy automated \
--self-heal
# 2. Synchroniser
argocd app sync test-heal
# 3. Modifier manuellement
kubectl scale deployment guestbook-ui --replicas=5
# 4. Observer
argocd app get test-heal
# Après quelques secondes, replicas revient à 1
Exercice 2 : Configuration complète
apiVersion: argoproj.io/v1alpha1
kind: Application
metadata:
name: production-app
namespace: argocd
spec:
project: default
source:
repoURL: https://github.com/org/gitops.git
path: apps/my-app
targetRevision: main
destination:
server: https://kubernetes.default.svc
namespace: production
syncPolicy:
automated:
prune: true
selfHeal: true
syncOptions:
- CreateNamespace=true
- PruneLast=true
retry:
limit: 3
backoff:
duration: 5s
factor: 2
maxDuration: 1m
Quiz
Q1. Que fait prune: true ?
Réponse
Prune supprime du cluster les ressources qui ne sont plus présentes dans Git. Si vous supprimez un fichier YAML du repo, la ressource correspondante sera supprimée du cluster.
Q2. Quelle est la différence entre selfHeal et auto-sync ?
Réponse
- auto-sync : Synchronise quand Git change
- selfHeal : Synchronise quand le cluster change (drift)
Les deux sont complémentaires : auto-sync réagit aux changements Git, selfHeal corrige les modifications manuelles du cluster.
🔝 Retour à la table des matières
Points clés à retenir
- Auto-sync : déploiement automatique sur changement Git
- Self-heal : correction automatique du drift
- Prune : suppression des ressources orphelines
- Utiliser Sync Waves pour l'ordre de déploiement
- CreateNamespace pour auto-créer les namespaces