Réponse directe : helm dependency update télécharge les sous-charts déclarés dans Chart.yaml vers charts/ et génère un Chart.lock pour verrouiller les versions exactes. Le chart parent passe des values aux subcharts via des clés nommées (ex: backend.replicaCount), et global.* est automatiquement propagé à tous les sous-charts.
Ce guide vous montre comment composer des applications complexes en assemblant plusieurs charts Helm — subcharts locaux, dépendances externes, et umbrella charts — tout en maintenant une configuration cohérente et reproductible.
Pré-requis
Section intitulée « Pré-requis »Avant de commencer, assurez-vous d’avoir :
- Un cluster Kubernetes fonctionnel (kind, k3d, minikube ou distant)
kubectlconfiguré et un namespace de test- Helm v3.8+ installé
- Connaissance des modules précédents : templates, values, fonctions
Ce que vous allez apprendre
Section intitulée « Ce que vous allez apprendre »| Section | Concept | Durée |
|---|---|---|
| Déclarer des dépendances | Chart.yaml dependencies, repositories | 10 min |
| Télécharger et verrouiller | helm dependency update/build, Chart.lock | 8 min |
| Subcharts et values | Clés nommées, global.*, import-values | 12 min |
| Conditions et tags | Activer/désactiver des sous-charts | 8 min |
| Umbrella chart | Architecture multi-tiers complète | 10 min |
| Pièges et maintenance | Conflits de noms, mises à jour | 7 min |
Déclarer des dépendances
Section intitulée « Déclarer des dépendances »Un chart Helm peut dépendre d’autres charts — locaux ou distants. Ces dépendances sont déclarées dans le fichier Chart.yaml sous la clé dependencies.
Syntaxe de base
Section intitulée « Syntaxe de base »Créez un chart umbrella avec des dépendances mixtes :
apiVersion: v2name: mon-stackdescription: Chart umbrella pour démo compositiontype: applicationversion: 1.0.0appVersion: "1.0.0"
dependencies: # Dépendance locale (sous-chart dans charts/) - name: backend version: "0.1.0" repository: "file://charts/backend"
# Dépendance externe (repository Helm) - name: kube-state-metrics version: "5.27.0" repository: "https://prometheus-community.github.io/helm-charts" condition: monitoring.enabled # Activation conditionnelle alias: metrics # Renommer dans les templatesTypes de repositories
Section intitulée « Types de repositories »| Type | Syntaxe repository | Usage |
|---|---|---|
| Local | file://charts/nom | Sous-chart développé avec le parent |
| HTTPS | https://example.com/charts | Repository Helm classique |
| OCI | oci://ghcr.io/org/charts | Registry OCI (Helm 3.8+) |
| Alias | @monrepo | Référence un repo ajouté via helm repo add |
Champs de dépendance
Section intitulée « Champs de dépendance »| Champ | Obligatoire | Description |
|---|---|---|
name | ✅ | Nom du chart à inclure |
version | ✅ | Version ou range SemVer (^1.2.0, ~1.2.0, >=1.0.0) |
repository | ✅ | URL ou chemin du chart |
condition | ❌ | Chemin values pour activer/désactiver (ex: db.enabled) |
tags | ❌ | Liste de tags pour activation groupée |
alias | ❌ | Renommer le chart (utile si même chart plusieurs fois) |
import-values | ❌ | Importer des values du sous-chart vers le parent |
Télécharger et verrouiller les versions
Section intitulée « Télécharger et verrouiller les versions »Helm propose deux commandes pour gérer les dépendances : update et build.
helm dependency update
Section intitulée « helm dependency update »Cette commande résout les dépendances depuis Chart.yaml, télécharge les charts dans charts/, et génère un fichier Chart.lock :
helm dependency update mon-stack/Sortie typique :
Hang tight while we grab the latest from your chart repositories......Successfully got an update from the "prometheus-community" chart repositoryUpdate Complete. ⎈Happy Helming!⎈Saving 2 chartsDownloading kube-state-metrics from repo https://prometheus-community.github.io/helm-chartsDeleting outdated chartsCe qui se passe :
- Helm met à jour les indexes des repositories
- Résout les versions selon les contraintes (
5.27.0,^1.0.0, etc.) - Télécharge les
.tgzdanscharts/ - Génère
Chart.lockavec les versions exactes
Contenu de charts/ après update
Section intitulée « Contenu de charts/ après update »ls -la mon-stack/charts/total 32drwxrwxr-x 3 bob bob 4096 févr. 1 19:09 .drwxrwxr-x 4 bob bob 4096 févr. 1 19:09 ..drwxrwxr-x 3 bob bob 4096 févr. 1 19:08 backend-rw-rw-r-- 1 bob bob 751 févr. 1 19:09 backend-0.1.0.tgz-rw-r--r-- 1 bob bob 14235 févr. 1 19:09 kube-state-metrics-5.27.0.tgzLes sous-charts locaux (file://) restent en dossiers ET sont packagés en .tgz. Les dépendances externes arrivent uniquement en .tgz.
Chart.lock : le verrou de reproductibilité
Section intitulée « Chart.lock : le verrou de reproductibilité »dependencies:- name: backend repository: file://charts/backend version: 0.1.0- name: kube-state-metrics repository: https://prometheus-community.github.io/helm-charts version: 5.27.0digest: sha256:c7be1e4c41ba5a5a166b995fbf57fd64ef0364100fb37c12a84553e64f4443c3generated: "2026-02-01T19:09:58.573104083+01:00"Ce fichier est essentiel : il garantit que toute l’équipe et la CI utilisent les mêmes versions exactes.
helm dependency build
Section intitulée « helm dependency build »Contrairement à update, la commande build utilise Chart.lock au lieu de Chart.yaml pour télécharger les dépendances :
# Supprimer les archives téléchargéesrm mon-stack/charts/*.tgz
# Reconstruire depuis le lockhelm dependency build mon-stack/Sortie :
Saving 2 chartsDownloading kube-state-metrics from repo https://prometheus-community.github.io/helm-chartsDeleting outdated chartsupdate vs build : quand utiliser quoi ?
Section intitulée « update vs build : quand utiliser quoi ? »| Commande | Utilise | Quand l’utiliser |
|---|---|---|
helm dependency update | Chart.yaml | Développement, mise à jour vers nouvelles versions |
helm dependency build | Chart.lock | CI/CD, builds reproductibles |
Lister les dépendances
Section intitulée « Lister les dépendances »helm dependency list mon-stack/NAME VERSION REPOSITORY STATUSbackend 0.1.0 file://charts/backend okkube-state-metrics 5.27.0 https://prometheus-community.github.io/helm-charts okLes statuts possibles :
ok: Dépendance présente et à jourmissing: Non téléchargée (lancerupdateoubuild)unpacked: Dossier présent mais pas de.tgz
Subcharts : passer des values
Section intitulée « Subcharts : passer des values »La communication entre chart parent et subcharts se fait exclusivement via les values. Helm offre trois mécanismes.
Mécanisme 1 : Clés nommées
Section intitulée « Mécanisme 1 : Clés nommées »Chaque sous-chart reçoit ses values sous une clé correspondant à son nom (ou alias) :
# Configuration du sous-chart "backend"backend: replicaCount: 2 image: tag: "6.7.1"
# Configuration du sous-chart avec alias "metrics" (kube-state-metrics)metrics: prometheusScrape: true replicas: 1Dans le sous-chart backend, ces values sont accessibles directement :
spec: replicas: {{ .Values.replicaCount }} # Reçoit 2 containers: - image: "{{ .Values.image.repository }}:{{ .Values.image.tag }}" # tag = 6.7.1Mécanisme 2 : Global values
Section intitulée « Mécanisme 2 : Global values »Les values sous global.* sont automatiquement propagées à tous les sous-charts :
global: imageRegistry: "my-registry.io" additionalLabels: team: platform cost-center: infraDans n’importe quel sous-chart :
metadata: labels: {{- with .Values.global.additionalLabels }} {{- toYaml . | nindent 4 }} {{- end }}spec: containers: - image: "{{ .Values.global.imageRegistry }}/{{ .Values.image.repository }}:{{ .Values.image.tag }}"Résultat du template :
metadata: labels: team: platform cost-center: infraspec: containers: - image: "my-registry.io/ghcr.io/stefanprodan/podinfo:6.7.1"Mécanisme 3 : import-values
Section intitulée « Mécanisme 3 : import-values »Pour des cas avancés, vous pouvez importer des values d’un sous-chart vers le parent :
dependencies: - name: database version: "0.1.0" repository: "file://charts/database" import-values: - child: exports.connection # Chemin dans le sous-chart parent: dbConnection # Clé dans le parentexports: connection: host: postgres.default.svc port: 5432 database: appdbDans un template du parent, vous accédez maintenant à :
data: DB_HOST: {{ .Values.dbConnection.host | quote }} # "postgres.default.svc" DB_PORT: {{ .Values.dbConnection.port | quote }} # "5432"Conditions et tags
Section intitulée « Conditions et tags »Vous pouvez activer ou désactiver des sous-charts dynamiquement sans les supprimer de Chart.yaml.
Conditions
Section intitulée « Conditions »Une condition est un chemin values qui doit valoir true ou false :
dependencies: - name: kube-state-metrics version: "5.27.0" repository: "https://prometheus-community.github.io/helm-charts" condition: monitoring.enabled alias: metricsmonitoring: enabled: true # Le sous-chart est inclusTester la condition :
# Avec monitoring activéhelm template mon-stack . --set monitoring.enabled=true 2>&1 | grep -E "^# Source:" | sort -u# Source: mon-stack/charts/backend/templates/service.yaml# Source: mon-stack/charts/metrics/templates/clusterrolebinding.yaml# Source: mon-stack/charts/metrics/templates/deployment.yaml# Source: mon-stack/charts/metrics/templates/role.yaml# Source: mon-stack/charts/metrics/templates/serviceaccount.yaml# Source: mon-stack/charts/metrics/templates/service.yaml# Avec monitoring désactivéhelm template mon-stack . --set monitoring.enabled=false 2>&1 | grep -E "^# Source:" | sort -u# Source: mon-stack/charts/backend/templates/service.yamlLe sous-chart metrics n’est plus rendu quand monitoring.enabled=false.
Les tags permettent de grouper plusieurs sous-charts et de les activer/désactiver ensemble :
dependencies: - name: backend version: "0.1.0" repository: "file://charts/backend" tags: - backend - api
- name: frontend version: "0.1.0" repository: "file://charts/frontend" tags: - frontend - api
- name: kube-state-metrics repository: "https://prometheus-community.github.io/helm-charts" tags: - monitoring - observabilitytags: api: true # Active backend ET frontend monitoring: false # Désactive kube-state-metricsPriorité : condition vs tag
Section intitulée « Priorité : condition vs tag »Quand un sous-chart a à la fois une condition et des tags, la condition a priorité :
condition | tag | Résultat |
|---|---|---|
true | true | ✅ Inclus |
true | false | ✅ Inclus (condition prioritaire) |
false | true | ❌ Exclu (condition prioritaire) |
false | false | ❌ Exclu |
| non définie | true | ✅ Inclus |
| non définie | false | ❌ Exclu |
Umbrella chart : composer une stack
Section intitulée « Umbrella chart : composer une stack »Un umbrella chart est un chart qui ne contient (presque) pas de templates propres — il orchestre uniquement des sous-charts pour déployer une stack complète.
Architecture typique
Section intitulée « Architecture typique »Répertoiremon-stack/
- Chart.yaml Dépendances déclarées ici
- Chart.lock Versions verrouillées
- values.yaml Configuration globale + overrides subcharts
Répertoiretemplates/
- configmap.yaml Optionnel : config partagée
Répertoirecharts/
Répertoirebackend/ Sous-chart local
- …
Répertoiredatabase/ Sous-chart local
- …
- kube-state-metrics-5.27.0.tgz Dépendance externe
Exemple complet
Section intitulée « Exemple complet »Voici un umbrella chart pour une application web avec monitoring :
apiVersion: v2name: mon-stackdescription: Stack web complète avec backend, database et monitoringtype: applicationversion: 1.0.0appVersion: "1.0.0"
dependencies: - name: backend version: "0.1.0" repository: "file://charts/backend" tags: - backend
- name: database version: "0.1.0" repository: "file://charts/database" import-values: - child: exports.connection parent: dbConnection
- name: kube-state-metrics version: "5.27.0" repository: "https://prometheus-community.github.io/helm-charts" condition: monitoring.enabled alias: metrics# Activation par tagstags: backend: true
# Configuration globale (propagée à tous les subcharts)global: imageRegistry: "" additionalLabels: app.kubernetes.io/part-of: mon-stack
# Override du sous-chart backendbackend: replicaCount: 2 image: tag: "6.7.1" resources: requests: cpu: 100m memory: 128Mi limits: cpu: 500m memory: 512Mi
# Override du sous-chart databasedatabase: persistence: size: 20Gi
# Activation du monitoringmonitoring: enabled: true
# Override du sous-chart metrics (alias de kube-state-metrics)metrics: prometheusScrape: truehelm template mon-stack . 2>&1 | grep -E "^# Source:" | sort -u# Source: mon-stack/charts/backend/templates/service.yaml# Source: mon-stack/charts/metrics/templates/clusterrolebinding.yaml# Source: mon-stack/charts/metrics/templates/deployment.yaml# Source: mon-stack/charts/metrics/templates/role.yaml# Source: mon-stack/charts/metrics/templates/service.yaml# Source: mon-stack/charts/metrics/templates/serviceaccount.yaml# Source: mon-stack/templates/configmap.yamlAfficher les métadonnées
Section intitulée « Afficher les métadonnées »helm show chart mon-stack/apiVersion: v2appVersion: 1.0.0dependencies:- name: backend repository: file://charts/backend tags: - backend version: 0.1.0- import-values: - child: exports.connection parent: dbConnection name: database repository: file://charts/database version: 0.1.0- alias: metrics condition: monitoring.enabled name: kube-state-metrics repository: https://prometheus-community.github.io/helm-charts version: 5.27.0description: Stack web complète avec backend, database et monitoringname: mon-stacktype: applicationversion: 1.0.0Packager l’umbrella
Section intitulée « Packager l’umbrella »Quand vous packagez un umbrella chart, toutes les dépendances sont incluses dans l’archive :
helm package mon-stack/ -d ./dist/Successfully packaged chart and saved it to: ./dist/mon-stack-1.0.0.tgztar tzf ./dist/mon-stack-1.0.0.tgz | head -20mon-stack/Chart.yamlmon-stack/Chart.lockmon-stack/values.yamlmon-stack/templates/configmap.yamlmon-stack/charts/backend/Chart.yamlmon-stack/charts/backend/values.yamlmon-stack/charts/backend/templates/deployment.yamlmon-stack/charts/backend/templates/service.yamlmon-stack/charts/kube-state-metrics/Chart.yamlmon-stack/charts/kube-state-metrics/values.yamlmon-stack/charts/kube-state-metrics/templates/...Pièges de composition et maintenance
Section intitulée « Pièges de composition et maintenance »Piège 1 : Conflits de noms
Section intitulée « Piège 1 : Conflits de noms »Deux sous-charts peuvent générer des ressources avec le même nom, causant des conflits :
# backend génère : mon-stack-backend-config# frontend génère aussi : mon-stack-frontend-config# ✅ OK, noms différents
# Si les deux utilisent {{ .Release.Name }}-config :# ❌ Conflit : mon-stack-config existe deux foisSolution : Utilisez le pattern {{ include "chart.fullname" . }} qui inclut le nom du chart :
{{- define "backend.fullname" -}}{{- printf "%s-%s" .Release.Name .Chart.Name | trunc 63 | trimSuffix "-" }}{{- end }}Piège 2 : Mises à jour des dépendances
Section intitulée « Piège 2 : Mises à jour des dépendances »Après modification de Chart.yaml, vous devez re-run helm dependency update :
# ❌ Erreur si vous oubliezhelm template mon-stack .# Error: found in Chart.yaml, but missing in charts/ directory: new-dependency
# ✅ Correcthelm dependency update mon-stack/helm template mon-stack .Piège 3 : Version ranges trop permissives
Section intitulée « Piège 3 : Version ranges trop permissives »dependencies: # ❌ Dangereux : peut sauter une major - name: postgres version: "*"
# ⚠️ Peut inclure des breaking changes mineurs - name: postgres version: ">=15.0.0"
# ✅ Recommandé : patch updates seulement - name: postgres version: "~15.5.0" # 15.5.x uniquement
# ✅ Recommandé : minor updates - name: postgres version: "^15.0.0" # 15.x.x uniquementPiège 4 : Charts.lock non commité
Section intitulée « Piège 4 : Charts.lock non commité »Si Chart.lock n’est pas dans le repo Git, chaque développeur peut avoir des versions différentes :
# Fichiers à commitergit add Chart.yaml Chart.lock values.yaml templates/
# Fichiers à ignorer (reconstruits via helm dependency build)echo "charts/*.tgz" >> .gitignorePiège 5 : Oublier les conditions
Section intitulée « Piège 5 : Oublier les conditions »Sans condition, un sous-chart est toujours déployé même si non utilisé :
# ❌ Pas de condition : monitoring toujours déployé- name: prometheus version: "25.0.0" repository: "https://prometheus-community.github.io/helm-charts"
# ✅ Avec condition : contrôle explicite- name: prometheus version: "25.0.0" repository: "https://prometheus-community.github.io/helm-charts" condition: prometheus.enabledLab B3 — Créer un umbrella chart fonctionnel
Section intitulée « Lab B3 — Créer un umbrella chart fonctionnel »-
Créer la structure :
Fenêtre de terminal mkdir -p mon-umbrella/charts/api/templates -
Déclarer le sous-chart API (
charts/api/Chart.yaml) :apiVersion: v2name: apiversion: 0.1.0 -
Ajouter une dépendance externe (Chart.yaml du parent) :
dependencies:- name: apiversion: "0.1.0"repository: "file://charts/api"- name: kube-state-metricsversion: "5.27.0"repository: "https://prometheus-community.github.io/helm-charts"condition: monitoring.enabledalias: metrics -
Configurer les values avec
global.*et overrides :global:environment: stagingapi:replicaCount: 3monitoring:enabled: true -
Télécharger et valider :
Fenêtre de terminal helm dependency update mon-umbrella/helm template test mon-umbrella/ | kubectl apply --dry-run=client -f -
Critères de réussite :
-
helm dependency listaffiche toutes les dépendances en statusok -
Chart.lockest généré avec les versions exactes - Les values
global.*sont accessibles dans les sous-charts -
--set monitoring.enabled=falseexclut kube-state-metrics du rendu - Le chart se package avec toutes les dépendances incluses
À retenir
Section intitulée « À retenir »| Concept | Commande / Syntaxe | Usage |
|---|---|---|
| Déclarer | dependencies: dans Chart.yaml | Lister les sous-charts |
| Télécharger | helm dependency update | Développement, nouvelles versions |
| Reconstruire | helm dependency build | CI/CD, reproductibilité |
| Lister | helm dependency list | Vérifier les statuts |
| Values nommées | backend.replicaCount: 2 | Configurer un sous-chart |
| Global values | global.imageRegistry | Propager à tous les sous-charts |
| Condition | condition: db.enabled | Activer/désactiver un sous-chart |
| Alias | alias: metrics | Renommer un sous-chart |