Aller au contenu
Conteneurs & Orchestration medium

Kustomize : Factorisez vos manifests Kubernetes

14 min de lecture

logo Kustomize

Ce guide vous permet de gérer plusieurs environnements Kubernetes (dev, staging, prod) sans dupliquer vos fichiers YAML. Vous apprendrez à créer une base commune, appliquer des overlays par environnement, et déployer avec kubectl apply -k. Prérequis : connaître les manifests Kubernetes de base (Deployment, Service).

  • Structurer vos manifests avec une base et des overlays
  • Personnaliser les déploiements sans modifier les fichiers d’origine
  • Utiliser kubectl apply -k et kubectl diff -k au quotidien
  • Éviter les pièges courants (secrets, patches, versions)

Kustomize est un outil natif intégré à Kubectl qui permet de personnaliser des fichiers YAML sans utiliser de templates. Contrairement à Helm, qui repose sur un système de charts avec des valeurs dynamiques, Kustomize utilise des patches et des overlays pour modifier des configurations existantes.

L’idée principale est simple : au lieu de dupliquer des fichiers YAML, on applique des modifications ciblées à une base commune. Cela permet de gérer plusieurs environnements sans complexifier la maintenance des manifests.

Avec Kustomize, vous pouvez :

  • Éviter la duplication (DRY) des fichiers YAML en réutilisant une base commune.
  • Personnaliser les déploiements en appliquant des overlays spécifiques à chaque environnement.
  • Gérer les secrets et les ConfigMaps sans les inclure directement dans mes manifests.
  • Modifier facilement les images et les labels d’un déploiement Kubernetes.

Voici un tableau comparatif des différences entre Kustomize et Helm :

CritèreKustomizeHelm
ApprochePatch des fichiers YAMLTemplates avec valeurs dynamiques
ComplexitéSimple et natifPlus puissant mais plus complexe
Gestion des dépendancesPas de gestion intégréeSupport des chart dependencies
Utilisation avec kubectlOui (intégré depuis v1.14)Non, nécessite helm
ApprentissageFacile pour débutantsPeut être complexe

Si je veux juste modifier mes manifests existants sans apprendre un nouvel outil, Kustomize est la solution idéale. Pour des déploiements plus avancés avec gestion des dépendances, Helm reste plus adapté.

Kustomize est intégré à kubectl depuis la version 1.14. Vous n’avez donc pas besoin de l’installer séparément.

Pour gérer efficacement les configurations Kubernetes, il est essentiel de comprendre les concepts fondamentaux de Kustomize. Cet outil offre une approche structurée pour personnaliser et déployer des ressources Kubernetes sans dupliquer les fichiers YAML.

Au cœur de Kustomize se trouve le fichier kustomization.yaml. Ce fichier définit comment assembler et personnaliser les ressources Kubernetes. Voici les principaux champs que l’on peut y trouver :

  • resources : liste des fichiers ou répertoires contenant les manifests à inclure.
  • patches : modifications à appliquer aux ressources existantes.
  • configMapGenerator et secretGenerator : pour générer des ConfigMaps et Secrets à partir de fichiers ou de littéraux.
  • labels et annotations : labels et annotations à ajouter à toutes les ressources.

Kustomize utilise une hiérarchie de configurations :

  • Base : ensemble de ressources communes à plusieurs environnements.
  • Overlay : personnalisation spécifique à un environnement (développement, staging, production) qui s’appuie sur une base.

Cette structure permet de réutiliser les configurations et de les adapter selon les besoins sans duplication.

Kustomize propose des outils pour créer et modifier des ressources :

  • Générateurs : créent des ConfigMaps et des Secrets à partir de sources externes.
  • Transformateurs : modifient les ressources existantes, par exemple en ajoutant des labels ou en changeant les noms.

Les patches permettent d’appliquer des modifications ciblées aux ressources.

