Aller au contenu principal

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 officielhttps://kustomize.io/
Repositoryhttps://github.com/kubernetes-sigs/kustomize
LicenceApache 2.0
OrganisationKubernetes SIG
LangageGo
Intégrationkubectl (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