Un chart, plusieurs environnements : fichiers de values pour dev, staging et prod
Ne surchargez que ce qui diffère entre les environnements, et comprenez l'ordre dans lequel les values sont fusionnées.
Le values.yaml d’un chart contient des valeurs par défaut raisonnables, mais dev, staging et production partagent rarement un namespace, un nombre de réplicas ou une valeur de configuration. Ce guide couvre la superposition de fichiers de values supplémentaires par environnement, sans maintenir de copies séparées du chart lui-même. Il s’appuie sur le chart webapp du guide précédent.
Garder values.yaml comme base commune
Laissez dans values.yaml tout ce qui doit être identique partout, le nom de l’application, le dépôt de l’image. Seuls les champs propres à un environnement ont leur place dans un fichier de surcharge :
# values-dev.yaml
namespace: dev
config:
customHeader: "welcome to dev"
# values-prod.yaml
namespace: prod
replicaCount: 5
config:
customHeader: "welcome to production"
Un fichier passé avec -f ne remplace pas values.yaml, il est fusionné par-dessus. values-dev.yaml n’a besoin de mentionner que namespace et config.customHeader ; tout le reste, appName, image, est repris tel quel du fichier de base.
Référencer le namespace dans vos templates
Ajoutez la valeur et utilisez-la partout où un manifeste doit déclarer son namespace :
# values.yaml (ajoutez une valeur par défaut)
namespace: default
# templates/deployment.yaml, templates/service.yaml, templates/configmap.yaml
metadata:
name: {{ .Values.appName }}
namespace: {{ .Values.namespace }}
Installer avec le fichier de values d’un environnement
kubectl create namespace dev
kubectl create namespace prod
helm install web-dev ./webapp -f values-dev.yaml -n dev
helm install web-prod ./webapp -f values-prod.yaml -n prod
Deux éléments jouent ici des rôles liés mais distincts : -n dev indique à Helm dans quel namespace stocker les métadonnées propres à la release, et metadata.namespace dans les templates indique à Kubernetes dans quel namespace va chaque ressource. Les faire coïncider, la release vit dans le même namespace que ce qu’elle a déployé, est la pratique standard et évite la confusion plus tard, lorsque vous exécutez helm list -n dev en vous attendant à voir tout ce qui tourne réellement là.
helm list -A
kubectl get all -n dev
kubectl get all -n prod
curl <dev-pod-ip> # ou kubectl port-forward, selon NOTES.txt
Confirmez que chaque environnement affiche son propre customHeader et son propre nombre de réplicas.
L’ordre de priorité complet
Helm fusionne les values de plusieurs sources, chacune remplaçant les précédentes :
values.yaml, les valeurs par défaut du chart lui-même.- Le
values.yamld’un chart parent, si ce chart est utilisé comme dépendance (non couvert ici). - Tout fichier passé avec
-f, dans l’ordre donné, les fichiers suivants l’emportant sur les précédents. - Les options
--set,--set-stringou--set-json, qui l’emportent sur tous les fichiers.
helm upgrade web-dev ./webapp -f values-dev.yaml --set replicaCount=1
--set est pratique pour une surcharge ponctuelle ou un test rapide, mais pour tout ce que vous voulez pouvoir reproduire, mettez-le dans un fichier et versionnez-le. Une option --set tapée dans un terminal ne laisse aucune trace de ce qui a réellement été déployé.
Deux façons de vérifier ce qu’a produit une fusion
Avant de faire confiance à une installation ou à une mise à niveau, regardez le résultat :
helm template ./webapp -f values-prod.yaml
helm get values web-prod
helm template -f génère le chart avec un fichier de values donné exactement comme le ferait install, sans toucher au cluster, ce qui vous permet de comparer directement la sortie de deux environnements. helm get values (après l’installation) affiche les values réellement enregistrées pour une release en cours d’exécution, ce qu’il faut vérifier lorsqu’une release en cours ne correspond pas à ce qu’un fichier devrait produire.
Une remarque sur les secrets
Les fichiers de values sont du texte brut ; ne mettez donc pas de vrais identifiants dans un fichier commité dans Git. Une répartition courante : la configuration non sensible par environnement dans values-<env>.yaml, et les secrets injectés soit via --set depuis le magasin de secrets d’une CI, soit via un outil comme Sealed Secrets ou SOPS, soit en faisant référencer par le chart un Secret Kubernetes créé en dehors de Helm plutôt qu’en intégrant la valeur dans values.yaml.
Guides populaires
-
Anatomie d'un chart Helm : charts, values, templates et releases La structure de dossiers commune à tous les charts, et les trois concepts qui font de Helm bien plus qu'un simple assembleur de YAML. -
Créer votre premier chart Helm à partir de manifestes existants Transformez un Deployment, un Service et une ConfigMap en chart templatisé, puis installez-le et mettez-le à niveau. -
Gérer les releases : installer, mettre à niveau, annuler et désinstaller Les commandes qui couvrent tout le cycle de vie d'une release, et comment l'historique des révisions rend le rollback possible.