Aller au contenu
Conteneurs & Orchestration medium

Maîtriser la commande Helm : référence complète

60 min de lecture

logo helm

Quand vous déployez des applications sur Kubernetes, vous avez besoin d'installer des charts, de mettre à jour des releases, de revenir en arrière en cas de problème, et de déboguer vos déploiements. helm est le gestionnaire de packages de Kubernetes qui orchestre tout cela en une seule commande.

  • Installer et mettre à jour des applications avec helm install et helm upgrade
  • Gérer le cycle de vie complet : rollback, historique, suppression
  • Déboguer avec helm template, helm lint et helm get
  • Gérer les repositories et rechercher des charts
  • Maîtriser les options essentielles pour la production

helm fait partie des outils de déploiement Kubernetes. Il ne remplace pas kubectl : il génère les manifests à partir d'un chart (un paquet de templates paramétrables) puis les envoie à l'API du cluster, en gardant la trace de chaque déploiement sous forme de release versionnée. C'est cette mémoire des révisions qui permet le rollback, et c'est ce que les autres outils du tableau ne font pas de la même façon.

Chaque outil a sa spécialité :

OutilSpécialitéQuand l'utiliser
helmGérer des packages (charts)Déploiements reproductibles, versionnés
kubectlInteragir avec l'API K8sCommandes directes, debug, inspection
kustomizePersonnaliser des manifestsOverlays sans templating
argocdGitOps continuSynchronisation automatique depuis Git
fluxGitOps continuAlternative à ArgoCD

Combinaisons fréquentes :

Fenêtre de terminal
# helm + kubectl : vérifier le déploiement
helm install myapp ./chart && kubectl get pods -w
# helm template + kubectl diff : prévisualiser les changements
helm template myapp ./chart | kubectl diff -f -
# helm + grep : filtrer les releases
helm list -A | grep -i nginx

Quatre mots reviennent en permanence dans les messages de helm : repository, chart, release et values. Les confondre est la première source d'erreurs, parce que la même commande change de sens selon l'objet qu'on lui passe. Les définitions ci-dessous suffisent pour lire toutes les commandes de cette page.

Toutes les sous-commandes suivent le même ordre : le verbe, puis les arguments positionnels, puis les options. L'ordre des arguments compte, celui des options non.

Fenêtre de terminal
helm [commande] [arguments] [flags]

Les 5 commandes que vous utiliserez 80% du temps :

CommandeCe qu'elle faitExemple
helm installDéployer un charthelm install myapp bitnami/nginx
helm upgradeMettre à jour une releasehelm upgrade myapp bitnami/nginx
helm listLister les releaseshelm list -n prod
helm uninstallSupprimer une releasehelm uninstall myapp
helm templateGénérer les manifests (debug)helm template myapp ./chart

Un même chart peut être installé plusieurs fois dans le cluster : c'est le nom de release qui distingue les instances, et c'est lui qu'attendent upgrade, rollback et uninstall. Les values ne sont pas stockées dans le chart mais dans la release, ce qui explique qu'un upgrade sans fichier de values puisse effacer votre configuration.

ObjetQuestionExemples
ChartQuel paquet installer ?bitnami/nginx, ./mon-chart/
ReleaseQuel nom donner à l'instance ?myapp, nginx-prod
ValuesComment personnaliser ?-f values.yaml, --set replicas=3

Trois commandes couvrent le cycle de vie d'une application : install la crée, upgrade la fait évoluer, uninstall la retire. Elles partagent la plupart des options, notamment --namespace, --values et --wait. Retenez surtout que helm install échoue si le nom de release existe déjà dans le namespace, ce qui rend cette commande inutilisable telle quelle dans un pipeline rejoué plusieurs fois.

Le nom de release que vous choisissez ici vous suivra pendant toute la vie de l'application : il sert de clé à toutes les autres commandes et ne peut pas être changé après coup.

Fenêtre de terminal
helm install <release-name> <chart> [flags]

Options principales :

