Aller au contenu principal

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