Chapitre 10.2 - Helm Charts
Objectifs d'Apprentissage
À la fin de ce chapitre, vous serez capable de:
- Comprendre la structure d'un Chart Helm
- Créer un Chart depuis zéro
- Utiliser les templates Go
- Personnaliser avec values.yaml
- Gérer les dépendances
- Publier un Chart
Introduction
Un Chart Helm est un package contenant tous les fichiers nécessaires pour déployer une application dans Kubernetes. Il utilise des templates pour rendre les fichiers YAML dynamiques.
Structure d'un Chart
Structure Complète
my-chart/
├── Chart.yaml # Métadonnées du Chart
├── Chart.lock # Verrouillage des dépendances
├── values.yaml # Valeurs par défaut
├── values.schema.json # Schéma de validation (optionnel)
├── templates/ # Templates Kubernetes
│ ├── deployment.yaml
│ ├── service.yaml
│ ├── configmap.yaml
│ ├── ingress.yaml
│ ├── _helpers.tpl # Helpers réutilisables
│ └── NOTES.txt # Notes affichées après installation
├── charts/ # Charts dépendants (optionnel)
└── README.md # Documentation
Créer un Chart
Créer un Chart Basique
# Créer un nouveau Chart
helm create my-chart
# Structure créée
my-chart/
├── Chart.yaml
├── values.yaml
└── templates/
├── deployment.yaml
├── service.yaml
├── ingress.yaml
├── _helpers.tpl
└── NOTES.txt
Chart.yaml
apiVersion: v2
name: my-chart
description: A Helm chart for my application
type: application
version: 0.1.0
appVersion: "1.0.0"
keywords:
- web
- application
maintainers:
- name: John Doe
email: john@example.com
Templates Go
Syntaxe de Base
Les templates utilisent la syntaxe Go templates:
apiVersion: apps/v1
kind: Deployment
metadata:
name: {{ .Release.Name }}-deployment
spec:
replicas: {{ .Values.replicaCount }}
template:
spec:
containers:
- name: {{ .Chart.Name }}
image: {{ .Values.image.repository }}:{{ .Values.image.tag }}
Variables Disponibles
.Release.Name: Nom de la release.Release.Namespace: Namespace.Chart.Name: Nom du Chart.Values.*: Valeurs depuis values.yaml.Capabilities.*: Informations sur le cluster
values.yaml
Exemple de values.yaml
# Nombre de replicas
replicaCount: 3
# Image
image:
repository: nginx
tag: "1.20"
pullPolicy: IfNotPresent
# Service
service:
type: ClusterIP
port: 80
# Ingress
ingress:
enabled: true
className: nginx
hosts:
- host: example.com
paths:
- path: /
pathType: Prefix
tls: []
# Resources
resources:
limits:
cpu: 500m
memory: 512Mi
requests:
cpu: 250m
memory: 256Mi
Exemple Complet: Chart Web App
Chart.yaml
apiVersion: v2
name: web-app
description: A simple web application
type: application
version: 0.1.0
appVersion: "1.0.0"
values.yaml
replicaCount: 2
image:
repository: myapp
tag: "1.0.0"
pullPolicy: IfNotPresent
service:
type: ClusterIP
port: 8080
ingress:
enabled: true
className: nginx
hosts:
- host: myapp.example.com
paths:
- path: /
pathType: Prefix
resources:
limits:
cpu: 500m
memory: 512Mi
requests:
cpu: 250m
memory: 256Mi
templates/deployment.yaml
apiVersion: apps/v1
kind: Deployment
metadata:
name: {{ include "web-app.fullname" . }}
labels:
{{- include "web-app.labels" . | nindent 4 }}
spec:
replicas: {{ .Values.replicaCount }}
selector:
matchLabels:
{{- include "web-app.selectorLabels" . | nindent 6 }}
template:
metadata:
labels:
{{- include "web-app.selectorLabels" . | nindent 8 }}
spec:
containers:
- name: {{ .Chart.Name }}
image: "{{ .Values.image.repository }}:{{ .Values.image.tag }}"
imagePullPolicy: {{ .Values.image.pullPolicy }}
ports:
- containerPort: 8080
name: http
resources:
{{- toYaml .Values.resources | nindent 10 }}
templates/service.yaml
apiVersion: v1
kind: Service
metadata:
name: {{ include "web-app.fullname" . }}
labels:
{{- include "web-app.labels" . | nindent 4 }}
spec:
type: {{ .Values.service.type }}
ports:
- port: {{ .Values.service.port }}
targetPort: http
protocol: TCP
name: http
selector:
{{- include "web-app.selectorLabels" . | nindent 4 }}
templates/_helpers.tpl
{{/*
Labels communs
*/}}
{{- define "web-app.labels" -}}
app.kubernetes.io/name: {{ include "web-app.name" . }}
app.kubernetes.io/instance: {{ .Release.Name }}
{{- end }}
{{/*
Selector labels
*/}}
{{- define "web-app.selectorLabels" -}}
app.kubernetes.io/name: {{ include "web-app.name" . }}
app.kubernetes.io/instance: {{ .Release.Name }}
{{- end }}
{{/*
Nom complet
*/}}
{{- define "web-app.fullname" -}}
{{- printf "%s-%s" .Release.Name .Chart.Name }}
{{- end }}
Installation d'un Chart Local
Installer
# Depuis un répertoire local
helm install my-release ./my-chart
# Avec des valeurs personnalisées
helm install my-release ./my-chart -f custom-values.yaml
# Avec des valeurs inline
helm install my-release ./my-chart \
--set replicaCount=5 \
--set image.tag=1.1.0
Mettre à Jour
# Mettre à jour
helm upgrade my-release ./my-chart
# Avec nouvelles valeurs
helm upgrade my-release ./my-chart -f new-values.yaml
Dépendances
Chart.yaml avec Dépendances
apiVersion: v2
name: my-app
dependencies:
- name: postgresql
version: "12.0.0"
repository: "https://charts.bitnami.com/bitnami"
- name: redis
version: "17.0.0"
repository: "https://charts.bitnami.com/bitnami"
Installer les Dépendances
# Télécharger les dépendances
helm dependency update
# Voir les dépendances
helm dependency list
Packaging et Distribution
Créer un Package
# Créer un package .tgz
helm package ./my-chart
# Résultat: my-chart-0.1.0.tgz
Publier dans un Repository
# Ajouter au repository
helm repo index . --url https://charts.example.com
# Uploader le package
# (selon votre méthode de stockage)
Commandes Utiles
Validation
# Linter
helm lint ./my-chart
# Template avec dry-run
helm install my-release ./my-chart --dry-run --debug
# Voir les valeurs calculées
helm template my-release ./my-chart
Test
# Installer en mode test
helm install my-release ./my-chart --dry-run
# Voir le manifest généré
helm get manifest my-release
Bonnes Pratiques
1. Structure Claire
Organiser les templates de manière logique.
2. Helpers
Utiliser _helpers.tpl pour le code réutilisable.
3. Documentation
Documenter toutes les valeurs dans values.yaml.
4. Validation
Utiliser values.schema.json pour valider les valeurs.
5. Versioning
Suivre le semantic versioning pour les Charts.
Résumé
Dans ce chapitre, vous avez appris:
Structure: Chart.yaml, values.yaml, templates/, charts/
Templates Go: Syntaxe avec doubles accolades, variables disponibles
values.yaml: Valeurs par défaut personnalisables
Helpers: _helpers.tpl pour code réutilisable
Dépendances: Gestion via Chart.yaml
Packaging: helm package pour créer .tgz
Installation: helm install depuis local ou repository
Bonnes pratiques: Structure, helpers, documentation, versioning
Prochaines Étapes
Chapitre 10.3: Templates Avancés et Hooks
Lab 10.2: Personnalisation avec values.yaml
Lab 10.3: Création d'un Chart Personnalisé
Chapitre créé le: Décembre 2024