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.
Le moyen le plus rapide d’apprendre le templating Helm est de prendre des manifestes que vous comprenez déjà et de les templatiser un champ à la fois. Ce guide part d’un Deployment, d’un Service et d’une ConfigMap bruts, génère un chart, et remplace les champs qui doivent varier par des values.
Générer un chart et supprimer l’exemple
helm create webapp
cd webapp
rm -rf templates/tests templates/hpa.yaml templates/ingress.yaml \
templates/serviceaccount.yaml templates/_helpers.tpl
Les fichiers générés templates/deployment.yaml et templates/service.yaml forment un exemple fonctionnel, mais pour apprendre il est plus clair d’écrire les vôtres de zéro. Videz leur contenu (en gardant les fichiers) et videz values.yaml :
: > values.yaml
Ajouter vos propres manifestes
Écrivez d’abord du YAML Kubernetes brut, exactement comme vous le feriez sans Helm :
# templates/deployment.yaml
apiVersion: apps/v1
kind: Deployment
metadata:
name: my-webapp
labels:
app: my-webapp
spec:
replicas: 3
selector:
matchLabels:
app: my-webapp
template:
metadata:
labels:
app: my-webapp
spec:
containers:
- name: my-webapp
image: myorg/webapp:1.0
envFrom:
- configMapRef:
name: my-webapp-config
ports:
- containerPort: 8080
# templates/service.yaml
apiVersion: v1
kind: Service
metadata:
name: my-webapp
spec:
selector:
app: my-webapp
ports:
- port: 80
targetPort: 8080
# templates/configmap.yaml
apiVersion: v1
kind: ConfigMap
metadata:
name: my-webapp-config
data:
CUSTOM_HEADER: "this app was deployed with Helm"
Remarquez la même chaîne, my-webapp, répétée dans le nom, le label, le sélecteur et la référence à la ConfigMap. Cette répétition est précisément ce qui rend sujets aux erreurs les manifestes multi-environnements maintenus à la main : renommez l’application une fois et vous avez quatre endroits à corriger.
Remplacer les valeurs répétées par une valeur de template
Introduisez une seule valeur et référencez-la partout où le nom apparaît :
# values.yaml
appName: my-webapp
# templates/deployment.yaml (extrait)
metadata:
name: {{ .Values.appName }}
labels:
app: {{ .Values.appName }}
spec:
selector:
matchLabels:
app: {{ .Values.appName }}
template:
metadata:
labels:
app: {{ .Values.appName }}
spec:
containers:
- name: {{ .Values.appName }}
envFrom:
- configMapRef:
name: {{ .Values.appName }}-config
Faites de même dans service.yaml et configmap.yaml partout où my-webapp apparaît. .Values est alimenté depuis values.yaml ; un seul changement à cet endroit renomme donc désormais toutes les ressources de façon cohérente.
Templatiser l’image et les données de la ConfigMap
Séparez l’image en valeurs distinctes pour que le tag puisse changer indépendamment du dépôt :
# values.yaml (à ajouter)
image:
repository: myorg/webapp
tag: "1.0"
- name: {{ .Values.appName }}
image: "{{ .Values.image.repository }}:{{ .Values.image.tag }}"
Puis le contenu de la ConfigMap :
# values.yaml (à ajouter)
config:
customHeader: "this app was deployed with Helm"
# templates/configmap.yaml
data:
CUSTOM_HEADER: {{ .Values.config.customHeader | quote }}
Le filtre | quote entoure la valeur de guillemets doubles, ce qui compte dès que les valeurs propres à un environnement se mettent à contenir des espaces ou des caractères spéciaux. Une bonne règle pour nommer vos values : reproduisez la structure du manifeste lui-même (config.customHeader correspond au data.CUSTOM_HEADER d’une ConfigMap), pour que quiconque lit le template puisse deviner d’où vient une valeur.
Prévisualiser avant d’installer
Deux commandes génèrent le chart sans toucher à un cluster :
helm template ./webapp
helm install my-webapp ./webapp --dry-run --debug
helm template génère en local et n’a besoin d’aucun cluster. --dry-run --debug sur install valide en plus par rapport à l’API du cluster sans rien persister. Exécutez l’une de ces commandes après chaque modification de template ; une faute de frappe dans {{ .Values.appname }} (mauvaise casse) se génère silencieusement comme une valeur vide au lieu de provoquer une erreur, et c’est le moyen le plus rapide de l’attraper.
Installer et confirmer
helm install my-webapp ./webapp
kubectl get all -l app=my-webapp
my-webapp est ici le nom de la release, et ./webapp est le répertoire du chart. Installer un chart écrit à la main ne diffère en rien de l’installation d’un chart publié.
Modifier une valeur et mettre à niveau
Modifiez values.yaml (changez image.tag, config.customHeader, ce que vous voulez tester) et appliquez le changement :
helm upgrade my-webapp ./webapp
helm list
helm list affiche maintenant la révision 2. Chaque upgrade réapplique l’ensemble du chart avec les valeurs courantes ; c’est donc aussi ainsi que vous déploieriez une nouvelle version au quotidien.
Ajouter un NOTES.txt
# templates/NOTES.txt
Votre release "{{ .Release.Name }}" a été déployée.
Pour accéder à {{ .Values.appName }}, exécutez :
kubectl port-forward svc/{{ .Values.appName }} 8080:80
.Release.Name est une valeur intégrée que Helm fournit toujours, avec .Chart et .Release.Namespace ; vous ne la définissez pas vous-même. Exécutez de nouveau helm upgrade my-webapp ./webapp et ce texte s’affiche dans le terminal, avec la commande port-forward déjà renseignée pour la personne qui regarde.
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. -
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. -
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.