đ GitOps â Guide complet (Kubernetes / Argo CD / Flux)
GitOps = Git comme source de vérité + réconciliation automatique (drift detection, audit, rollback). Guide IDEO-Lab densifié : archi, workflow, sécurité, multi-env, troubleshooting.
Définition & promesse
Git = vérité, cluster = cible. Reconciliation + audit + rollback.
GitDriftReconcileLes 4 piliers GitOps
Déclaratif, versionné, pull-based, réconciliation continue.
DeclarativePullAuditOutils & écosystÚme
Argo CD / Flux, Helm/Kustomize, Terraform, secrets (SOPS).
ArgoCDFluxHelmArchitecture type
Repo(s), environnements, apps-of-apps, controllers, policies.
Repo layoutAppsPoliciesStructure Git recommandée
Mono-repo vs multi-repo, overlays env, promotion par PR.
monorepooverlaysPRWorkflow CI â GitOps CD
CI build/test + image tag, CD via commit manifests + sync.
CICDPromotion2.4 Drift & auto-heal
DĂ©tection dâĂ©cart entre Git et cluster + correction automatique.
DriftAuto-healRollouts & stratégies
Blue/Green, Canary, progressive delivery, analyse & rollback.
CanaryBlue/GreenArgo RolloutsSécurité & secrets
RBAC, least privilege, signed commits, SOPS/SealedSecrets, OPA.
RBACSOPSPolicyObservabilité
Events, health checks, metrics, alerting sur dérives & sync errors.
MetricsAlertsHealthTroubleshooting
Sync errors, diff noisy, CRDs, ordering, hooks, drift âfantĂŽmeâ.
DiffCRDHooksCheat-sheet GitOps
Commandes, checklists, anti-patterns et âgolden rulesâ.
cmdchecklistrulesDĂ©finition âopĂ©rationnelleâ
GitOps est une pratique oĂč Git est la source de vĂ©ritĂ© pour dĂ©crire lâĂ©tat dĂ©sirĂ© (applications + configuration + parfois infrastructure). Un ou plusieurs contrĂŽleurs (dans le cluster) tirent la configuration depuis Git, la comparent Ă lâĂ©tat rĂ©el, puis rĂ©concilient.
Ce que GitOps âremplaceâ
- Les accĂšs manuels au cluster (ex:
kubectl applyen prod). - Les scripts ad-hoc de déploiement non traçables.
- Les âmodifs de configâ hors Git (drift silencieux).
Pourquoi ça marche si bien ?
Parce que Git est dĂ©jĂ un outil de gouvernance : revue, historisation, diff, signatures, branches, contrĂŽles dâaccĂšs, CI, approbations.
| Propriété | GitOps apporte |
|---|---|
| Audit | Traçabilité parfaite : qui a changé quoi et quand. |
| ReproductibilitĂ© | Un cluster vide peut ĂȘtre âreconstruitâ depuis Git. |
| SĂ©curitĂ© | Moins de secrets âhumainsâ + RBAC + pull-only. |
| Stabilité | Le drift est détecté et corrigé (auto-heal). |
Diagramme GitOps (mental model)
Développeur / SRE
â
â (PR / Merge / Tag)
âŒ
[ GIT Repository ]
â ââ manifests (Kustomize/Helm/YAML)
â ââ policies (OPA / Kyverno)
â ââ env overlays (dev/stage/prod)
â
â (pull + diff)
âŒ
[ GitOps Controller in Cluster ]
â - Argo CD / Flux
â - compare desired vs live
â - reconcile (apply)
â - detect drift + report
âŒ
[ Kubernetes Cluster ]
â
ââ Deployments / Services / Ingress
ââ ConfigMaps / Secrets (encrypted or external)
ââ CRDs (operators)
ââ Observability (events/metrics)
Cas dâusage parfaits
- Kubernetes multi-environnements (dev/stage/prod) + besoin dâaudit.
- Ăquipes nombreuses : standardiser, rĂ©duire les accĂšs prod.
- Infra âimmutableâ : reconstruire rapidement (DRP / disaster recovery).
- Besoin de compliance (SOC2/ISO) : preuves = Git + logs.
Cas âOKâ mais Ă cadrer
- Infra Terraform : GitOps est possible, mais attention aux âplans/applyâ et aux verrous dâĂ©tat.
- Config runtime trĂšs dynamique : mieux via external config (vault/feature flags), pas en Git pur.
Anti-cas (ou risques)
- Si lâĂ©quipe fait des changements âĂ chaudâ sans les commiter â drift permanent.
- Si les secrets sont committĂ©s en clair â interdit.
- Si lâordre dâapplication CRDs/operators nâest pas gĂ©rĂ© â sync failures.
RĂšgle dâor
Prod ne doit pas ĂȘtre modifiĂ© directement. Tout passe par Git (PR), sinon tu casses la promesse GitOps.
GitOps vs CD âpushâ classique
| Point | CD classique (push) | GitOps (pull) |
|---|---|---|
| Déploiement | CI pousse vers le cluster | Cluster tire depuis Git |
| AccĂšs prod | Credentials dans CI | CI nâa pas besoin dâaccĂšs prod (idĂ©alement) |
| Audit | Logs CI + scripts | Git = audit principal + état désiré |
| Drift | Souvent invisible | Détecté (diff) + corrigé (auto-heal) |
| Rollback | Procédure variable | git revert ou retour de tag |
DĂ©claratif : âvoici lâĂ©tat dĂ©sirĂ©â
Tu dĂ©cris ce que tu veux, pas la procĂ©dure pour y arriver. Exemple : â3 replicasâ, âingress activĂ©â, âresource limitsâ.
apiVersion: apps/v1
kind: Deployment
metadata:
name: web
spec:
replicas: 3
template:
spec:
containers:
- name: app
image: registry/app:1.4.2
resources:
requests: { cpu: "200m", memory: "256Mi" }
limits: { cpu: "1", memory: "512Mi" }
Checklist âdĂ©claratif propreâ
- Manifests gĂ©nĂ©rĂ©s (Helm/Kustomize) mais âreviewablesâ.
- Pas de valeurs runtime dans Git (tokens, passwords, clés).
- Ressources et probes définies (readiness/liveness).
- Namespaces & labels cohérents (ownership, app, env).
Versionné : Git = historique officiel
Chaque changement dâinfra/config/app est un commit, idĂ©alement via PR avec revue & CI.
# Exemple: promotion stage -> prod
- PR: bump image tag 1.4.2 -> 1.4.3
- CI: lint manifests + policy checks
- Merge: Argo/Flux sync prod
- Observability: alert if sync fails
Checklist âgouvernanceâ
- Branches protégées + approbations obligatoires.
- Conventional commits / changelog (optionnel mais utile).
- CODEOWNERS (SRE owners sur dossiers prod).
- Signatures commits/tags (si exigences compliance).
Pull-based : le cluster tire, la CI ne pousse pas
Le contrĂŽleur GitOps vit dans le cluster et rĂ©cupĂšre les manifests depuis Git. Cela rĂ©duit lâexposition : plus besoin de donner au CI des droits admin sur prod.
CI (build/test) â
- build image
- scan image
- publish image
CD GitOps â
- commit manifests (tag image)
- controller pulls + applies
Points dâattention
- AccĂšs Git : token read-only par environnement si possible.
- Rotation des secrets (repo credentials) + scopes minimaux.
- Webhooks optionnels : accélÚrent la sync, mais le polling suffit.
RĂ©conciliation continue : drift â correction
Le contrĂŽleur compare en boucle desired (Git) vs live (cluster). Si divergence : il applique, alerte, ou bloque selon policy.
Loop:
- fetch Git revision
- render manifests
- diff vs cluster live
- if drift:
- sync/apply
- emit events
- update health status
Modes de sync
| Mode | Effet | Quand ? |
|---|---|---|
| Manual sync | Opérateur déclenche | Début / contrÎle strict |
| Auto sync | Déploiement automatique | Pipeline mature |
| Auto-heal | Corrige drift live | Prod, anti âkubectl driftâ |
| Prune | Supprime ressources retirées de Git | Quand Git = vérité totale |
Stack GitOps âstandardâ en entreprise
- Git provider: GitHub / GitLab
- Registry: GHCR / ECR / GCR / Harbor
- Kubernetes: EKS / GKE / AKS / on-prem
- GitOps controller: Argo CD (GUI) ou Flux (Kubernetes-native)
- Manifests: Helm charts + values / Kustomize overlays
- Secrets: SOPS + KMS (AWS/GCP) ou External Secrets (Vault/SM)
- Policy: Kyverno ou OPA Gatekeeper
- Observability: Prometheus/Grafana + Alertmanager + logs (Loki/ELK)
Argo CD (pattern courant)
- UI trĂšs pratique (diff, sync status, app tree).
- Pattern App of Apps pour organiser des centaines dâapps.
- Intégration RBAC et multi-clusters.
Flux (pattern courant)
- TrĂšs âKubernetes-nativeâ (CRDs :
GitRepository,KustomizationâŠ). - Composants modulaires, excellent pour GitOps âpurâ.
- Souvent prĂ©fĂ©rĂ© si on veut moins de UI et plus dâinfra-as-code.
Table décisionnelle : Argo CD vs Flux
| CritĂšre | Argo CD | Flux |
|---|---|---|
| UI / visibilitĂ© | â TrĂšs forte | â (extensions possibles) |
| ModĂšle | Applications (App CRD) | CRDs âK8s-firstâ (KustomizationâŠ) |
| Onboarding | Rapide (GUI + concepts clairs) | Plus technique (CRDs, controllers) |
| Scale multi-app | TrĂšs bon (App-of-apps) | TrĂšs bon (Kustomizations) |
| Flux + Helm | â | â (Helm Controller) |
| Opinionated | PlutĂŽt âApp-centricâ | PlutĂŽt âK8s-centricâ |
Helm (templating)
Bon pour packager une app (chart) + paramĂštres par environnement (values).
# values-prod.yaml
replicaCount: 3
image:
repository: ghcr.io/acme/app
tag: "1.4.3"
ingress:
enabled: true
Attention : trop de logique Helm rend le diff illisible â rester sobre.
Kustomize (overlays)
Excellent pour overlays env (patches) et composition.
# overlays/prod/kustomization.yaml
resources:
- ../../base
patches:
- path: patch-replicas.yaml
- path: patch-ingress.yaml
Astuce : base = commun ; overlays = uniquement deltas (réduit la duplication).
Terraform + GitOps : 2 patterns
Pattern A (classique)
Terraform gĂšre lâinfra (VPC, cluster, IAM, DB), puis GitOps gĂšre les apps sur le cluster. Câest le plus simple et le plus robuste.
Terraform:
- VPC, EKS/GKE, nodegroups
- ingress controller, cert-manager (option)
GitOps:
- apps + configs + policies
Pattern B (Terraform âGitOpsâ)
Le contrĂŽleur GitOps dĂ©clenche des âapplyâ Terraform (moins courant). Risques : lock state, ordering, drift infra complexe.
- OK si âTerraform controllersâ matures + states bien gĂ©rĂ©s.
- Sinon : garde Terraform dans CI dédiée avec approvals.
Topologie recommandée (lisible & scalable)
Git Repos:
- app-source/ (code + Dockerfile) -> produit une image
- platform-config/ (manifests GitOps) -> décrit l'état désiré
Clusters:
- dev cluster
- stage cluster
- prod cluster
Controllers:
- 1 controller GitOps par cluster (souvent)
- ou 1 controller central multi-clusters (selon RBAC)
Pourquoi séparer code et config ?
- Le repo âconfigâ devient le journal de lâĂ©tat prod.
- Les droits dâaccĂšs sont diffĂ©rents (prod = plus strict).
- Tu peux promouvoir une image sans toucher au code.
Quand garder un monorepo ?
- Petite Ă©quipe, peu dâapps.
- Si tu veux des PR âtout-en-unâ (code+deploy).
- Mais attention : governance prod plus difficile.
Gestion des environnements
| Approche | Principe | Avantage | Risque |
|---|---|---|---|
| Branches | dev/stage/prod = branches | Simple | Merge conflicts + drift branch |
| Dossiers | /env/dev /env/prod | Lisible | Gros repo Ă scaler |
| Repos séparés | 1 repo par env | RBAC strict | Duplication si mal structuré |
Policies : empĂȘcher les âmauvaises configsâ
Exemples de rĂšgles utiles
- Interdire
:latesten prod (images non immutables). - Exiger
resources.limitset probes. - Interdire
privileged: true. - Forcer labels (team, env, app).
Outils
- Kyverno : policies YAML âK8s friendlyâ.
- OPA Gatekeeper : policies Rego (puissant).
- CI lint : kubeconform, kubeval, helm lint.
Pattern âApp-of-Appsâ (Argo CD)
root-app (Argo CD Application)
âââ apps/
âââ monitoring.yaml (Prometheus, Grafana)
âââ ingress.yaml (Ingress controller)
âââ app1.yaml (Business app #1)
âââ app2.yaml (Business app #2)
Avantages:
- 1 point d'entrée (root-app)
- onboarding simple: ajouter un fichier appX.yaml
- scale: des centaines d'apps gérables
Layout âpropreâ pour platform-config
platform-config/
âââ clusters/
â âââ dev/ # ce cluster suit env/dev
â âââ stage/
â âââ prod/
âââ env/
â âââ base/ # manifests communs
â âââ dev/ # overlays dev
â âââ stage/
â âââ prod/
âââ apps/
â âââ app-web/
â âââ app-api/
â âââ app-worker/
âââ policies/
âââ kyverno/
âââ opa/
Objectif : sĂ©parer âoĂč ça tourneâ (clusters) de âce qui tourneâ (apps).
Mono-repo vs multi-repo (décision rapide)
| Option | Quand | + / - |
|---|---|---|
| Monorepo | petite Ă©quipe, peu dâapps | â simple / â gouvernance prod difficile |
| Repo config dĂ©diĂ© | moyen/grand SI | â audit & RBAC / â 2 repos Ă gĂ©rer |
| 1 repo par env | compliance forte | â cloisonnement / â duplication si mal gĂ©rĂ© |
Promotion (dev â stage â prod)
Pattern simple
- CI build + push image
app:1.4.3. - PR sur
env/dev(ou dev overlay) pour mettre le tag. - Validation (tests, policies) â merge.
- PR de promotion vers stage puis prod.
Anti-pattern
- Ăcraser le tag prod directement sans passer par stage.
- Modifier live cluster âpour dĂ©pannerâ puis oublier de commiter.
- Utiliser
:latest(rollback impossible, drift non maßtrisé).
Exemples de fichiers (templates)
Kustomize base
# env/base/kustomization.yaml
resources:
- deployment.yaml
- service.yaml
- ingress.yaml
Overlay prod
# env/prod/kustomization.yaml
resources:
- ../base
patches:
- path: patch-prod.yaml
images:
- name: ghcr.io/acme/app
newTag: "1.4.3"
Pipeline âgolden pathâ
(1) Dev pushes code
(2) CI:
- tests
- build image
- scan (SCA/SAST)
- publish image (tag immutable)
(3) CI (ou bot) ouvre PR sur repo config:
- bump image tag + config changes
(4) Merge PR
(5) GitOps Controller:
- detect new commit
- render manifests
- sync
(6) Observability:
- health checks
- alert if sync error / degraded
CI : ce que tu veux absolument
- Tests unitaires + intégration.
- Build image reproductible (Dockerfile propre).
- Scan dépendances + image (vulnérabilités).
- Publish image immuable (tag version, digest).
# Exemple de tags
app:1.4.3
app:1.4.3+build.21
app@sha256:abcdef...
Deux options âupdate manifestsâ
| Option | Principe | Note |
|---|---|---|
| Bot commit | CI commit direct dans repo config | Rapide mais attention gouvernance |
| PR auto | CI ouvre PR, humain valide | Le plus âenterprise-friendlyâ |
CD GitOps : ce que fait le contrĂŽleur
- RécupÚre la derniÚre révision Git (poll/webhook).
- Render Helm/Kustomize.
- Calcule diff.
- Sync (apply) selon la policy.
- Surveille health (degraded, progressingâŠ)
Desired (Git) vs Live (cluster)
- if OutOfSync: apply
- if Degraded: alert + maybe rollback
ContrĂŽle du âblast radiusâ
- Déployer par namespaces (ownership clair).
- Limiter permissions du controller (RBAC).
- Approvals sur dossiers prod (CODEOWNERS).
- Progressive delivery (canary) pour changements risqués.
Guardrails (filtres anti-cata)
| Couche | ContrĂŽle | Exemples |
|---|---|---|
| Git | Approvals & protections | branch protection, CODEOWNERS |
| CI | Lint & policy checks | kubeconform, helm lint, kyverno test |
| Cluster | Admission policies | OPA/Kyverno bloque configs non conformes |
| Runtime | Observability & SLO | alerts, rollback automatique |
Définition
Le drift apparaĂźt quand lâĂ©tat rĂ©el du cluster diverge de lâĂ©tat dĂ©sirĂ© stockĂ© dans Git. Exemple : quelquâun fait un kubectl edit en prod, ou un operator modifie un champ.
Git says: replicas=3
Cluster live: replicas=5
=> OutOfSync / drift
Causes humaines
- Hotfix âjuste pour dĂ©pannerâ â non committĂ©.
- AccĂšs prod trop large (beaucoup dâadmins).
- Absence de process PR / approbations.
Causes techniques
- Operators/CRDs qui âmutentâ des champs.
- Defaulting API server (valeurs injectées).
- Controllers qui ajoutent annotations/labels dynamiques.
Auto-heal : la âvraieâ valeur GitOps
- Auto-heal ON : le controller remet le cluster comme Git le décrit.
- Auto-heal OFF : drift détecté, mais correction manuelle (ou PR) requise.
Stratégie recommandée
- Dev/stage : auto-heal ON (itérations rapides)
- Prod : auto-heal ON + RBAC strict + policy checks
Si tu dois hotfix en prod
- Faire la modif (si urgence).
- CrĂ©er immĂ©diatement PR âalign Git avec liveâ.
- Une fois PR mergée : re-sync GitOps.
Réduire le bruit de diff
- Ăviter champs âautoâ dans Git (timestamps, status fields).
- Configurer âignore differencesâ sur champs mutĂ©s (selon outil).
- Standardiser labels/annotations.
- Limiter la logique Helm (diff plus stable).
Stratégies de déploiement
| Stratégie | Principe | Quand |
|---|---|---|
| Rolling update | Remplacement progressif pods | Par défaut, changements simples |
| Blue/Green | Deux versions, switch traffic | Quand tu veux un cutover net |
| Canary | Trafic progressif vers nouvelle version | Quand risque élevé / perf |
Canary mental model:
- 5% traffic -> observe
- 25% traffic -> observe
- 50% traffic -> observe
- 100% -> promote
If errors -> abort / rollback
Argo Rollouts (exemple âconceptuelâ)
kind: Rollout
spec:
strategy:
canary:
steps:
- setWeight: 10
- pause: { duration: 2m }
- setWeight: 25
- pause: { duration: 5m }
- setWeight: 50
- pause: { duration: 10m }
LâidĂ©e : ton GitOps dĂ©ploie un objet Rollout (dĂ©claratif), puis la stratĂ©gie fait le reste.
Quality gates
- Gates metrics : taux dâerreur HTTP, latence P95, saturation CPU/mem.
- Gates logs : spikes dâexceptions, timeouts DB.
- Gates fonctionnels : smoke tests sur endpoints critiques.
Rollback : 3 niveaux
- Rollback Git :
git revertdu commit manifests (le plus propre). - Rollback rollout : abort canary / promote ancienne version.
- Rollback infra : plus rare, via Terraform + approvals.
# RĂšgle pratique:
Rollback = revenir à un état Git connu "green"
Principe : least privilege
- Le controller GitOps a des droits limités (namespaces ciblés).
- Les humains nâont pas besoin dâĂȘtre admins prod.
- Le repo prod est protégé (CODEOWNERS + approvals).
RBAC quick rules:
- 1 namespace = 1 équipe (idéal)
- interdire cluster-admin au controller
- limiter verbs: get/list/watch/apply sur ressources nécessaires
Git Access
- Token repo read-only (si possible) cÎté controller.
- Rotation périodique.
- Scopes minimaux (pas âadmin repoâ).
Secrets : ce quâil faut faire
Option A : SOPS (recommandé GitOps)
Secrets chiffrés dans Git, déchiffrés dans le cluster via KMS.
secret.enc.yaml (in Git) â
encrypted
controller decrypts with KMS (AWS/GCP)
applies Secret to cluster
Option B : External Secrets
Git ne contient pas le secret, seulement une référence (Vault/Secret Manager).
Git: ExternalSecret manifest
Runtime: operator fetches value from Vault/SM
Supply chain security
- Signatures images (cosign) + vérification en admission.
- SBOM (cyclonedx/spdx) généré en CI.
- Scan vulnérabilités (deps + images).
- Pin par digest (
@sha256) pour immutabilité stricte.
Golden rule:
- image tags = ok
- digests = best (immutable)
- "latest" = never in prod
Policies (admission control)
But : rendre impossible un dĂ©ploiement dangereux, mĂȘme si quelquâun pousse un mauvais manifest.
| RĂšgle | Exemple |
|---|---|
| Interdire containers privileged | securityContext.privileged != true |
| Forcer limits | resources.limits obligatoires |
| Interdire latest | image != *:latest |
| Forcer labels | team/env/app requis |
Ce que tu dois monitorer
- Sync status : in sync / out of sync
- Health : healthy / degraded / progressing
- Latency de sync : temps entre commit et déploiement
- Erreurs répétées : retry loops, hooks failing
Alerts recommandées:
- app OutOfSync > X min
- app Degraded
- sync failures spikes
- drift frequency high (symptĂŽme d'accĂšs manuel)
Signal vs bruit
Si tes dashboards sont rouges tout le temps, lâĂ©quipe les ignore. Fixe le âdiff noiseâ (champs dynamiques), standardise les manifests, et dĂ©finis des SLO simples.
Quick SLO (exemples)
- 95% des dĂ©ploiements âHealthyâ en < 10 minutes
- 0 déploiement prod via accÚs manuel (objectif)
Sync errors : pattern de diagnostic
- Lire lâerreur exacte (resource + message).
- Valider que la ressource existe (namespace, CRD, API version).
- Vérifier permissions (RBAC du controller).
- Vérifier rendus Helm/Kustomize (templating).
Cas typiques:
- "namespace not found" -> créer namespace en amont
- "forbidden" -> RBAC du controller
- "no matches for kind X" -> CRD manquante
CRDs : le piÚge n°1
Si tu appliques un objet custom avant sa CRD, ça échoue.
Ordre recommandé:
1) CRDs
2) Operators/controllers
3) Custom resources (CRs)
Solution : séparer en apps (infra) et apps (workloads), ou utiliser sync waves/hooks.
Diff âbruyantâ
- Champs mutĂ©s par operators â ignorer certains champs.
- Annotations dynamiques (ex: checksum config) â standardiser.
- Helm trop âsmartâ â rĂ©duire logique.
Recovery playbook (rapide)
- Stop the bleeding : pause auto-sync si nécessaire.
- Rollback : revert commit / revenir au dernier état green.
- Fix root cause : CRD ordering / RBAC / policy.
- Re-enable : auto-sync + monitor health.
RĂšgles dâor
1) Git = source de vérité (prod ne se modifie pas à la main)
2) Secrets jamais en clair
3) Images immutables (tag version / digest) â jamais :latest
4) Policy checks avant merge (lint + admission)
5) Observabilité: alerte sur OutOfSync/Degraded
Checklist âPR prodâ
- Diff lisible (pas de bruit)
- Resource limits + probes
- Rollback plan simple
- Change log / description claire
- App health check ok
Commandes (conceptuelles)
# Workflow git checkout -b feat/bump-app-1.4.3 # modifier image tag / values / overlay git commit -am "chore(prod): bump app to 1.4.3" git push # Rollback git revertgit push
Anti-patterns
- âkubectl applyâ en prod sans PR
- Config runtime (secrets) dans Git en clair
- Helm chart illisible (trop de logique)
- Pas de policies â drift + dĂ©ploiements dangereux
