Tester et debug:https://helm-playground.com/
Formation intéressante: Cours chart helm
đ Module : Fonctionnement Global, Architecture & ĂcosystĂšme
Helm nâest pas seulement un moteur de template, câest le gestionnaire de paquets standard pour Kubernetes. Il permet de packager, partager et dĂ©ployer des applications complexes de maniĂšre industrielle.
1. Structure et Composants dâun Chart
Un Chart est un dossier organisé selon une hiérarchie stricte :
mon-chart/
âââ Chart.yaml
âââ values.yaml
âââ charts/
âââ templates/
âââ _helpers.tpl
âââ deployment.yaml
âââ service.yaml
âââ NOTES.txt Chart.yaml : La carte dâidentitĂ© (Nom, version de lâapp, type de chart)
Ce fichier contient les métadonnées. Il indique à Helm comment traiter le package.
| Champ | Obligatoire | Description |
|---|---|---|
apiVersion | Oui | v2 pour Helm 3 (le standard actuel). |
name | Oui | Le nom de ton Chart (ex: mon-api-python). |
version | Oui | La version du Chart (ex: 1.0.5). à incrémenter à chaque modif du code Helm. |
appVersion | Non | La version de ton application (ex: v2.4.0). Souvent utilisĂ© comme tag dâimage. |
type | Non | application (par défaut) ou library (pour les fonctions partagées). |
description | Non | Une phrase expliquant ce que fait le Chart. |
dependencies | Non | Liste des autres charts nécessaires (ex: postgresql, redis). |
Exemple de Chart.yaml :
apiVersion: v2
name: ma-super-app
description: Un chart Helm pour mon application web
type: application
version: 0.1.0
appVersion: "1.16.0"
dependencies:
- name: mariadb
version: 11.x.x
repository: <https://charts.bitnami.com/bitnami>values.yaml : Le fichier de configuration utilisateur
Câest ici que lâutilisateur dĂ©finit ses variables. Ce fichier injecte les donnĂ©es dans les templates.
- Structure libre : Tu peux organiser tes variables comme tu veux (par blocs).
- Bonne pratique : Utiliser des noms explicites et regrouper par ressource (bloc
image, blocservice, etc.).
Exemple type :
replicaCount: 2
image:
repository: nginx
pullPolicy: IfNotPresent
tag: "stable"
service:
type: ClusterIP
port: 80
resources:
limits:
cpu: 100m
memory: 128Mitemplates/ : Les manifests Kubernetes contenant la logique (fonctions, helpers, conditions).
Ce dossier contient les fichiers Kubernetes standards, mais âtemplatisĂ©sâ. Les plus courants sont :
A. deployment.yaml
DĂ©finit tes Pods, le nombre de rĂ©plicas et lâimage Ă utiliser.
- Lien clé : Utilise
{{ .Values.image.repository }}pour rĂ©cupĂ©rer lâimage duvalues.yaml.
B. service.yaml
Expose ton application sur le réseau.
- Lien clé : Utilise les labels définis dans
_helpers.tplpour cibler les bons Pods.
C. ingress.yaml
GĂšre lâaccĂšs externe (URL/DNS). Souvent entourĂ© dâun {{- if .Values.ingress.enabled }} car tout le monde nâen a pas besoin.
D. _helpers.tpl
Ce nâest pas un manifeste Kubernetes, mais un fichier de stockage pour tes fonctions rĂ©utilisables.
charts/ (Le dossier des Dépendances) :
Contient les âsous-chartsâ. Si ton app a besoin dâune base de donnĂ©es Redis, Helm tĂ©lĂ©charge le chart Redis et le stocke ici.
Les fichiers de âVerrouillageâ & Ignorance
values.schema.json (Optionnel mais Pro)
Permet de forcer un format pour le values.yaml. Par exemple, si lâutilisateur met du texte Ă la place dâun nombre pour replicaCount, Helm affichera une erreur avant mĂȘme de tenter le dĂ©ploiement.
Fonctionne comme un .gitignore. Il permet dâexclure des fichiers (comme des notes perso ou des tests locaux) afin quâils ne soient pas inclus dans le package final .tgz.
| Fichier | RĂŽle en une phrase |
|---|---|
Chart.yaml | Je dis qui je suis et de quoi jâai besoin. |
values.yaml | Je propose des options de configuration. |
templates/ | Je dĂ©cris comment lâapp doit ĂȘtre installĂ©e sur K8s. |
_helpers.tpl | Je centralise les calculs et les noms complexes. |
2. Typologie des Charts (ModĂšles de conception)
Selon ton architecture, tu utiliseras différents types de charts :
| Type de Chart | RÎle | Particularité |
|---|---|---|
| Application Chart | Déployer une application. | Contient des Deployments, Services, etc. |
| Library Chart | Partager de la logique. | type: library. Ne déploie rien, contient uniquement des helpers. |
| Umbrella Chart | Piloter une stack complĂšte. | Regroupe plusieurs sous-charts (Frontend + Backend + DB). |
3. LâĂcosystĂšme des Plugins
Helm est extensible. Les plugins ajoutent des commandes pour répondre à des besoins spécifiques en entreprise :
helm-diff: Affiche la diffĂ©rence exacte entre ce qui tourne sur le cluster et ce que tu vas dĂ©ployer (Ă©vite les erreurs fatales).helm-unittest: Permet dâĂ©crire des tests unitaires sur tes templates pour vĂ©rifier que tesif/elsegĂ©nĂšrent le bon YAML.helm-push: Permet dâenvoyer tes packages vers un registre privĂ© (Harbor, Nexus, Artifact Hub).
4. Commandes Essentielles (Le âSurvival Kitâ)
Installation & Cycle de vie
helm install [nom] [path]: CrĂ©e une nouvelle Release.helm upgrade [nom] [path]: Met Ă jour une application existante.helm rollback [nom] [version]: Retour arriĂšre immĂ©diat si la mise Ă jour Ă©choue.helm uninstall [nom]: Supprime proprement toutes les ressources liĂ©es Ă lâapplication.
Debug & Développement
-dry-run --debug: Indispensable. Affiche le YAML final dans la console sans rien installer sur le cluster.helm lint: Analyse ton code pour détecter les erreurs de syntaxe ou les mauvaises pratiques.helm dependency update: Télécharge les sous-charts listés dans leChart.yamlpour remplir le dossiercharts/.
5. Le Workflow Helm : Du Template Ă la Release
- Récupération : Helm télécharge le Chart et les dépendances.
- Rendu (Templating) : Le moteur fusionne les fichiers du dossier
templates/avec les donnĂ©es duvalues.yaml. - ExpĂ©dition : Helm envoie le YAML gĂ©nĂ©rĂ© Ă lâAPI Kubernetes.
- Suivi : Helm crée une Release (une instance de ton application) et garde un historique des versions.
đĄ RĂ©sumĂ© pour Notion (Concepts clĂ©s)
- Chart : Le modĂšle / Le code source.
- Release : Lâapplication installĂ©e sur le cluster (une instance du chart).
- Scope ($ vs .) : Vital dans les boucles pour ne pas perdre lâaccĂšs aux variables globales.
- Library vs Umbrella : Le premier partage du code, le second orchestre des services.
đ Dernier Tips de pro : Les âCustom Valuesâ
On ne modifie jamais le values.yaml par défaut quand on déploie. On crée un fichier spécifique pour chaque environnement : helm install mon-app ./chart -f values-prod.yaml
Cela permet de garder un Chart âgĂ©nĂ©riqueâ et de ne changer que les variables selon les besoins (Prod, Dev, Staging).
Quizz fondamentale
đ§ Module : Logique, Conditions et Boucles
1. Les Conditions (if / else)
Helm permet de tester des valeurs pour adapter le manifest.
â ïž Le concept de âTruthyâ vs âFalsyâ
Helm ignore le bloc if si la valeur est considĂ©rĂ©e comme âfausseâ ou âvideâ.
| Valeur dans values.yaml | Résultat du if | Pourquoi ? |
|---|---|---|
true ou "texte" | â PassĂ© | Valeur positive ou remplie. |
123 | â PassĂ© | Tout nombre diffĂ©rent de 0 est vrai. |
false, "", 0 | â IgnorĂ© | Valeurs considĂ©rĂ©es comme âfaussesâ. |
[] ou {} | â IgnorĂ© | Liste ou dictionnaire vide. |
2. Opérateurs de Comparaison et Logiques
Attention : Helm utilise la syntaxe Go. LâopĂ©rateur se place avant les arguments.
{{ if eq .A .B }} et non {{ if .A == .B }}.
A. Les Comparateurs
| Opérateur | Signification | Exemple |
|---|---|---|
eq | Ăgal Ă | {{ if eq .Values.type "nginx" }} |
ne | Différent de | {{ if ne .Values.env "prod" }} |
lt / gt | Plus petit / Plus grand | {{ if gt .Values.replicas 3 }} |
le / ge | Inférieur ou égal / Supérieur ou égal | {{ if le .Values.cpu 1 }} |
B. Les Opérateurs Logiques
Ils permettent de combiner plusieurs tests.
and: Toutes les conditions doivent ĂȘtre vraies.or: Au moins une condition doit ĂȘtre vraie.not: Inverse le rĂ©sultat.
Exemple complexe :
{{- if and .Values.ingress.enabled (or (eq .Values.env "prod") .Values.ingress.force) }}
# Ce bloc s'affiche si l'ingress est activé ET (si on est en prod OU si force est vrai)
{{- end }}3. Les Boucles (range)
Elles servent Ă rĂ©pĂ©ter un bloc pour chaque Ă©lĂ©ment dâune liste.
â ïž Le changement de Scope (Le âPointâ vs le âDollarâ)
Ă lâintĂ©rieur dâun range, le point . change de sens : il devient lâitem de la liste.
.: Lâobjet de la boucle.$: Le contexte global (pour revenir Ă.Valuesou.Release).
env:
{{- range .Values.envList }}
- name: {{ .name | quote }}
value: {{ .value | default $.Values.globalDefault | quote }}
{{- end }}4. Exemple âMasterâ : Le sĂ©lecteur intelligent
On combine ici une condition, une comparaison et le passage de contexte global.
Source : values.yaml
appType: "web"
monitoring:
enabled: true
endpoints:
- port: 8080
- port: 9090Source : templates/config.yaml
{{- if and .Values.monitoring.enabled (eq .Values.appType "web") -}}
apiVersion: v1
kind: ConfigMap
metadata:
name: {{ .Release.Name }}-config
data:
{{- range .Values.monitoring.endpoints }}
# On utilise le "." pour le port de l'item actuel
# On utilise le "$" pour le nom du Chart (racine)
service-{{ .port }}: {{ printf "App %s sur port %d" $.Chart.Name .port | quote }}
{{- end }}
{{- end -}}đ RĂ©sultat Final (YAML gĂ©nĂ©rĂ©)
apiVersion: v1
kind: ConfigMap
metadata:
name: ma-release-config
data:
service-8080: "App mon-chart sur port 8080"
service-9090: "App mon-chart sur port 9090"đĄ RĂ©sumĂ© âTricheurâ (Cheat Sheet Logique)
- Syntaxe Préfixée : Toujours
{{ if eq A B }}. - ParenthĂšses : Utilise des parenthĂšses pour grouper les
andetor. - End : Tout
ifet toutrangedoit se terminer par{{- end }}. - Tirets :
{{-au début et}}à la fin pour supprimer les lignes vides fantÎmes.
Quizz if/Range
đ§° Catalogue des Fonctions Helm
Les fonctions sâutilisent gĂ©nĂ©ralement avec le âpipeâ (|), ce qui permet dâenchaĂźner les transformations (ex: valeur | fonction1 | fonction2).
1. Fonctions de Transformation de Texte
quote / squote
- RĂŽle : Entoure la valeur de guillemets doubles (
") ou simples ('). - Pourquoi ? : Indispensable pour les chaĂźnes qui ressemblent Ă des nombres ou des boolĂ©ens (ex: âtrueâ, â012345â) pour que Kubernetes ne change pas leur type.
- Exemple :
version: {{ .Values.appVersion | quote }} - Résultat :
version: "1.2.3"
upper / lower / title
- RĂŽle : Change la casse du texte.
- Exemple :
env: {{ .Values.envName | upper }} - Résultat :
env: PRODUCTION
replace
- RĂŽle : Remplace un caractĂšre ou une chaĂźne par une autre.
- Exemple :
hostname: {{ .Values.url | replace "." "-" }} - Résultat :
hostname: mon-site-com
2. Fonctions de Sécurité et Logique
default
- RĂŽle : Donne une valeur de secours si la variable est absente ou vide.
- Exemple :
replicas: {{ .Values.replicaCount | default 1 }} - Résultat :
replicas: 1(si non défini dans values.yaml)
required
- RÎle : Interrompt le déploiement avec un message si la valeur est manquante.
- Exemple :
token: {{ .Values.apiToken | required "Le token API est obligatoire !" }} - Résultat :
Error: Le token API est obligatoire !(si manquant)
3. Fonctions de Structure (YAML & Indentation)
toYaml
-
RĂŽle : Transforme une liste ou un dictionnaire complexe en format YAML.
-
Exemple :YAMLYAML
# values.yaml labels: team: data project: analysis# template.yaml metadata: labels: {{- toYaml .Values.labels | nindent 4 }} -
Résultat :
metadata: labels: team: data project: analysis
nindent
- RĂŽle : Ajoute une nouvelle ligne + X espaces avant le texte.
- Pourquoi ? : Câest la fonction la plus importante pour que le YAML gĂ©nĂ©rĂ© soit valide.
- Exemple :
{{ include "mon_helper" . | nindent 8 }} - Résultat : Décale tout le bloc de 8 espaces à droite aprÚs avoir sauté une ligne.
4. Fonctions dâEncodage
b64enc / b64dec
- RÎle : Encode ou décode en Base64.
- Pourquoi ? : Obligatoire pour les
SecretsKubernetes. - Exemple :
password: {{ .Values.rawPassword | b64enc | quote }} - Résultat :
password: "YWRtaW4xMjM="
5. Fonctions de Calcul et Listes
printf
- RÎle : Construit une chaßne formatée (comme en C ou en Go).
- Exemple :
image: {{ printf "%s/%s:%s" .Values.reg .Values.repo .Values.tag }} - Résultat :
image: docker.io/my-app:v1.0
join
- RĂŽle : Fusionne les Ă©lĂ©ments dâune liste avec un sĂ©parateur.
- Exemple :
hosts: {{ join "," .Values.ingress.hosts }} - Résultat :
hosts: site1.com,site2.com
đĄ Le Flux de DonnĂ©es
Voici comment une donnée traverse les fonctions dans un template Helm professionnel :
Exemple combiné ultime :
{{ .Values.dbPassword | required "Manquant" | b64enc | quote }}
- On vĂ©rifie sâil existe (
required). - On lâencode pour K8s (
b64enc). - On sécurise le format YAML (
quote).
⥠Helm Functions : Le Cheat Sheet
| Catégorie | Fonction | Syntaxe Courte | Résultat Attendu |
|---|---|---|---|
| SĂ©curitĂ© | required | `{{ .V.cle | required âErrâ }}` |
| Sécurité | default | `{{ .V.cle | default 1 }}` |
| Format | quote | `{{ .V.cle | quote }}` |
| Format | nindent | `{{ include âxâ . | nindent 4 }}` |
| Texte | upper | `{{ .V.cle | upper }}` |
| Texte | printf | {{ printf "%s-%s" .V.a .V.b }} | valeurA-valeurB |
| Secret | b64enc | `{{ .V.cle | b64enc }}` |
| Objet | toYaml | {{ toYaml .V.objet }} | Sérialise un bloc entier en YAML. |
| Boucle | dict | (dict "k1" . "k2" $) | Emballe plusieurs arguments. |
đ 3 EnchaĂźnements âIncontournablesâ Ă copier-coller
1. Le bloc de configuration dynamique
Idéal pour injecter tout un dictionnaire du values.yaml dans un ConfigMap ou un Deployment.
YAML
{{- toYaml .Values.config | nindent 2 }}
2. Le secret ultra-sécurisé
Vérifie la présence, encode en base64 et ajoute les guillemets.
YAML
password: {{ .Values.db.pwd | required "MDP requis" | b64enc | quote }}
3. Le nom de ressource standardisé
Combine le nom de la release et le nom du chart, le tout tronqué pour respecter la limite K8s de 63 caractÚres.
YAML
name: {{ printf "%s-%s" .Release.Name .Chart.Name | trunc 63 | trimSuffix "-" }}
Important :
Le secret du âPipeâ (
|) : On fait toujoursrequiredavant de transformer la donnĂ©e. On termine toujours parquoteounindentpour lâesthĂ©tique du fichier final.
Quizz fonction
đïž Module : MaĂźtriser le _helpers.tpl
Le fichier _helpers.tpl est la bibliothĂšque de fonctions de votre Chart. Il permet de centraliser la logique complexe pour garder vos fichiers YAML (Deployments, Services) lisibles.
1. Concept : Le âTamponâ RĂ©utilisable
Au lieu de copier-coller 10 lignes de labels dans chaque fichier, vous créez un Named Template (un modÚle nommé) dans _helpers.tpl.
- Définition :
{{- define "monapp.labels" -}} ... {{- end -}} - Appel :
{{ include "monapp.labels" . }}
2. Gestion des Valeurs & Sécurité (Niveau Intermédiaire)
| Fonction | RĂŽle technique | Pourquoi lâutiliser ? | Exemple |
|---|---|---|---|
default | Valeur de repli | Ăviter le vide. Si lâoption est absente, le Chart ne plante pas. | `{{ .Values.port |
required | ArrĂȘt immĂ©diat | Forcer la saisie. Indispensable pour les secrets ou URL. | `{{ .Values.dbUrl |
quote | Force le type String | Ăviter les erreurs YAML. EmpĂȘche un nombre dâĂȘtre mal interprĂ©tĂ©. | `{{ .Values.version |
nindent | Retour ligne + Espaces | Indentation propre. Aligne parfaitement le texte gĂ©nĂ©rĂ©. | `{{ include ââŠâ . |
b64enc | Encodage Base64 | Conformité K8s. Obligatoire pour les objets Secret. | `{{ .Values.pwd |
3. La Logique Avancée : Contextes & Multi-Arguments
- Le piĂšge de la boucle (
range) : Dans unrange, le point.devient lâĂ©lĂ©ment de la liste. Utilisez le dollar$pour revenir Ă la racine :{{ include "helper" $ }}. - Multi-arguments avec
dict: Pour envoyer plusieurs données à un helper, emballez-les dans un dictionnaire :(dict "clé1" valeur1 "clé2" valeur2).
4. LâExemple âMasterâ : GĂ©nĂ©rateur dâEnvironnement
Cet exemple montre comment transformer une liste simpliste en variables dâenvironnement Kubernetes robustes.
Source : _helpers.tpl
{{- define "monapp.renderEnv" -}}
- name: {{ .envData.name | upper | quote }}
value: {{ .envData.value | default .root.Values.globalDefaultValue | quote }}
{{- end -}}Source : values.yaml
globalDefaultValue: "VALEUR_PAR_DEFAUT"
configs:
- name: "api_url"
value: "<https://api.com>"
- name: "debug_mode"
# Pas de value ici, le helper utilisera la globaleAppel : templates/deployment.yaml
env:
{{- range .Values.configs }}
{{- include "monapp.renderEnv" (dict "envData" . "root" $) | nindent 12 }}
{{- end }}đ RĂ©sultat Final (Rendu YAML)
Voici ce que Helm génÚre réellement et envoie au cluster Kubernetes :
# Résultat aprÚs exécution
env:
- name: "API_URL"
value: "<https://api.com>"
- name: "DEBUG_MODE"
value: "VALEUR_PAR_DEFAUT"đĄ Pourquoi câest brillant ?
- Uniformité : Tous vos noms de variables sont passés en majuscules automatiquement via
upper. - SĂ©curitĂ© : Toutes les valeurs ont des guillemets grĂące Ă
quote, évitant les crashs sur des valeurs purement numériques. - Flexibilité : Si vous changez la
globalDefaultValuedans levalues.yaml, elle se propage partout instantanément.
Ta formation est maintenant prĂȘte ! Veux-tu que je gĂ©nĂšre un petit exercice âTrouvez lâerreurâ pour valider le module ?