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.

ChampObligatoireDescription
apiVersionOuiv2 pour Helm 3 (le standard actuel).
nameOuiLe nom de ton Chart (ex: mon-api-python).
versionOuiLa version du Chart (ex: 1.0.5). À incrĂ©menter Ă  chaque modif du code Helm.
appVersionNonLa version de ton application (ex: v2.4.0). Souvent utilisĂ© comme tag d’image.
typeNonapplication (par défaut) ou library (pour les fonctions partagées).
descriptionNonUne phrase expliquant ce que fait le Chart.
dependenciesNonListe 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, bloc service, etc.).

Exemple type :

replicaCount: 2
 
image:
  repository: nginx
  pullPolicy: IfNotPresent
  tag: "stable"
 
service:
  type: ClusterIP
  port: 80
 
resources:
  limits:
    cpu: 100m
    memory: 128Mi

templates/ : 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 du values.yaml.

B. service.yaml

Expose ton application sur le réseau.

  • Lien clĂ© : Utilise les labels dĂ©finis dans _helpers.tpl pour 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.

.helmignore

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.

FichierRĂŽle en une phrase
Chart.yamlJe dis qui je suis et de quoi j’ai besoin.
values.yamlJe propose des options de configuration.
templates/Je dĂ©cris comment l’app doit ĂȘtre installĂ©e sur K8s.
_helpers.tplJe 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 ChartRÎleParticularité
Application ChartDéployer une application.Contient des Deployments, Services, etc.
Library ChartPartager de la logique.type: library. Ne déploie rien, contient uniquement des helpers.
Umbrella ChartPiloter 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 tes if/else gĂ©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 le Chart.yaml pour remplir le dossier charts/.

5. Le Workflow Helm : Du Template Ă  la Release

  1. Récupération : Helm télécharge le Chart et les dépendances.
  2. Rendu (Templating) : Le moteur fusionne les fichiers du dossier templates/ avec les données du values.yaml.
  3. ExpĂ©dition : Helm envoie le YAML gĂ©nĂ©rĂ© Ă  l’API Kubernetes.
  4. 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.yamlRésultat du ifPourquoi ?
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érateurSignificationExemple
eqÉgal à{{ if eq .Values.type "nginx" }}
neDifférent de{{ if ne .Values.env "prod" }}
lt / gtPlus petit / Plus grand{{ if gt .Values.replicas 3 }}
le / geInfé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 Ă  .Values ou .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: 9090

Source : 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)

  1. Syntaxe Préfixée : Toujours {{ if eq A B }}.
  2. ParenthĂšses : Utilise des parenthĂšses pour grouper les and et or.
  3. End : Tout if et tout range doit se terminer par {{- end }}.
  4. 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 Secrets Kubernetes.
  • 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 }}

  1. On vĂ©rifie s’il existe (required).
  2. On l’encode pour K8s (b64enc).
  3. On sécurise le format YAML (quote).

⚡ Helm Functions : Le Cheat Sheet

CatégorieFonctionSyntaxe CourteRésultat Attendu
SĂ©curitĂ©required`{{ .V.clerequired “Err” }}`
Sécuritédefault`{{ .V.cledefault 1 }}`
Formatquote`{{ .V.clequote }}`
Formatnindent`{{ include “x” .nindent 4 }}`
Texteupper`{{ .V.cleupper }}`
Texteprintf{{ printf "%s-%s" .V.a .V.b }}valeurA-valeurB
Secretb64enc`{{ .V.cleb64enc }}`
ObjettoYaml{{ toYaml .V.objet }}Sérialise un bloc entier en YAML.
Boucledict(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 toujours required avant de transformer la donnĂ©e. On termine toujours par quote ou nindent pour 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)

FonctionRîle techniquePourquoi l’utiliser ?Exemple
defaultValeur de repliÉviter le vide. Si l’option est absente, le Chart ne plante pas.`{{ .Values.port
requiredArrĂȘt immĂ©diatForcer la saisie. Indispensable pour les secrets ou URL.`{{ .Values.dbUrl
quoteForce le type StringÉviter les erreurs YAML. EmpĂȘche un nombre d’ĂȘtre mal interprĂ©tĂ©.`{{ .Values.version
nindentRetour ligne + EspacesIndentation propre. Aligne parfaitement le texte gĂ©nĂ©rĂ©.`{{ include ”
” .
b64encEncodage Base64Conformité K8s. Obligatoire pour les objets Secret.`{{ .Values.pwd

3. La Logique Avancée : Contextes & Multi-Arguments

  • Le piĂšge de la boucle (range) : Dans un range, 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 globale

Appel : 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 ?

  1. Uniformité : Tous vos noms de variables sont passés en majuscules automatiquement via upper.
  2. Sécurité : Toutes les valeurs ont des guillemets grùce à quote, évitant les crashs sur des valeurs purement numériques.
  3. Flexibilité : Si vous changez la globalDefaultValue dans le values.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 ?

Quizz _helpers.tpl

🏆 Grand Quiz Final : Maütrise Totale de Helm

Créer quizz