Aller au contenu
CI/CD & Automatisation medium
🔐 Alerte sécurité — Incident supply chain Trivy : lire mon analyse de l'attaque

Flux CD — Première application avec Kustomize

11 min de lecture

Flux est installé et surveille votre dépôt. Vous allez maintenant déployer une première application réelle depuis Git. Ce guide explique comment créer une GitRepository (source), une Kustomization (déploiement), lire les statuts de réconciliation et vérifier que le self-healing fonctionne — la marque qu’un déploiement GitOps propre.

  • Structurer un dépôt Git de configuration pour plusieurs applications
  • Créer une GitRepository pointant vers un dépôt Git
  • Créer une Kustomization qui déploie les manifestes d’une application
  • Lire les statuts de réconciliation : READY, SUSPENDED, FAILED
  • Tester le self-healing : modifier le cluster et voir Flux corriger
  • Suspendre et reprendre une Kustomization
  • Flux bootstrappé sur un cluster (flux check affiche tout en vert)
  • Un dépôt Git accessible par Flux (celui créé au bootstrap)
  • kubectl et flux CLI installés localement

Commençons par comprendre comment organiser le dépôt fleet-infra créé au bootstrap. La convention recommandée par Flux :

fleet-infra/
├── clusters/
│ └── my-cluster/
│ ├── flux-system/ ← Géré par Flux, ne pas modifier manuellement
│ └── apps.yaml ← Kustomization racine des applications
├── apps/
│ ├── base/ ← Manifestes de base
│ │ └── podinfo/ ← Une application
│ │ ├── deployment.yaml
│ │ ├── service.yaml
│ │ └── kustomization.yaml
│ ├── development/
│ │ └── podinfo/
│ │ └── kustomization.yaml ← Overlay dev
│ └── production/
│ └── podinfo/
│ └── kustomization.yaml ← Overlay prod
└── infrastructure/
└── sources/
└── podinfo.yaml ← GitRepository

Cette structure sépare clairement :

  • clusters/ : ce qui est spécifique à chaque cluster
  • apps/ : les applications (base partagée + overlays par environnement)
  • infrastructure/ : les sources et composants d’infrastructure partagés

Nous allons déployer podinfo, une application de démo légère souvent utilisée dans les tutoriels Kubernetes.

  1. Créer la Source GitRepository

Dans votre dépôt fleet-infra, créez infrastructure/sources/podinfo.yaml :

apiVersion: source.toolkit.fluxcd.io/v1
kind: GitRepository
metadata:
name: podinfo
namespace: flux-system
spec:
interval: 1m
ref:
branch: master
url: https://github.com/stefanprodan/podinfo

Ce fichier déclare que Flux doit surveiller le dépôt stefanprodan/podinfo sur la branche master et télécharger une archive toutes les minutes.

  1. Créer la Kustomization de déploiement

Créez apps/base/podinfo/kustomization.yaml dans votre dépôt :

apiVersion: kustomize.config.k8s.io/v1beta1
kind: Kustomization
resources:
- deployment.yaml
- service.yaml

Et clusters/my-cluster/apps.yaml :

apiVersion: kustomize.toolkit.fluxcd.io/v1
kind: Kustomization
metadata:
name: apps
namespace: flux-system
spec:
interval: 5m
path: ./apps/base/podinfo
prune: true
sourceRef:
kind: GitRepository
name: podinfo
targetNamespace: podinfo
  1. Pousser dans Git et observer la réconciliation
Fenêtre de terminal
# Depuis la racine de fleet-infra
git add .
git commit -m "feat: add podinfo application"
git push origin main

Flux détecte le changement dans votre dépôt (dans les 60 secondes ou immédiatement si vous avez configuré un Receiver). Il applique les manifestes automatiquement.

Pour déclencher une réconciliation immédiate sans attendre :

Fenêtre de terminal
flux reconcile source git flux-system
flux reconcile kustomization flux-system
  1. Vérifier les statuts de réconciliation
Fenêtre de terminal
# Lister les kustomizations
flux get kustomizations
# NAME REVISION SUSPENDED READY MESSAGE
# apps master/a1b2c3 False True Applied revision: master@sha1:a1b2c3
# flux-system main/d4e5f6 False True Applied revision: main@sha1:d4e5f6
# Vérifier les pods déployés
kubectl get pods -n podinfo
# NAME READY STATUS RESTARTS AGE
# podinfo-7d9f8c6b5-x2k9p 1/1 Running 0 30s
# Voir les événements Flux
flux events --for kustomization/apps
  1. Créer un namespace dédié (recommandé)

Par défaut, targetNamespace: podinfo déploie dans un namespace qui doit exister. Créez-le explicitement pour éviter une erreur :

Fenêtre de terminal
kubectl create namespace podinfo

