Kustomize
Overview
Kustomize, c'est l'outil de personnalisation Kubernetes qui pense que les templates Helm c'est bien, mais que parfois on veut juste modifier des YAMLs existants sans partir de zéro. Intégré nativement à kubectl, il utilise une approche "overlays" : tu as une base commune et tu appliques des modifications spécifiques par environnement. Si tu veux du multi-environnement simple sans la complexité des templates, c'est parfait.
Kustomize fonctionne avec des fichiers kustomization.yaml qui décrivent comment modifier, patcher, ou composer tes ressources Kubernetes. Pas de templating compliqué, juste des transformations déclaratives sur du YAML standard. Support des secrets, configmaps générés, patches JSON/strategic merge.
Kustomize se distingue par son intégration native kubectl (pas besoin d'installer d'outil séparé), sa philosophie "template-free" (du YAML pur, pas de logique), et sa simplicité conceptuelle (base + overlays = c'est tout).
Informations essentielles
| Propriété | Valeur |
|---|---|
| Site officiel | https://kustomize.io/ |
| Repository | https://github.com/kubernetes-sigs/kustomize |
| Licence | Apache 2.0 |
| Organisation | Kubernetes SIG |
| Langage | Go |
| Intégration | kubectl (depuis v1.14) |
Fonctionnalités principales
Architecture base + overlays
- Base : configuration commune à tous les environnements
- Overlays : modifications spécifiques par environnement
- Composition hiérarchique et réutilisable
- Héritage et surcharge des configurations
- Organisation claire et maintenable
Transformations déclaratives
- Patches JSON et Strategic Merge
- Modification des labels, annotations, namespaces
- Génération automatique de noms et suffixes
- Scaling de replicas par environnement
- Remplacement d'images avec tags spécifiques
Génération de ressources
- ConfigMaps depuis fichiers ou literals
- Secrets depuis fichiers ou literals
- Hashing automatique pour rolling updates
- Support de multiples sources par ressource
- Variables d'environnement injectées
Intégration native
- kubectl apply -k (aucun outil externe)
- Support ArgoCD et FluxCD natif
- Validation des ressources intégrée
- Dry-run et preview des changements
- Debugging avec kubectl kustomize
Cas d'usage
- Multi-environnements : Dev/Staging/Prod avec configurations différentes
- Organisation teams : Bases partagées avec customizations par équipe
- GitOps : Structure de repos claire avec overlays par env
- Migration Helm : Alternative plus simple pour certains cas d'usage
- Standardisation : Configurations d'entreprise avec variantes
Installation
Intégré à kubectl (recommandé)
# Kustomize est intégré à kubectl depuis v1.14
kubectl version --client
# Pas besoin d'installation séparée !
CLI standalone (optionnel)
# Via Homebrew
brew install kustomize
# Via binaire directe
curl -s "https://raw.githubusercontent.com/kubernetes-sigs/kustomize/master/hack/install_kustomize.sh" | bash
sudo mv kustomize /usr/local/bin/
# Via Go
go install sigs.k8s.io/kustomize/kustomize/v5@latest
Utilisation basique
Structure de projet type
.
├── base/
│ ├── deployment.yaml
│ ├── service.yaml
│ ├── configmap.yaml
│ └── kustomization.yaml
└── overlays/
├── development/
│ ├── kustomization.yaml
│ ├── replica-patch.yaml
│ └── dev-config.yaml
├── staging/
│ ├── kustomization.yaml
│ └── staging-patch.yaml
└── production/
├── kustomization.yaml
├── prod-replicas.yaml
└── prod-resources.yaml
Base kustomization.yaml
# base/kustomization.yaml
apiVersion: kustomize.config.k8s.io/v1beta1
kind: Kustomization
resources:
- deployment.yaml
- service.yaml
configMapGenerator:
- name: app-config
files:
- application.properties
literals:
- LOG_LEVEL=info
commonLabels:
app: myapp
version: v1
namespace: myapp
Overlay développement
# overlays/development/kustomization.yaml
apiVersion: kustomize.config.k8s.io/v1beta1
kind: Kustomization
resources:
- ../../base
namePrefix: dev-
nameSuffix: -dev
replicas:
- name: myapp-deployment
count: 1
images:
- name: myapp
newTag: latest
configMapGenerator:
- name: app-config
behavior: merge
literals:
- LOG_LEVEL=debug
- DEBUG=true
patches:
- patch: |-
- op: replace
path: /spec/template/spec/containers/0/resources/requests/memory
value: "128Mi"
target:
kind: Deployment
name: myapp-deployment
Overlay production
# overlays/production/kustomization.yaml
apiVersion: kustomize.config.k8s.io/v1beta1
kind: Kustomization
resources:
- ../../base
namePrefix: prod-
replicas:
- name: myapp-deployment
count: 3
images:
- name: myapp
newTag: v1.2.3
patchesStrategicMerge:
- prod-resources.yaml
secretGenerator:
- name: database-secret
literals:
- DB_PASSWORD=supersecretpassword
Déploiement
# Preview des changements
kubectl kustomize overlays/development
# Déployer en développement
kubectl apply -k overlays/development
# Déployer en production
kubectl apply -k overlays/production
# Dry-run pour vérification
kubectl apply -k overlays/production --dry-run=client
Patches JSON avancées
# Complex patch example
patches:
- patch: |-
- op: add
path: /spec/template/spec/containers/0/env/-
value:
name: NEW_ENV_VAR
value: "development"
- op: replace
path: /spec/template/spec/containers/0/image
value: myapp:development
target:
kind: Deployment
name: myapp
Avantages
- ✅ Intégration native : kubectl built-in, pas d'outil externe à installer
- ✅ Template-free : YAML pur, pas de logique de templating complexe
- ✅ GitOps friendly : structure claire, diffs lisibles, review facile
- ✅ Composition simple : base + overlays = concept facile à comprendre
- ✅ Kubernetes-native : fait par l'équipe Kubernetes, c'est du standard
Limitations
- Moins expressif que Helm pour des logiques complexes : mais c'est voulu pour rester simple
- Pas de conditions ou boucles comme les vrais templates : mais les patches couvrent la plupart des besoins
- Courbe d'apprentissage pour les patches JSON complexes : mais Strategic Merge est plus simple
Alternatives
- Helm : Template engine complet avec logique conditionnelle
- Jsonnet : Template engine avec logique programmable
- Kapitan : Outil de templating multi-format
- YAML simple : Duplication de configs (pas de DRY)
Ressources
- Documentation : https://kustomize.io/
- GitHub : https://github.com/kubernetes-sigs/kustomize
- Tutorial : https://kubectl.docs.kubernetes.io/references/kustomize/
- Examples : https://github.com/kubernetes-sigs/kustomize/tree/master/examples