OptionDescriptionExemple
-n, --namespaceNamespace cible-n production
-f, --valuesFichier de values-f values-prod.yaml
--setSurcharge inline--set image.tag=v2.0
--create-namespaceCréer le namespace--create-namespace
--dry-runSimuler sans appliquer--dry-run
--waitAttendre que tout soit prêt--wait --timeout 5m
--atomicRollback auto si échec--atomic

Formes courantes :

Fenêtre de terminal
# Depuis un repository
helm install myapp bitnami/nginx
# Depuis un chart local
helm install myapp ./mon-chart/
# Depuis un registry OCI
helm install myapp oci://ghcr.io/org/charts/myapp --version 1.2.3
# Avec personnalisation
helm install myapp bitnami/nginx \
-n production --create-namespace \
-f values-prod.yaml \
--set replicaCount=3
# Mode sécurisé (rollback auto si échec)
helm install myapp ./chart \
--atomic \
--timeout 5m \
--wait

Chaque upgrade réussi crée une nouvelle révision dans l'historique de la release, y compris quand rien ne change dans les manifests générés. C'est cet incrément qui rend le rollback possible.

Fenêtre de terminal
helm upgrade <release-name> <chart> [flags]

Options spécifiques à upgrade :

OptionDescriptionExemple
--installCréer si n'existe pas--install (idempotent)
--reuse-valuesGarder les anciennes values--reuse-values
--reset-valuesRevenir aux defaults--reset-values
--forceForcer le remplacement--force

Pattern CI/CD (idempotent) :

Fenêtre de terminal
# Fonctionne que la release existe ou non
helm upgrade --install myapp ./chart \
-n production \
-f values-prod.yaml \
--atomic \
--wait

L'opération est irréversible : sans --keep-history, l'historique des révisions disparaît avec la release et aucun rollback n'est plus possible. Les volumes persistants créés par un StatefulSet, eux, survivent à la suppression et restent à nettoyer à la main.

Fenêtre de terminal
helm uninstall <release-name> [flags]

Options :

OptionDescriptionExemple
-n, --namespaceNamespace de la release-n production
--keep-historyConserver l'historique--keep-history
--dry-runSimuler la suppression--dry-run
Fenêtre de terminal
# Suppression simple
helm uninstall myapp -n production
# Conserver l'historique (permet rollback ultérieur)
helm uninstall myapp --keep-history

Helm conserve l'état de chaque release dans des Secrets du namespace concerné, un par révision. Les commandes de cette section lisent ces objets : elles répondent à « qu'est-ce qui tourne », « qu'est-ce qui a changé » et « comment revenir en arrière » sans jamais interroger vos fichiers sources. C'est pour cette raison qu'elles fonctionnent même si vous avez perdu le chart d'origine.

Sans option de namespace, la commande n'affiche que les releases du namespace courant de votre kubeconfig, souvent default : une release absente de la liste est presque toujours ailleurs, pas disparue.

Fenêtre de terminal
helm list [flags]

Options de filtrage :

OptionDescriptionExemple
-A, --all-namespacesTous les namespaces-A
-n, --namespaceNamespace spécifique-n prod
-a, --allInclure les releases supprimées-a
--deployedSeulement les déployées--deployed
--failedSeulement les échouées--failed
-o, --outputFormat de sortie-o json
Fenêtre de terminal
# Toutes les releases du cluster
helm list -A
# Releases en échec
helm list -A --failed
# Format JSON (scripting)
helm list -n prod -o json | jq '.[].name'

La colonne REVISION fournit le numéro à passer à helm rollback, et le statut superseded désigne simplement une révision remplacée par une plus récente. Notez qu'un rollback ne réécrit pas le passé : il ajoute une révision de plus, comme le montre la ligne 3 ci-dessous.

Fenêtre de terminal
helm history <release-name> [flags]
Fenêtre de terminal
# Voir l'historique
helm history myapp -n production

Sortie typique :