Nous commençons par un exemple simple pour comprendre comment Kustomize fonctionne. Nous allons créer un deployement et le personnaliser pour deux environnements : dev et prod.

Voici l’arborescence de notre projet :

  • Répertoirekustomize-example/
    • Répertoirebase/
      • kustomization.yaml
      • deployment.yaml
    • Répertoireoverlays/
      • Répertoiredev/
        • kustomization.yaml
        • deployment-patch.yaml
      • Répertoireprod/
        • kustomization.yaml
        • deployment-patch.yaml

Commencer par créer le répertoire base/ dans le dossier de votre projet :

Fenêtre de terminal
mkdir base

Dans ce répertoire, créez le fichier deployment.yaml :

apiVersion: apps/v1
kind: Deployment
metadata:
name: my-app
spec:
replicas: 3
selector:
matchLabels:
app: my-app
template:
metadata:
labels:
app: my-app
spec:
containers:
- name: my-app
image: nginx:latest
ports:
- containerPort: 80

On définit ensuite la configuration de base dans le fichier base/kustomization.yaml :

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

On déclare la ressource deployment.yaml dans le fichier kustomization.yaml.

Nous allons maintenant définir des overlays pour personnaliser le Namespace selon l’environnement.

Commencez par créer les répertoires dev/ et prod/ dans le dossier overlays/.

Fenêtre de terminal
mkdir -p overlays/{dev,prod}

Créez les fichiers de patch dans chaque répertoire d’overlay.

Le fichier deployment-patch.yaml pour dev (1 réplica + label environnement) :

apiVersion: apps/v1
kind: Deployment
metadata:
name: my-app
spec:
replicas: 1
template:
metadata:
labels:
env: dev

Ce patch modifie le nombre de réplicas et ajoute un label env: dev.

Le fichier deployment-patch.yaml pour la prod (3 réplicas + label environnement) :

apiVersion: apps/v1
kind: Deployment
metadata:
name: my-app
spec:
replicas: 3
template:
metadata:
labels:
env: prod

On créé ensuite les fichiers kustomization.yaml dans les répertoires dev/ et prod/ pour appliquer les patches :

apiVersion: kustomize.config.k8s.io/v1beta1
kind: Kustomization
resources:
- ../../base
patches:
- path: deployment-patch.yaml

Générez les manifests pour dev :

Fenêtre de terminal
# Avec kubectl intégré
kubectl kustomize overlays/dev/
# Ou avec le binaire standalone
kustomize build overlays/dev/

Résultat produit :

apiVersion: apps/v1
kind: Deployment
metadata:
name: my-app
spec:
replicas: 1
selector:
matchLabels:
app: my-app
template:
metadata:
labels:
app: my-app
env: dev
spec:
containers:
- image: nginx:latest
name: my-app
ports:
- containerPort: 80

Pour la prod :

Fenêtre de terminal
kubectl kustomize overlays/prod/

Résultat attendu :

apiVersion: apps/v1
kind: Deployment
metadata:
name: my-app
spec:
replicas: 3
selector:
matchLabels:
app: my-app
template:
metadata:
labels:
app: my-app
env: prod
spec:
containers:
- image: nginx:latest
name: my-app
ports:
- containerPort: 80

Le nombre de réplicas et le label env sont différents pour dev et prod.

Appliquer au cluster :

Fenêtre de terminal
# Prévisualiser les différences avec l'existant
kubectl diff -k overlays/dev/
# Appliquer
kubectl apply -k overlays/dev/

Pour gérer les namespaces avec Kustomize, il suffit d’ajouter dans le fichier kustomization.yaml de chaque overlay le champ namespace :

namespace: my-app-dev

Pour le dev et :

namespace: my-app-prod

Pour la prod.

Lançons à nouveau la commande kubectl kustomize overlays/prod/ pour voir le résultat.