Ou ajoutez un Namespace dans les manifestes de base avec l’annotation kubectl.kubernetes.io/last-applied-configuration pour que Flux le gère.

Flux expose trois informations pour chaque ressource :

ChampValeurs possiblesSignification
READYTrue, False, UnknownL’objet est dans l’état souhaité
SUSPENDEDTrue, FalseLa réconciliation est mise en pause
MESSAGETexte libreDernier message de statut

Applied revision: ... — succès, les manifestes ont été appliqués.

Reconciliation in progress — Flux est en train de réconcilier.

kustomization path not found — le path déclaré dans la Kustomization n’existe pas dans la source. Vérifiez le chemin relatif.

Source not ready — la GitRepository référencée n’est pas prête. Déboguez d’abord la source : flux get source git.

namespace not found — le targetNamespace déclaré n’existe pas dans le cluster. Créez le namespace ou gérez-le dans les manifestes.

Le self-healing est l’une des propriétés fondamentales du GitOps : toute modification manuelle du cluster est automatiquement annulée par Flux.

Voici comment le tester :

Fenêtre de terminal
# Modifier manuellement le nombre de replicas
kubectl scale deployment podinfo -n podinfo --replicas=5
# Observer le changement
kubectl get deployment podinfo -n podinfo
# READY UP-TO-DATE AVAILABLE
# 5/5 5 5
# Attendre jusqu'à 5 minutes (ou forcer la reconcile)
flux reconcile kustomization apps
# Vérifier que Flux a rétabli la valeur déclarée dans Git
kubectl get deployment podinfo -n podinfo
# READY UP-TO-DATE AVAILABLE
# 2/2 2 2

Flux a détecté que l’état du cluster (5 replicas) différait de ce qui est déclaré dans Git (2 replicas) et a corrigé automatiquement.

Il est parfois nécessaire de suspendre la réconciliation d’une Kustomization — avant une opération de maintenance, par exemple, ou lors d’un débogage :

Fenêtre de terminal
# Suspendre
flux suspend kustomization apps
# Flux affiche SUSPENDED: True
flux get kustomizations
# NAME REVISION SUSPENDED READY MESSAGE
# apps master/a1b2c3 True True ...
# Faire votre opération de maintenance...
# Reprendre
flux resume kustomization apps

Quand une application dépend d’une autre (par exemple, une application qui nécessite qu’une base de données soit déployée en premier), utilisez spec.dependsOn :

apiVersion: kustomize.toolkit.fluxcd.io/v1
kind: Kustomization
metadata:
name: my-app
namespace: flux-system
spec:
interval: 5m
dependsOn:
- name: database # my-app attend que database soit READY
path: ./apps/my-app
prune: true
sourceRef:
kind: GitRepository
name: fleet-infra

Flux attend que database soit READY: True avant de réconcilier my-app. Si database échoue, my-app reste en attente.

Si votre dépôt d’application est privé (séparé du dépôt de configuration), vous devez créer un Secret avec les credentials :

Fenêtre de terminal
# Créer un Secret avec une clé SSH dédiée
flux create secret git my-app-credentials \
--url=ssh://git@github.com/my-org/my-app \
--ssh-key-algorithm=ecdsa \
--ssh-ecdsa-curve=p521

Cette commande génère une paire de clés SSH et affiche la clé publique. Ajoutez cette clé publique comme deploy key sur votre dépôt GitHub.

Puis référencez ce Secret dans la GitRepository :

apiVersion: source.toolkit.fluxcd.io/v1
kind: GitRepository
metadata:
name: my-app
namespace: flux-system
spec:
interval: 1m
url: ssh://git@github.com/my-org/my-app
ref:
branch: main
secretRef:
name: my-app-credentials
  • GitRepository déclare une source — Flux télécharge son contenu.
  • Kustomization déclare ce qu’on déploie depuis une source et où.
  • Le self-healing corrige automatiquement toute dérive entre Git et le cluster — c’est la garantie fondamentale du GitOps.
  • prune: true supprime du cluster les ressources retirées de Git.
  • dependsOn permet d’ordonner les déploiements inter-dépendants.
  • flux suspend / flux resume permettent de mettre en pause sans supprimer.

Ce site vous est utile ?

Sachez que moins de 1% des lecteurs soutiennent ce site.

Je maintiens +700 guides gratuits, sans pub ni tracing. Aujourd'hui, ce site ne couvre même pas mes frais d'hébergement, d'électricité, de matériel, de logiciels, mais surtout de cafés.

Un soutien régulier, même symbolique, m'aide à garder ces ressources gratuites et à continuer de produire des guides de qualité. Merci pour votre appui.

Abonnez-vous et suivez mon actualité DevSecOps sur LinkedIn