Structurer un dépôt avec des overlays Kustomize par environnement
Organisez un dépôt pour le dev et la production, et évitez le piège du déploiement de ConfigMap.
Les applications réelles tournent dans plusieurs environnements qui diffèrent légèrement : nombre de réplicas, noms d’hôte, valeurs de configuration. Flux applique du YAML brut ou des overlays Kustomize, et détecte lequel un dossier utilise. Ce guide montre comment structurer un dépôt pour plusieurs environnements avec Kustomize, comment informer Flux de chacun, et traite un piège qui piège les gens avec les changements de configuration. Il s’appuie sur l’exemple webapp des guides précédents.
Choisir une organisation : des dossiers, pas des branches
Vous pouvez modéliser les environnements comme des branches de longue durée (dev, staging, main), mais cela fait de la promotion un exercice de fusion et laisse les environnements dériver les uns des autres. Une seule branche avec un dossier par environnement est plus facile à raisonner : chaque environnement est visible côte à côte, et un changement dans l’un est un diff normal.
La documentation de Flux décrit trois stratégies de dépôt courantes :
- Monorepo. Tous les clusters, applications et l’infrastructure dans un seul dépôt. Le plus simple pour commencer, et celui utilisé ici.
- Un dépôt par environnement. Par exemple, un pour le staging et un pour la production, avec des règles d’accès distinctes.
- Un dépôt par équipe ou par application. Isolation forte, avec un dépôt plateforme qui enregistre le dépôt de chaque équipe.
Un monorepo typique ressemble à ceci :
fleet-infra/
├── clusters/
│ ├── dev/ # Kustomizations Flux pour le cluster dev
│ └── production/ # Kustomizations Flux pour le cluster de production
├── infrastructure/ # ingress controller, cert-manager, monitoring
└── apps/
├── base/webapp/ # manifestes partagés
├── dev/ # overlay pour le dev
└── production/ # overlay pour la production
Construire une base et des overlays Kustomize
apps/base/webapp/kustomization.yaml liste les ressources partagées :
apiVersion: kustomize.config.k8s.io/v1beta1
kind: Kustomization
resources:
- deployment.yaml
- service.yaml
Dans apps/base/webapp/deployment.yaml, faites lire à un conteneur ses paramètres depuis une ConfigMap que chaque overlay générera (laissez de côté le champ namespace dans la base, car les overlays le définissent) :
envFrom:
- configMapRef:
name: webapp-config
apps/dev/kustomization.yaml :
apiVersion: kustomize.config.k8s.io/v1beta1
kind: Kustomization
namespace: webapp-dev
resources:
- namespace.yaml
- ../base/webapp
replicas:
- name: webapp
count: 2
configMapGenerator:
- name: webapp-config
literals:
- HEADER=Hello from dev
avec un namespace.yaml qui crée webapp-dev. apps/production/kustomization.yaml est identique, avec namespace: webapp-prod, count: 4, son propre manifeste de namespace et sa propre valeur HEADER. Vous pouvez vérifier ce qu’un overlay génère avant de committer :
kustomize build apps/dev
# ou, sans installer kustomize séparément :
kubectl kustomize apps/dev
Pointer une Kustomization Flux vers chaque overlay
Flux détecte le kustomization.yaml dans le chemin et le construit pour vous. Dans le dossier de chaque cluster, ajoutez une Kustomization Flux par environnement. clusters/dev/apps.yaml :
apiVersion: kustomize.toolkit.fluxcd.io/v1
kind: Kustomization
metadata:
name: apps
namespace: flux-system
spec:
interval: 10m
sourceRef:
kind: GitRepository
name: flux-system
path: ./apps/dev
prune: true
wait: true
timeout: 3m
Pour le cluster de production, clusters/production/apps.yaml utilise path: ./apps/production. Comme chaque cluster a été bootstrappé avec son propre --path, chaque cluster ne voit que son propre dossier.
Rendre la production délibérée
Contrairement aux outils dotés d’un bouton de synchronisation manuelle, Flux applique automatiquement, donc vous contrôlez la production via Git. Un schéma efficace consiste à laisser le dev suivre une branche et la production suivre des tags de release. Dans la source du cluster de production :
apiVersion: source.toolkit.fluxcd.io/v1
kind: GitRepository
metadata:
name: fleet-releases
namespace: flux-system
spec:
interval: 5m
url: https://github.com/your-org/fleet-infra
ref:
semver: ">=1.0.0"
La production ne change alors que lorsque vous taguez une release. L’approbation de pull request sur la branche principale est l’autre contrôle courant.
Gérer volontairement les changements de configuration
Changez la valeur de HEADER dans un environnement et regardez ce qui se passe. Kustomize ajoute un hash du contenu aux noms de ConfigMap générées. Une nouvelle valeur produit une nouvelle ConfigMap (webapp-config-<hash>) et met à jour la référence du Deployment, ce qui déclenche un déploiement des Pods. L’ancienne ConfigMap est désormais orpheline, et avec prune: true Flux la supprime pour vous. Ce comportement est exactement ce que l’on veut : les changements de configuration font redémarrer les Pods.
Les ConfigMaps simples, écrites à la main, sont différentes. Si vous modifiez une ConfigMap qu’un Deployment lit via envFrom, la spec du Deployment ne change pas, et les Pods en cours d’exécution gardent donc les anciennes valeurs. Utilisez configMapGenerator pour tout ce qui doit redémarrer les workloads lorsqu’il change. Les charts Helm ont une technique équivalente, traitée dans le guide Helm.
Substituer des valeurs par cluster
Parfois une valeur diffère selon le cluster mais vous ne voulez pas d’un overlay entier pour elle, par exemple un nom de domaine. Les Kustomizations Flux peuvent substituer des variables après la construction :
spec:
postBuild:
substitute:
cluster_domain: dev.example.com
substituteFrom:
- kind: ConfigMap
name: cluster-vars
Tout ${cluster_domain} dans vos manifestes est remplacé au moment de l’application. Utilisez-le avec parcimonie, car les overlays sont plus faciles à relire.
Promouvoir les changements à travers les environnements
Avec cette organisation, la promotion est une suite de commits ordinaires. Modifiez d’abord l’overlay de dev (par exemple une montée de version d’image avec kustomize edit set image nginx=nginx:1.26 exécuté dans apps/dev), laissez Flux l’appliquer et vérifiez. Faites ensuite le même changement dans apps/production, via une pull request qui exige une approbation. Un pipeline CI peut automatiser le commit de dev, et un relecteur contrôle celui de production. L’image automation de Flux peut aussi faire l’étape de dev pour vous, ce que le guide sur l’automatisation d’images couvre.
Guides populaires
-
Push ou pull : comment Flux livre sur Kubernetes Pourquoi une livraison pilotée par Git et basée sur le pull change la façon de déployer, de sécuriser et de restaurer les clusters. -
Déployer votre première application avec un GitRepository et une Kustomization Pointez Flux vers des manifestes dans Git à l'aide d'une ressource Kustomization et regardez la synchronisation se faire. -
Contrôler le comportement de synchronisation : intervalles, prune, correction de dérive et rollback Décidez quand Flux applique les changements, ce qu'il supprime, comment le mettre en pause et comment annuler un mauvais déploiement. -
Automatiser les mises à jour d'images avec Flux Image Automation Laissez Flux détecter les nouveaux tags d'images de conteneurs et les committer dans Git. -
Configurer le multi-cluster avec Flux Gérez plusieurs clusters depuis un seul dépôt, avec une infrastructure partagée et des différences propres à chaque cluster. -
Flux CD ou Argo CD : choisir un outil GitOps Comparez l'architecture, l'interface, Helm, les secrets, la multi-tenance et l'automatisation d'images pour choisir le bon outil.