apiVersion: apps/v1
kind: Deployment
metadata:
name: my-app
namespace: my-app-prod
spec:
replicas: 3
selector:
matchLabels:
app: my-app
template:
metadata:
labels:
app: my-app
env: prod
spec:
containers:
- image: nginx:latest
name: my-app
ports:
- containerPort: 80

Le namespace my-app-prod est automatiquement injecté dans toutes les ressources de l’overlay.

Kustomize permet de personnaliser les ressources Kubernetes de plusieurs manières sans modifier directement les fichiers YAML d’origine. Ces customisations sont définies dans le fichier kustomization.yaml.

On peut ajouter un préfixe à toutes les ressources définies dans un kustomization.yaml :

namePrefix: dev-

Une ressource Deployment nommée web-app deviendra dev-web-app.

De la même manière, on peut ajouter un suffixe :

nameSuffix: -v1

Une ressource web-app deviendra web-app-v1.

Ajouter une annotation commune (commonAnnotations)

Section intitulée « Ajouter une annotation commune (commonAnnotations) »

On peut aussi ajouter une annotation :

commonAnnotations:
owner: "admin@company.com"

Toutes les ressources auront cette annotation.

Au lieu d’écrire un fichier YAML à la main, on peut générer une ConfigMap directement :

configMapGenerator:
- name: app-config
literals:
- ENV=production
- LOG_LEVEL=debug

Résultat généré :

apiVersion: v1
data:
ENV: production
LOG_LEVEL: debug
kind: ConfigMap
metadata:
name: app-config-f8269b54dd # Hash ajouté automatiquement

De la même façon, on peut générer un Secret. Privilégiez les fichiers plutôt que les literals pour éviter de committer des secrets dans Git :

secretGenerator:
- name: db-secret
files:
- secrets/db-password.txt # Fichier dans .gitignore
type: Opaque

Avec secrets/db-password.txt contenant uniquement le mot de passe (sans retour à la ligne final).

Résultat généré :

apiVersion: v1
data:
db-password.txt: c3VwZXJzZWNyZXQxMjM= # Base64
kind: Secret
metadata:
name: db-secret-gcf5mcd8td # Hash ajouté
type: Opaque

Avec images, on peut modifier le nom ou la version d’une image sans modifier le manifeste :

images:
- name: nginx
newName: my-nginx
newTag: "1.21"

Une image nginx:latest sera remplacée par my-nginx:1.21.

Kustomize est nativement supporté par les outils GitOps :

  • Argo CD : détecte automatiquement les kustomization.yaml et applique les overlays
  • Flux : supporte Kustomize via les Kustomization CRDs

C’est l’une des raisons pour lesquelles Kustomize est populaire en production : il s’intègre sans friction dans un workflow GitOps.

SymptômeCause probableSolution
Patch non appliquéMauvais name dans le patchVérifier que metadata.name correspond à la ressource cible
error: no objects passed to applyresources vide ou mal pointéVérifier le chemin dans resources: [../../base]
ConfigMap/Secret introuvableNom avec hash vs nom fixeLe nom inclut un hash ; utiliser kubectl get configmap pour voir le nom réel
unknown fieldVersion kubectl trop ancienneMettre à jour kubectl ou utiliser le binaire kustomize
Labels non fusionnésPatch partiel mal forméInclure le chemin complet (spec.template.metadata.labels)
Différence kustomize build vs kubectl kustomizeVersions différentesComparer kustomize version et kubectl version
  • Kustomize permet de personnaliser des manifests Kubernetes sans templates ni duplication
  • La structure base + overlays sépare la config commune des spécificités par environnement
  • Utilisez toujours kubectl diff -k avant kubectl apply -k
  • Le champ patches: remplace les anciens patchesStrategicMerge et patchesJson6902
  • Les generators ajoutent un hash au nom des ConfigMaps/Secrets (c’est normal)
  • Ne jamais committer de secrets en clair, même avec secretGenerator
  • La version intégrée à kubectl peut différer du binaire standalone

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.