_helpers.tpl est la bibliothèque de fonctions du Chart. Il centralise la logique complexe pour garder les templates YAML lisibles. Ce fichier commence par _ : Helm ne le rend jamais directement en manifest Kubernetes.


Principe — Named Templates

Au lieu de dupliquer 10 lignes de labels dans chaque fichier, on définit un template nommé une seule fois :

# _helpers.tpl
{{- define "monapp.labels" -}}
app.kubernetes.io/name: {{ .Chart.Name }}
app.kubernetes.io/instance: {{ .Release.Name }}
app.kubernetes.io/version: {{ .Chart.AppVersion | quote }}
{{- end -}}
 
# templates/deployment.yaml
metadata:
  labels:
    {{- include "monapp.labels" . | nindent 4 }}
SyntaxeRôle
{{- define "nom" -}}Déclarer un Named Template
{{ include "nom" . }}Appeler le template (avec passage de contexte)
{{ template "nom" . }}Appel simple (sans pipeline possible après)

Préférer include à template car il supporte le pipe : {{ include "x" . | nindent 4 }}


Fonctions courantes dans _helpers.tpl

FonctionRôleExemple
defaultValeur de repli{{ .Values.port | default 80 }}
requiredStoppe si manquant{{ .Values.dbUrl | required "URL requise" }}
quoteForce le type String{{ .Values.version | quote }}
nindentIndentation correcte{{ include "..." . | nindent 8 }}
b64encBase64 pour Secrets{{ .Values.pwd | b64enc }}

Pièges à éviter

Scope dans range

Dans une boucle range, . devient l’élément courant — on perd l’accès à .Values et .Release. Utiliser $ pour revenir à la racine :

{{- range .Values.configs }}
  {{- include "monapp.renderEnv" (dict "envData" . "root" $) | nindent 12 }}
  # $ = contexte global, . = élément de la boucle
{{- end }}

Multi-arguments avec dict

Pour passer plusieurs valeurs à un helper, les emballer dans un dictionnaire :

{{- include "monapp.renderEnv" (dict "envData" . "root" $) }}

Exemple complet — Générateur d’environnement

_helpers.tpl :

{{- define "monapp.renderEnv" -}}
- name: {{ .envData.name | upper | quote }}
  value: {{ .envData.value | default .root.Values.globalDefaultValue | quote }}
{{- end -}}

values.yaml :

globalDefaultValue: "VALEUR_PAR_DEFAUT"
configs:
  - name: "api_url"
    value: "https://api.com"
  - name: "debug_mode"
    # pas de value → utilisera globalDefaultValue

templates/deployment.yaml :

env:
{{- range .Values.configs }}
  {{- include "monapp.renderEnv" (dict "envData" . "root" $) | nindent 12 }}
{{- end }}

YAML généré :

env:
  - name: "API_URL"
    value: "https://api.com"
  - name: "DEBUG_MODE"
    value: "VALEUR_PAR_DEFAUT"

Pourquoi c’est efficace :

  • upper : noms de variables uniformément en majuscules
  • quote : toutes les valeurs protégées contre les erreurs YAML
  • default : valeur globale propagée automatiquement si absente

En relation avec