Packaging & Config

Kustomize

Outil natif Kubernetes pour personnaliser des manifests YAML sans templating - bases, overlays, patches, transformers. Intégré dans kubectl. Apache 2.0, SIG CLI.

Kustomize est un outil de configuration Kubernetes qui permet de personnaliser des manifests YAML par composition et patches, sans templating. Intégré dans kubectl depuis la v1.14 (kubectl apply -k), il fonctionne par superposition : une base contient les manifests communs, des overlays (dev, staging, prod) y appliquent les différences (patches, variables d'images, préfixes de noms, labels). Pas de template engine, uniquement du YAML pur - ce qui le rend plus prévisible que Helm pour les workflows orientés GitOps.


Informations essentielles

Origine : Google → Kubernetes SIG CLI  ·  Licence : Apache 2.0  ·  Architectures : x86_64, ARM64

Liens : Site officiel  ·  Documentation  ·  GitHub

Support : Intégré dans kubectl. Maintenu par Kubernetes SIG CLI.

Stack par défaut

ComposantValeur
Intégration kubectlkubectl apply -k et kubectl kustomize
CLI standalonekustomize (version plus récente que kubectl intégré)
Fichier centralkustomization.yaml dans chaque répertoire
PatchesStrategic Merge Patch, JSON 6902 Patch
TransformersnamePrefix, nameSuffix, commonLabels, commonAnnotations, images

Prérequis

RessourceValeur
kubectl1.14+ (kustomize intégré)
kustomize CLIOptionnel, pour une version plus récente que kubectl embarqué

Installation (CLI standalone)

# Script officiel
curl -s "https://raw.githubusercontent.com/kubernetes-sigs/kustomize/master/hack/install_kustomize.sh" | bash
sudo mv kustomize /usr/local/bin/

# Homebrew
brew install kustomize

kustomize version

Structure type d'un projet Kustomize

my-app/
├── base/                     # Manifests communs
│   ├── kustomization.yaml
│   ├── deployment.yaml
│   └── service.yaml
└── overlays/
    ├── dev/
    │   ├── kustomization.yaml
    │   └── patch-replicas.yaml
    ├── staging/
    │   └── kustomization.yaml
    └── production/
        ├── kustomization.yaml
        ├── patch-resources.yaml
        └── patch-ingress.yaml

Base - kustomization.yaml

# base/kustomization.yaml
apiVersion: kustomize.config.k8s.io/v1beta1
kind: Kustomization

resources:
  - deployment.yaml
  - service.yaml
  - ingress.yaml
# base/deployment.yaml
apiVersion: apps/v1
kind: Deployment
metadata:
  name: my-app
spec:
  replicas: 1
  selector:
    matchLabels:
      app: my-app
  template:
    metadata:
      labels:
        app: my-app
    spec:
      containers:
        - name: my-app
          image: ghcr.io/org/my-app:latest
          resources:
            requests:
              cpu: 100m
              memory: 128Mi

Overlay Production

# overlays/production/kustomization.yaml
apiVersion: kustomize.config.k8s.io/v1beta1
kind: Kustomization

namePrefix: prod-           # Préfixe sur tous les noms de ressources
namespace: production

resources:
  - ../../base

# Remplacer l'image avec le bon tag de prod
images:
  - name: ghcr.io/org/my-app
    newTag: "1.4.2"

# Ajouter des labels communs
commonLabels:
  env: production

# Patches spécifiques à la prod
patches:
  - path: patch-replicas.yaml
  - path: patch-resources.yaml
# overlays/production/patch-replicas.yaml - Strategic Merge Patch
apiVersion: apps/v1
kind: Deployment
metadata:
  name: my-app           # cible le Deployment my-app de la base
spec:
  replicas: 5
# overlays/production/patch-resources.yaml - Strategic Merge Patch
apiVersion: apps/v1
kind: Deployment
metadata:
  name: my-app
spec:
  template:
    spec:
      containers:
        - name: my-app
          resources:
            requests:
              cpu: 500m
              memory: 512Mi
            limits:
              cpu: 1000m
              memory: 1Gi

Appliquer une configuration

# Prévisualiser les manifests générés
kubectl kustomize overlays/production
# ou avec la CLI standalone
kustomize build overlays/production

# Appliquer directement
kubectl apply -k overlays/production

# Prévisualiser + appliquer via pipe
kustomize build overlays/production | kubectl apply -f -

# Supprimer les ressources
kubectl delete -k overlays/production

Fonctionnalités avancées

Références à des ConfigMaps et Secrets depuis des fichiers

# kustomization.yaml
configMapGenerator:
  - name: app-config
    files:
      - config/app.properties
    literals:
      - LOG_LEVEL=info
      - ENV=production

secretGenerator:
  - name: db-credentials
    literals:
      - username=admin
      - password=secret
    type: Opaque

Inclure des ressources depuis une URL Git

resources:
  - github.com/kubernetes-sigs/kustomize/examples/multibases/dev/?ref=v5.4.0
  - ../../base

Variables de substitution (via Replacements)

# kustomization.yaml
replacements:
  - source:
      kind: Service
      name: my-app
      fieldPath: metadata.name
    targets:
      - select:
          kind: Ingress
          name: my-app
        fieldPaths:
          - spec.rules.0.http.paths.0.backend.service.name

Mise à jour

# CLI standalone
curl -s "https://raw.githubusercontent.com/kubernetes-sigs/kustomize/master/hack/install_kustomize.sh" | bash
sudo mv kustomize /usr/local/bin/

# Via Homebrew
brew upgrade kustomize

Troubleshooting

# Vérifier la sortie avant d'appliquer
kustomize build overlays/production | kubectl diff -f -

# Lister les ressources qui seraient appliquées
kustomize build overlays/production | grep "^kind:"

# Valider la syntaxe (dry-run)
kubectl apply -k overlays/production --dry-run=client

# Erreur "no such file or directory" dans les patches
# Vérifier que le name dans le patch correspond exactement à celui de la base
# (avant application des namePrefix)

Ressources

Newsletter · 2 000+ abonnés

Reste au courant de ce qui bouge en prod

RudeOps veille devops hebdo, droit au but.

Gratuit · Sans spam · Désinscription en un clic