Aller au contenu principal

GitOps vs CI/CD traditionnel


Table des matières

  1. CI/CD traditionnel
  2. Le modèle Push
  3. Le modèle Pull (GitOps)
  4. Comparaison détaillée
  5. Quand choisir quoi ?
  6. Exercices pratiques

1 - CI/CD traditionnel

Architecture classique

Exemple avec GitHub Actions

# .github/workflows/deploy.yml
name: Build and Deploy

on:
push:
branches: [main]

jobs:
build:
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@v4
- run: docker build -t myapp:${{ github.sha }} .
- run: docker push myapp:${{ github.sha }}

deploy:
needs: build
runs-on: ubuntu-latest
steps:
- uses: azure/k8s-set-context@v1
with:
kubeconfig: ${{ secrets.KUBECONFIG }}

- run: kubectl set image deployment/myapp myapp=myapp:${{ github.sha }}

Problèmes du CI/CD traditionnel

ProblèmeImpact
Credentials exposéskubeconfig dans CI
Drift possibleChangements manuels non tracés
Pas de self-healingSi quelqu'un modifie directement
Audit incompletActions hors Git non tracées

🔝 Retour à la table des matières


2 - Le modèle Push

Comment ça marche

Caractéristiques

  • Le CI/CD pousse les changements vers le cluster
  • Le CI a des credentials d'accès au cluster
  • Déploiement déclenché par le pipeline
  • L'état du cluster peut diverger de Git

Sécurité

# Le CI doit stocker des secrets sensibles
KUBECONFIG=...
# ou
kubectl config set-credentials ...

# Risques :
# - Fuite des credentials
# - Accès direct au cluster
# - Surface d'attaque élargie

🔝 Retour à la table des matières


3 - Le modèle Pull (GitOps)

Comment ça marche

Caractéristiques

  • L'agent tire les changements depuis Git
  • Aucun credential externe vers le cluster
  • Le cluster s'auto-réconcilie
  • Git est la source de vérité absolue

Sécurité améliorée

# Le CI n'a PAS accès au cluster
# Seul l'agent GitOps (dans le cluster) a accès

# Avantages :
# - Pas de credentials CI vers cluster
# - Surface d'attaque réduite
# - Principe du moindre privilège

Workflow GitOps

# 1. CI: Build et push l'image
# .github/workflows/ci.yml
build:
steps:
- run: docker build -t myapp:${{ github.sha }} .
- run: docker push registry/myapp:${{ github.sha }}

# Mise à jour du repo GitOps
- run: |
git clone $GITOPS_REPO
cd gitops-repo
yq -i '.spec.template.spec.containers[0].image = "myapp:${{ github.sha }}"' apps/myapp/deployment.yaml
git commit -am "Update myapp to ${{ github.sha }}"
git push

# 2. GitOps Agent détecte le changement et l'applique

🔝 Retour à la table des matières


4 - Comparaison détaillée

Tableau comparatif

AspectCI/CD PushGitOps Pull
DirectionCI → ClusterCluster ← Git
CredentialsCI a accès clusterAgent interne seulement
DriftPossibleAuto-corrigé
RollbackPipeline à relancergit revert
AuditLogs CIGit history
Self-healingNonOui
ComplexitéSimpleInitiale plus complexe

Sécurité

CritèrePushPull
Credentials externes✅ Oui❌ Non
Surface d'attaqueLargeRéduite
Connexions entrantesRequisesNon requises

Réconciliation

# Scénario : Quelqu'un fait kubectl directement
kubectl scale deployment/myapp --replicas=10

# Push Model :
# - Le changement persiste
# - Drift par rapport à Git
# - Pas de correction automatique

# Pull Model (GitOps) :
# - L'agent détecte la différence
# - Rétablit l'état de Git (ex: replicas=3)
# - Le changement manuel est annulé

🔝 Retour à la table des matières


5 - Quand choisir quoi ?

Choisir CI/CD Push si

  • ✅ Application simple, peu de déploiements
  • ✅ Équipe petite sans culture GitOps
  • ✅ Pas de Kubernetes
  • ✅ Déploiements peu fréquents

Choisir GitOps Pull si

  • ✅ Kubernetes en production
  • ✅ Besoin d'audit complet
  • ✅ Équipes multiples
  • ✅ Multi-environnements (dev, staging, prod)
  • ✅ Exigences de sécurité élevées
  • ✅ Besoin de self-healing

Migration progressive

# Étape 1 : Séparer le repo GitOps
# Le CI met à jour le repo GitOps au lieu de kubectl

# Étape 2 : Installer l'agent GitOps
# ArgoCD ou Flux dans le cluster

# Étape 3 : Désactiver le push direct
# Le CI ne fait plus kubectl

🔝 Retour à la table des matières


6 - Exercices pratiques

Quiz

Q1. Quelle est la principale différence de sécurité entre Push et Pull ?

Réponse

En Push, le CI a des credentials pour accéder au cluster (surface d'attaque large). En Pull, seul l'agent interne au cluster accède à Git (surface d'attaque réduite).

Q2. Que se passe-t-il si quelqu'un fait kubectl scale manuellement en GitOps ?

Réponse

L'agent GitOps détecte le drift entre l'état réel et l'état dans Git, puis réconcilie automatiquement en rétablissant l'état de Git.

Exercice : Analyse de scénario

Votre équipe hésite entre Push et Pull. Analysez :

  • 50 microservices sur Kubernetes
  • 3 environnements (dev, staging, prod)
  • Exigences de conformité (SOC2)
  • Équipe de 15 développeurs
Recommandation

GitOps Pull est recommandé car :

  • Multi-environnements → GitOps excelle
  • SOC2 → Audit trail complet dans Git
  • 50 services → Drift serait un cauchemar sans self-healing
  • 15 devs → Risque de changements manuels non tracés

🔝 Retour à la table des matières


Points clés à retenir

  • Push : CI pousse vers le cluster (credentials exposés)
  • Pull : Agent tire depuis Git (plus sécurisé)
  • GitOps = self-healing et audit complet
  • Push = simple mais risque de drift
  • Migration progressive possible

🔝 Retour à la table des matières


← Chapitre précédent | Chapitre suivant : Source de vérité →