REVISION UPDATED STATUS CHART APP VERSION DESCRIPTION
1 Mon Jan 15 10:00:00 2026 superseded myapp-1.0.0 1.0.0 Install complete
2 Mon Jan 15 11:30:00 2026 superseded myapp-1.1.0 1.1.0 Upgrade complete
3 Mon Jan 15 14:00:00 2026 deployed myapp-1.1.0 1.1.0 Rollback to 2

Le numéro de révision est facultatif : omis, il ramène la release à la révision précédente. Le rollback restitue les manifests et les values de la révision visée, mais il ne redescend pas les images vers d'anciens tags si votre chart utilise un tag mouvant comme latest.

Fenêtre de terminal
helm rollback <release-name> <revision> [flags]

Options :

OptionDescriptionExemple
--forceForcer le rollback--force
--waitAttendre la stabilisation--wait
--timeoutDélai maximum--timeout 5m
Fenêtre de terminal
# Rollback à la révision 2
helm rollback myapp 2 -n production
# Rollback avec attente
helm rollback myapp 1 --wait --timeout 3m

Quand un déploiement se passe mal, la première question à trancher est : le problème vient-il du rendu des templates ou de ce que Kubernetes en fait ensuite ? Les commandes de cette section répondent des deux côtés de la frontière. template et lint travaillent hors ligne sur les sources du chart ; get et status interrogent la release réellement enregistrée dans le cluster.

Cette commande travaille entièrement côté client : elle ne contacte pas l'API Kubernetes, ne crée rien et fonctionne donc sans cluster accessible. Corollaire à connaître, elle ne détecte ni un champ refusé par l'API ni un conflit avec l'existant, sauf si vous ajoutez --validate.

Fenêtre de terminal
helm template <release-name> <chart> [flags]

La commande la plus importante pour débugger, elle génère les manifests Kubernetes sans les déployer.

Fenêtre de terminal
# Voir ce que Helm va générer
helm template myapp ./chart -f values.yaml
# Filtrer un type de ressource
helm template myapp ./chart | grep -A 50 "kind: Deployment"
# Sauvegarder pour inspection
helm template myapp ./chart -f values-prod.yaml > manifests.yaml
# Avec validation serveur (dry-run)
helm template myapp ./chart --validate

helm lint vérifie la structure du chart et le rendu des templates avec les values fournies. Par défaut il sort en succès malgré les avertissements : sans --strict, un pipeline de validation laisse donc passer des charts douteux.

Fenêtre de terminal
helm lint <chart-path> [flags]
Fenêtre de terminal
# Lint basique
helm lint ./mon-chart
# Mode strict (warnings = erreurs)
helm lint ./mon-chart --strict
# Avec des values spécifiques
helm lint ./mon-chart -f values-test.yaml

Niveaux de messages :

NiveauSignificationAction
[INFO]RecommandationOptionnel
[WARNING]Problème potentielÀ investiguer
[ERROR]Erreur bloquanteDoit être corrigée

C'est la commande qui répond à « qu'est-ce qui a réellement été appliqué », par opposition à ce que vos fichiers locaux décrivent aujourd'hui. Un écart entre helm get manifest et helm template signale une release plus ancienne que votre chart de travail.

Fenêtre de terminal
helm get <subcommand> <release-name> [flags]

Sous-commandes :

Sous-commandeCe qu'elle retourneUsage
manifestManifests déployésVoir ce qui tourne
valuesValues utiliséesComprendre la config
notesNotes post-installInstructions d'accès
allTout combinéDebug complet
Fenêtre de terminal
# Manifests actuellement déployés
helm get manifest myapp -n production
# Values utilisées (surcharges uniquement)
helm get values myapp -n production
# Toutes les values (défauts + surcharges)
helm get values myapp -n production --all
# Notes d'installation
helm get notes myapp -n production

Le statut renvoyé (deployed, failed, pending-upgrade) décrit l'opération Helm, pas la santé applicative : une release deployed dont les pods redémarrent en boucle reste deployed. Un statut pending-upgrade qui ne bouge plus trahit une opération interrompue et bloque les suivantes.

