Aller au contenu principal

Stratégies de synchronisation


Table des matières

  1. Sync manuel vs automatique
  2. Auto-sync
  3. Self-heal
  4. Prune
  5. Sync Options
  6. Exercices pratiques

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

AspectManuelAutomatique
ContrôleTotalDélégué à Argo CD
VitesseDépend de l'humainInstantané
RisqueReview possibleDéploiement immédiat
Cas d'usageProduction critiqueDev, 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

  1. Argo CD détecte un changement dans Git (polling toutes les 3 min)
  2. Compare avec l'état du cluster
  3. 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énarioselfHeal
Production stabletrue
Debugging en coursfalse
Tests manuelsfalse
Compliance strictetrue

🔝 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

← Chapitre précédent | Chapitre suivant : UI et CLI →