Helm est le gestionnaire de paquets standard pour Kubernetes, CNCF Graduated. Il regroupe les manifests Kubernetes dans des packages versionnés appelés charts - archives contenant des templates Go, des valeurs par défaut et des métadonnées. Helm gère le cycle de vie complet d'une installation (install, upgrade, rollback, uninstall), suit l'état des déploiements via des releases stockées dans des secrets Kubernetes, et résout les dépendances entre charts. ArtifactHub centralise les charts publics de l'écosystème.
Informations essentielles
Origine : Deis → CNCF Graduated · Licence : Apache 2.0 · Architectures : x86_64, ARM64
Liens : Site officiel · Documentation · GitHub · ArtifactHub
Support : CNCF Graduated. Standard de facto, écosystème très large.
Stack par défaut
| Composant | Valeur |
|---|---|
| Langage | Go |
| Templates | Go templates + fonctions Sprig |
| Stockage releases | Secrets Kubernetes (namespace de déploiement) |
| Registries | OCI registries (ghcr.io, ECR, etc.) ou repos HTTP Helm classiques |
| Intégrations GitOps | FluxCD (HelmRelease), Argo CD (Application) |
Prérequis
| Ressource | Valeur |
|---|---|
| kubectl | Configuré avec accès cluster |
| Kubernetes | 1.20+ |
Installation
# Script officiel (Linux/macOS)
curl https://raw.githubusercontent.com/helm/helm/main/scripts/get-helm-3 | bash
# Homebrew
brew install helm
# Snap
sudo snap install helm --classic
# Windows (Chocolatey)
choco install kubernetes-helm
helm version
Commandes fondamentales
Gérer les dépôts
helm repo add bitnami https://charts.bitnami.com/bitnami
helm repo add ingress-nginx https://kubernetes.github.io/ingress-nginx
helm repo update # Mettre à jour le cache local
helm search repo nginx # Rechercher dans les dépôts locaux
helm search hub nginx # Rechercher sur ArtifactHub
Installer et gérer des releases
# Installer un chart
helm install my-nginx ingress-nginx/ingress-nginx \
--namespace ingress-nginx \
--create-namespace
# Installer avec des valeurs personnalisées
helm install my-release bitnami/postgresql \
--namespace database \
--create-namespace \
--set auth.postgresPassword=secret123 \
--set primary.persistence.size=20Gi
# Installer depuis un fichier de valeurs
helm install my-release bitnami/postgresql \
-f values-prod.yaml \
--namespace database
# Prévisualiser sans installer (dry-run)
helm install my-release bitnami/postgresql --dry-run --debug -f values.yaml
# Mettre à jour une release
helm upgrade my-release bitnami/postgresql \
--namespace database \
-f values-prod.yaml \
--reuse-values # Conserver les valeurs non spécifiées
# Installer ou mettre à jour (install-or-upgrade)
helm upgrade --install my-release bitnami/postgresql \
--namespace database \
--create-namespace \
-f values-prod.yaml
Rollback et désinstallation
helm history my-release -n database # Historique des révisions
helm rollback my-release 2 -n database # Revenir à la révision 2
helm uninstall my-release -n database # Désinstaller
helm uninstall my-release -n database --keep-history # Garder l'historique
Créer un chart
helm create my-app
# Génère la structure :
# my-app/
# ├── Chart.yaml # Métadonnées du chart
# ├── values.yaml # Valeurs par défaut
# ├── charts/ # Dépendances
# └── templates/ # Templates Kubernetes
# ├── deployment.yaml
# ├── service.yaml
# ├── ingress.yaml
# ├── _helpers.tpl # Fonctions réutilisables
# └── NOTES.txt # Affiché après install
Chart.yaml
apiVersion: v2
name: my-app
description: Mon application
type: application
version: 0.1.0 # Version du chart
appVersion: "1.0.0" # Version de l'application packagée
dependencies:
- name: postgresql
version: "13.x.x"
repository: https://charts.bitnami.com/bitnami
condition: postgresql.enabled
helm dependency update my-app # Télécharger les dépendances
Templates et valeurs
# values.yaml
replicaCount: 2
image:
repository: ghcr.io/org/my-app
tag: "1.0.0"
pullPolicy: IfNotPresent
service:
type: ClusterIP
port: 80
ingress:
enabled: false
# templates/deployment.yaml
apiVersion: apps/v1
kind: Deployment
metadata:
name: {{ include "my-app.fullname" . }}
labels:
{{- include "my-app.labels" . | nindent 4 }}
spec:
replicas: {{ .Values.replicaCount }}
selector:
matchLabels:
{{- include "my-app.selectorLabels" . | nindent 6 }}
template:
spec:
containers:
- name: {{ .Chart.Name }}
image: "{{ .Values.image.repository }}:{{ .Values.image.tag | default .Chart.AppVersion }}"
imagePullPolicy: {{ .Values.image.pullPolicy }}
Packaging et publication
# Linter un chart
helm lint my-app
# Packager
helm package my-app # Génère my-app-0.1.0.tgz
# Publier sur un registry OCI (ex: GHCR)
helm push my-app-0.1.0.tgz oci://ghcr.io/org/charts
# Installer depuis OCI
helm install my-release oci://ghcr.io/org/charts/my-app --version 0.1.0
Mise à jour de Helm
# Script officiel
curl https://raw.githubusercontent.com/helm/helm/main/scripts/get-helm-3 | bash
# Homebrew
brew upgrade helm
Troubleshooting
# Lister les releases dans un namespace
helm list -n database
# Voir le statut et les notes d'une release
helm status my-release -n database
# Voir les valeurs actuelles d'une release
helm get values my-release -n database
helm get values my-release -n database --all # Toutes les valeurs (y compris défauts)
# Voir les manifests générés actuellement
helm get manifest my-release -n database
# Debug d'un template
helm template my-app . -f values.yaml --debug
# Release bloquée en pending : forcer le rollback
helm rollback my-release 0 -n database # 0 = version précédente
Commandes utiles
helm list -A # Toutes les releases dans tous les namespaces
helm repo list # Dépôts configurés
helm show values bitnami/postgresql # Valeurs disponibles d'un chart
helm show chart bitnami/postgresql # Métadonnées d'un chart
helm diff upgrade my-release bitnami/postgresql # Diff (plugin helm-diff requis)
helm plugin install https://github.com/databus23/helm-diff # Installer plugin diff
Ressources
- Site officiel : https://helm.sh
- Documentation : https://helm.sh/docs/
- GitHub : https://github.com/helm/helm
- ArtifactHub (charts publics) : https://artifacthub.io
- Best practices : https://helm.sh/docs/chart_best_practices/