Fenêtre de terminal
helm status <release-name> [flags]
Fenêtre de terminal
# État actuel
helm status myapp -n production
# Format JSON (scripting)
helm status myapp -o json | jq '.info.status'

Un repository Helm n'est qu'un serveur HTTP exposant un fichier index.yaml qui recense les charts et leurs versions. Helm en garde une copie locale dans votre profil utilisateur, et toutes les recherches portent sur cette copie. Ces commandes servent à déclarer les sources, à rafraîchir ce cache et à inspecter un chart avant de l'installer.

Les repositories sont propres à votre poste : ils vivent dans votre configuration Helm locale, pas dans le cluster. Un agent de CI qui ne les déclare pas échouera sur un chart pourtant disponible depuis votre machine.

Fenêtre de terminal
helm repo <subcommand> [flags]

Sous-commandes :

Sous-commandeCe qu'elle faitExemple
addAjouter un repohelm repo add bitnami https://...
listLister les reposhelm repo list
updateMettre à jour l'indexhelm repo update
removeSupprimer un repohelm repo remove bitnami
Fenêtre de terminal
# Ajouter les repos essentiels
helm repo add bitnami https://charts.bitnami.com/bitnami
helm repo add prometheus-community https://prometheus-community.github.io/helm-charts
helm repo add ingress-nginx https://kubernetes.github.io/ingress-nginx
# Mettre à jour l'index local
helm repo update
# Lister les repos configurés
helm repo list

helm search repo lit uniquement l'index local : si la version que vous attendez n'apparaît pas, lancez d'abord helm repo update. Par défaut la recherche masque les versions de développement, --devel les fait apparaître.

Fenêtre de terminal
helm search <subcommand> <keyword> [flags]

Deux modes de recherche :

ModeCe qu'il chercheExemple
repoDans vos repos locauxhelm search repo nginx
hubSur Artifact Hubhelm search hub postgresql
Fenêtre de terminal
# Dans les repos configurés
helm search repo nginx
# Toutes les versions disponibles
helm search repo nginx --versions
# Sur Artifact Hub (internet)
helm search hub postgresql --max-col-width 50

helm show values est le seul moyen fiable de connaître les clés réellement acceptées par un chart avant de rédiger votre fichier de values : une clé mal orthographiée est ignorée en silence, sans erreur.

Fenêtre de terminal
helm show <subcommand> <chart> [flags]

Sous-commandes :

Sous-commandeCe qu'elle montreExemple
chartMétadonnées (Chart.yaml)helm show chart bitnami/nginx
valuesValues par défauthelm show values bitnami/nginx
readmeDocumentationhelm show readme bitnami/nginx
allTouthelm show all bitnami/nginx
Fenêtre de terminal
# Voir les values par défaut AVANT d'installer
helm show values bitnami/nginx > nginx-defaults.yaml
# Vérifier la version de l'application
helm show chart bitnami/nginx | grep appVersion

Distribuer un chart maison suppose trois étapes : l'archiver, le publier, puis permettre à d'autres de le récupérer. Depuis Helm 3.8, le format de distribution recommandé est le registry OCI, celui-là même qui héberge vos images de conteneurs : un seul registre, une seule authentification, les mêmes règles d'accès.

L'archive produite s'appelle nom-version.tgz d'après les champs name et version du Chart.yaml : c'est ce fichier Chart.yaml qui fait foi, pas le nom du dossier. Sans -d, l'archive atterrit dans le répertoire courant.

Fenêtre de terminal
helm package <chart-path> [flags]
Fenêtre de terminal
# Packager un chart
helm package ./mon-chart
# Avec une version spécifique
helm package ./mon-chart --version 1.2.3
# Dans un dossier spécifique
helm package ./mon-chart -d ./releases/

La commande attend une archive .tgz déjà construite, jamais un dossier de chart : helm package est donc un préalable obligatoire. L'URL de destination désigne le dépôt parent, Helm y ajoute lui-même le nom et la version du chart.

