Chapitre 10.3 - Templates Avancés et Hooks
Objectifs d'Apprentissage
À la fin de ce chapitre, vous serez capable de:
- Utiliser les fonctions avancées des templates Go
- Implémenter des conditions et boucles
- Utiliser les Hooks Helm
- Gérer les dépendances entre ressources
- Créer des templates réutilisables
- Optimiser les Charts
Introduction
Les templates Helm permettent de créer des configurations Kubernetes dynamiques et réutilisables. Les Hooks permettent d'exécuter des actions à des moments spécifiques du cycle de vie.
Fonctions Avancées des Templates
Conditions
{{- if .Values.ingress.enabled }}
apiVersion: networking.k8s.io/v1
kind: Ingress
metadata:
name: {{ .Release.Name }}-ingress
spec:
...
{{- end }}
Boucles
{{- range .Values.env }}
- name: {{ .name }}
value: {{ .value }}
{{- end }}
Valeurs par Défaut
replicas: {{ .Values.replicaCount | default 3 }}
image: {{ .Values.image.repository | default "nginx" }}
Concaténation
name: {{ printf "%s-%s" .Release.Name .Chart.Name }}
Include
{{- include "my-chart.labels" . | nindent 4 }}
Hooks Helm
Les Hooks permettent d'exécuter des Jobs ou Pods à des moments spécifiques.
Types de Hooks
pre-install: Avant l'installationpost-install: Après l'installationpre-upgrade: Avant la mise à jourpost-upgrade: Après la mise à jourpre-delete: Avant la suppressionpost-delete: Après la suppressionpre-rollback: Avant le rollbackpost-rollback: Après le rollback
Exemple: Pre-install Hook
apiVersion: batch/v1
kind: Job
metadata:
name: {{ .Release.Name }}-pre-install
annotations:
"helm.sh/hook": pre-install
"helm.sh/hook-weight": "-5"
"helm.sh/hook-delete-policy": before-hook-creation
spec:
template:
spec:
containers:
- name: pre-install
image: busybox:1.35
command: ["/bin/sh", "-c", "echo 'Pre-install hook'"]
restartPolicy: Never
Exemple: Post-install Hook
apiVersion: batch/v1
kind: Job
metadata:
name: {{ .Release.Name }}-post-install
annotations:
"helm.sh/hook": post-install
"helm.sh/hook-weight": "5"
spec:
template:
spec:
containers:
- name: post-install
image: busybox:1.35
command: ["/bin/sh", "-c", "echo 'Post-install hook'"]
restartPolicy: Never
Annotations de Hooks
hook-weight
Contrôle l'ordre d'exécution:
"helm.sh/hook-weight": "-5" # Exécuté en premier
"helm.sh/hook-weight": "5" # Exécuté en dernier
hook-delete-policy
Quand supprimer le Hook:
before-hook-creation: Avant la création d'un nouveau hookhook-succeeded: Si le hook réussithook-failed: Si le hook échoue
"helm.sh/hook-delete-policy": "before-hook-creation,hook-succeeded"
Exemple Complet: Migration de Base de Données
Pre-upgrade Hook: Backup
apiVersion: batch/v1
kind: Job
metadata:
name: {{ .Release.Name }}-pre-upgrade-backup
annotations:
"helm.sh/hook": pre-upgrade
"helm.sh/hook-weight": "-10"
spec:
template:
spec:
containers:
- name: backup
image: postgres:14
command:
- /bin/bash
- -c
- |
pg_dump -h {{ .Release.Name }}-postgres mydb > /backup/backup-$(date +%Y%m%d).sql
aws s3 cp /backup/backup-$(date +%Y%m%d).sql s3://backups/
env:
- name: PGPASSWORD
valueFrom:
secretKeyRef:
name: {{ .Release.Name }}-postgres-secret
key: password
volumeMounts:
- name: backup
mountPath: /backup
volumes:
- name: backup
emptyDir: {}
restartPolicy: Never
Post-upgrade Hook: Migration
apiVersion: batch/v1
kind: Job
metadata:
name: {{ .Release.Name }}-post-upgrade-migrate
annotations:
"helm.sh/hook": post-upgrade
"helm.sh/hook-weight": "10"
spec:
template:
spec:
containers:
- name: migrate
image: my-app:{{ .Values.appVersion }}
command: ["/app/migrate.sh"]
env:
- name: DATABASE_URL
value: postgresql://postgres:5432/mydb
restartPolicy: OnFailure
Templates Réutilisables
_helpers.tpl Avancé
{{/*
Labels communs
*/}}
{{- define "my-chart.labels" -}}
app.kubernetes.io/name: {{ include "my-chart.name" . }}
app.kubernetes.io/instance: {{ .Release.Name }}
app.kubernetes.io/version: {{ .Chart.AppVersion | quote }}
app.kubernetes.io/managed-by: {{ .Release.Service }}
{{- end }}
{{/*
Selector labels
*/}}
{{- define "my-chart.selectorLabels" -}}
app.kubernetes.io/name: {{ include "my-chart.name" . }}
app.kubernetes.io/instance: {{ .Release.Name }}
{{- end }}
{{/*
Nom du Chart
*/}}
{{- define "my-chart.name" -}}
{{- default .Chart.Name .Values.nameOverride | trunc 63 | trimSuffix "-" }}
{{- end }}
{{/*
Nom complet
*/}}
{{- define "my-chart.fullname" -}}
{{- if .Values.fullnameOverride }}
{{- .Values.fullnameOverride | trunc 63 | trimSuffix "-" }}
{{- else }}
{{- $name := default .Chart.Name .Values.nameOverride }}
{{- if contains $name .Release.Name }}
{{- .Release.Name | trunc 63 | trimSuffix "-" }}
{{- else }}
{{- printf "%s-%s" .Release.Name $name | trunc 63 | trimSuffix "-" }}
{{- end }}
{{- end }}
{{- end }}
Bonnes Pratiques
1. Utiliser les Helpers
Créer des helpers réutilisables dans _helpers.tpl.
2. Conditions Appropriées
Utiliser des conditions pour rendre les templates flexibles.
3. Hooks Judicieux
Utiliser les hooks seulement quand nécessaire (migrations, backups).
4. Documentation
Documenter les hooks et leur objectif.
5. Tests
Tester les hooks avec --dry-run.
Résumé
Dans ce chapitre, vous avez appris:
Fonctions avancées: Conditions, boucles, valeurs par défaut, concaténation
Hooks: Pre/post install/upgrade/delete/rollback
Annotations: hook-weight, hook-delete-policy
Cas d'usage: Migrations, backups, initialisation
Templates réutilisables: Helpers dans _helpers.tpl
Bonnes pratiques: Helpers, conditions, hooks judicieux, tests
Prochaines Étapes
Module 11: Monitoring et Observabilité
Lab 10.4: Helmfile et Multi-environnements
Chapitre créé le: Décembre 2024