Aller au contenu principal

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'installation
  • post-install: Après l'installation
  • pre-upgrade: Avant la mise à jour
  • post-upgrade: Après la mise à jour
  • pre-delete: Avant la suppression
  • post-delete: Après la suppression
  • pre-rollback: Avant le rollback
  • post-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 hook
  • hook-succeeded: Si le hook réussit
  • hook-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