Fenêtre de terminal
helm push <chart.tgz> <registry-url>
Fenêtre de terminal
# Login au registry
helm registry login ghcr.io
# Push du chart
helm push mon-chart-1.2.3.tgz oci://ghcr.io/myorg/charts

Récupérer le chart en local est le réflexe utile pour auditer ce qu'un éditeur va déployer chez vous, ou pour figer une version dans votre propre dépôt Git. Sans --version, Helm prend la dernière version stable publiée.

Fenêtre de terminal
helm pull <chart> [flags]
Fenêtre de terminal
# Télécharger le .tgz
helm pull bitnami/nginx
# Télécharger et extraire
helm pull bitnami/nginx --untar
# Version spécifique
helm pull bitnami/nginx --version 15.0.0 --untar

Les cinq combinaisons ci-dessous couvrent l'essentiel du travail quotidien avec Helm : déployer sans intervention humaine, vérifier avant d'agir, comprendre un échec, revenir en arrière et gérer plusieurs environnements. Chacune assemble des commandes déjà décrites, l'intérêt est dans l'ordre et dans le choix des options.

Un pipeline doit produire le même résultat qu'il tourne pour la première ou la centième fois, et ne jamais laisser une release à moitié appliquée derrière lui. Les quatre options ci-dessous sont exactement là pour ça.

Fenêtre de terminal
helm upgrade --install myapp ./chart \
-n production \
--create-namespace \
-f values-prod.yaml \
--atomic \
--wait \
--timeout 5m

Pourquoi ce pattern ?

  • --install : crée si n'existe pas (idempotent)
  • --atomic : rollback auto si échec
  • --wait : attend que les pods soient Ready
  • --timeout : évite les blocages infinis

Comparer l'état déployé et l'état à venir évite les mauvaises surprises sur une ressource sensible comme un Service ou un PersistentVolumeClaim. helm diff est un plugin à installer séparément ; la seconde forme s'appuie uniquement sur kubectl et fonctionne partout.

Fenêtre de terminal
# Voir les changements
helm diff upgrade myapp ./chart -f values.yaml
# Ou sans le plugin diff
helm template myapp ./chart -f values.yaml | kubectl diff -f -

L'ordre des quatre étapes n'est pas arbitraire : il remonte du plus local au plus distant, de la syntaxe du chart jusqu'aux événements du cluster. Arrêtez-vous dès qu'une étape échoue, les suivantes ne feront que répéter le même symptôme.

Fenêtre de terminal
# 1. Lint le chart
helm lint ./chart --strict
# 2. Vérifier les manifests générés
helm template myapp ./chart -f values.yaml > /tmp/manifests.yaml
# 3. Valider contre le cluster
helm install myapp ./chart --dry-run --debug
# 4. Si déjà installé, inspecter
helm status myapp
helm get manifest myapp
kubectl get events -n production --sort-by='.lastTimestamp'

En incident, la tentation est de relancer un upgrade corrigé ; le rollback est plus sûr parce qu'il restitue une combinaison de manifests et de values déjà éprouvée en production. Dans helm history, la révision à viser est la plus récente marquée superseded : elle a été déployée avec succès avant d'être remplacée, contrairement à celles marquées failed.

Fenêtre de terminal
# Voir l'historique
helm history myapp -n production
# Rollback à la dernière version stable
helm rollback myapp <revision> -n production --wait
# Vérifier
helm status myapp -n production
kubectl get pods -n production

Les fichiers de values s'empilent dans l'ordre où vous les passez : le dernier -f gagne clé par clé. Un fichier de base commun suivi d'un fichier par environnement évite ainsi de dupliquer la configuration partagée tout en gardant les écarts visibles dans Git.

Fenêtre de terminal
# Dev
helm upgrade --install myapp ./chart \
-n dev -f values-base.yaml -f values-dev.yaml
# Staging
helm upgrade --install myapp ./chart \
-n staging -f values-base.yaml -f values-staging.yaml
# Production
helm upgrade --install myapp ./chart \
-n production -f values-base.yaml -f values-prod.yaml \
--atomic --wait

