Aller au contenu principal

Kustomization


Table des matières

  1. Concept
  2. Créer une Kustomization
  3. Options avancées
  4. Dépendances
  5. Health Checks
  6. Exercices pratiques

1 - Concept

Qu'est-ce qu'une Kustomization Flux ?

Une Kustomization Flux applique des manifests Kubernetes depuis une source (GitRepository).

attention

Ne pas confondre avec kustomization.yaml de Kustomize. La Kustomization Flux est une CRD qui utilise le Kustomize Controller.

Workflow

  1. Le Source Controller télécharge le repo
  2. Le Kustomize Controller lit le path spécifié
  3. Il applique les manifests avec kubectl apply
  4. Il vérifie la santé des ressources
  5. Il boucle selon l'interval

🔝 Retour à la table des matières


2 - Créer une Kustomization

YAML basique

apiVersion: kustomize.toolkit.fluxcd.io/v1
kind: Kustomization
metadata:
name: my-app
namespace: flux-system
spec:
interval: 5m
path: ./apps/my-app
prune: true
sourceRef:
kind: GitRepository
name: my-repo
targetNamespace: default

Via CLI

flux create kustomization my-app \
--source=GitRepository/my-repo \
--path="./apps/my-app" \
--prune=true \
--interval=5m \
--target-namespace=default

Avec Kustomize overlays

# Structure du repo
apps/my-app/
├── base/
│ ├── kustomization.yaml
│ ├── deployment.yaml
│ └── service.yaml
└── overlays/
├── dev/
│ └── kustomization.yaml
└── prod/
└── kustomization.yaml
# Flux Kustomization pour prod
apiVersion: kustomize.toolkit.fluxcd.io/v1
kind: Kustomization
metadata:
name: my-app-prod
namespace: flux-system
spec:
interval: 5m
path: ./apps/my-app/overlays/prod
prune: true
sourceRef:
kind: GitRepository
name: my-repo

🔝 Retour à la table des matières


3 - Options avancées

Prune (suppression automatique)

spec:
prune: true # Supprime les ressources orphelines

Force (recréer si nécessaire)

spec:
force: true # Recréer au lieu de patcher

Substitution de variables

spec:
postBuild:
substitute:
ENVIRONMENT: production
REPLICAS: "5"
substituteFrom:
- kind: ConfigMap
name: cluster-config
- kind: Secret
name: cluster-secrets
# Dans le manifest
apiVersion: apps/v1
kind: Deployment
spec:
replicas: ${REPLICAS}
template:
spec:
containers:
- name: app
env:
- name: ENV
value: ${ENVIRONMENT}

Patches inline

spec:
patches:
- patch: |
apiVersion: apps/v1
kind: Deployment
metadata:
name: my-app
spec:
replicas: 3
target:
kind: Deployment
name: my-app

Images

spec:
images:
- name: nginx
newName: my-registry/nginx
newTag: v1.2.3

🔝 Retour à la table des matières


4 - Dépendances

dependsOn

apiVersion: kustomize.toolkit.fluxcd.io/v1
kind: Kustomization
metadata:
name: app
namespace: flux-system
spec:
dependsOn:
- name: infrastructure # Déployer infra d'abord
- name: secrets
interval: 5m
path: ./apps/my-app
sourceRef:
kind: GitRepository
name: my-repo

Ordre de déploiement

# infrastructure.yaml
apiVersion: kustomize.toolkit.fluxcd.io/v1
kind: Kustomization
metadata:
name: infrastructure
spec:
path: ./infrastructure
...
---
# database.yaml
apiVersion: kustomize.toolkit.fluxcd.io/v1
kind: Kustomization
metadata:
name: database
spec:
dependsOn:
- name: infrastructure
path: ./apps/database
...
---
# backend.yaml
apiVersion: kustomize.toolkit.fluxcd.io/v1
kind: Kustomization
metadata:
name: backend
spec:
dependsOn:
- name: database
path: ./apps/backend
...

🔝 Retour à la table des matières


5 - Health Checks

healthChecks

spec:
healthChecks:
- apiVersion: apps/v1
kind: Deployment
name: my-app
namespace: default
timeout: 3m

wait

spec:
wait: true # Attendre que toutes les ressources soient prêtes
timeout: 5m

Retry

spec:
retryInterval: 1m # Réessayer si échec

🔝 Retour à la table des matières


6 - Exercices pratiques

Exercice 1 : Déployer podinfo

# 1. Créer la source
flux create source git podinfo \
--url=https://github.com/stefanprodan/podinfo \
--branch=master

# 2. Créer la Kustomization
flux create kustomization podinfo \
--source=GitRepository/podinfo \
--path="./kustomize" \
--prune=true \
--interval=5m \
--target-namespace=default

# 3. Vérifier
flux get kustomizations
kubectl get pods

Exercice 2 : YAML déclaratif

# podinfo.yaml
apiVersion: source.toolkit.fluxcd.io/v1
kind: GitRepository
metadata:
name: podinfo
namespace: flux-system
spec:
interval: 1m
url: https://github.com/stefanprodan/podinfo
ref:
branch: master
---
apiVersion: kustomize.toolkit.fluxcd.io/v1
kind: Kustomization
metadata:
name: podinfo
namespace: flux-system
spec:
interval: 5m
path: ./kustomize
prune: true
sourceRef:
kind: GitRepository
name: podinfo
targetNamespace: default

Quiz

Q1. Que fait prune: true ?

Réponse

prune: true supprime automatiquement les ressources Kubernetes qui ne sont plus présentes dans Git. Si vous supprimez un fichier du repo, la ressource correspondante sera supprimée du cluster.

Q2. Comment garantir qu'une app est déployée après la database ?

Réponse

Utiliser dependsOn :

spec:
dependsOn:
- name: database

La Kustomization attend que database soit Healthy avant de déployer.

🔝 Retour à la table des matières


Points clés à retenir

  • Kustomization Flux ≠ kustomization.yaml Kustomize
  • sourceRef pointe vers un GitRepository
  • path indique le chemin dans le repo
  • prune: true pour nettoyer les orphelins
  • dependsOn pour l'ordre de déploiement
  • Variables avec postBuild.substitute

← Chapitre précédent | Chapitre suivant : HelmRelease →