La plupart des messages d'erreur de Helm désignent un symptôme, pas la cause. Deux d'entre eux méritent une attention particulière : another operation in progress révèle une release restée en statut pending, qu'il faut débloquer avant toute autre commande ; les values non appliquées ne produisent aucune erreur du tout, seulement un déploiement qui ne ressemble pas à ce que vous attendiez.

ErreurCauseSolution
cannot re-use a nameRelease existe déjàUtiliser helm upgrade --install
release not foundMauvais namespaceAjouter -n namespace
UPGRADE FAILED: another operation in progressOpération interrompuehelm rollback ou attendre
Values non appliquées--reuse-values utiliséFournir explicitement -f values.yaml
nil pointer evaluatingValue manquante dans templateAjouter valeur ou default dans template
Timeout dépasséPods ne démarrent pasVérifier kubectl describe pod

Ce récapitulatif reprend les commandes du guide sous une forme copiable. Toutes portent un -n explicite : sans lui, Helm travaille sur le namespace courant du kubeconfig, ce qui est la source d'erreur la plus fréquente quand on jongle entre plusieurs environnements.

upgrade --install couvre à lui seul les deux premiers cas et reste la forme à privilégier dans un script, puisqu'il ne présuppose pas l'état de départ.

Fenêtre de terminal
helm install myapp ./chart -n prod -f values.yaml # Installer
helm upgrade --install myapp ./chart -n prod -f values.yaml # Install/upgrade idempotent
helm upgrade myapp ./chart -n prod -f values.yaml # Mettre à jour
helm uninstall myapp -n prod # Supprimer

Ces cinq commandes ne modifient rien : elles sont sans risque, y compris en production, et constituent le bon point de départ avant toute intervention.

Fenêtre de terminal
helm list -A # Toutes les releases
helm status myapp -n prod # État d'une release
helm history myapp -n prod # Historique
helm get values myapp -n prod --all # Values utilisées
helm get manifest myapp -n prod # Manifests déployés

Les deux premières lignes s'exécutent sans cluster ; la troisième, avec --dry-run, soumet les manifests à l'API pour validation et --debug affiche en plus les values calculées.

Fenêtre de terminal
helm lint ./chart --strict # Valider le chart
helm template myapp ./chart -f values.yaml # Générer manifests
helm install myapp ./chart --dry-run --debug # Simuler avec debug

Cette séquence est celle à rejouer sur toute nouvelle machine ou tout nouvel agent de CI, puisque les repositories sont stockés localement et non dans le cluster.

Fenêtre de terminal
helm repo add bitnami https://charts.bitnami.com/bitnami
helm repo update
helm search repo nginx
helm show values bitnami/nginx > defaults.yaml

Consultez toujours l'historique avant de choisir un numéro : helm rollback accepte n'importe quelle révision existante, y compris une révision qui avait échoué.

Fenêtre de terminal
helm history myapp -n prod # Voir les révisions
helm rollback myapp 2 -n prod --wait # Revenir à la révision 2

CommandeUsage principal
helm upgrade --installDéploiement CI/CD idempotent
helm templateDébugger les manifests générés
helm lint --strictValider un chart avant déploiement
helm get values --allComprendre la config d'une release
helm rollbackRevenir en arrière en cas de problème
helm diff upgradePrévisualiser les changements (plugin)

Ce site vous est utile ?

Sachez que moins de 1% des lecteurs soutiennent ce site.

Je maintiens +700 guides gratuits, sans pub ni tracking. Un soutien, même symbolique, m'aide à couvrir l'hébergement et à garder ces ressources gratuites. Merci pour votre appui.

Le formulaire ne s'affiche pas ? Ouvrir Ko-fi dans un onglet.

Abonnez-vous et suivez mon actualité DevSecOps sur LinkedIn