| name | helm-chart-builder |
| description | Conception de charts Helm pour Kubernetes — templates, values, dépendances et stratégies de déploiement. À utiliser quand l'utilisateur crée ou modifie des charts Helm, configure des déploiements K8s ou gère des releases. Se déclenche aussi avec "helm", "chart helm", "helm template", "values.yaml", "helm install", "helm upgrade", "kubernetes helm". Also triggers on "Helm chart", "Helm values", "package a Kubernetes app". |
Constructeur de Charts Helm
Workflow en étapes
- Analyser — identifier : type d'app (stateless/stateful), dépendances externes, environnements cibles, besoins ingress/secret/HPA.
- Scaffolder —
helm create mychart puis nettoyer les exemples inutiles.
- Modéliser
values.yaml — définir des defaults qui fonctionnent en dev sans surcharge. Tout ce qui varie par env = exposé en value.
- Écrire les templates — utiliser
_helpers.tpl pour les labels/noms ; ajouter checksum/config pour forcer le rollout sur changement de ConfigMap.
- Valider localement —
helm lint, helm template, helm diff (plugin) avant tout push.
- Déployer par env —
helm upgrade --install avec -f values-prod.yaml et --set image.tag=$TAG.
- Opérations post-deploy — vérifier
helm status, inspecter les logs, prévoir helm rollback si nécessaire.
Structure type
mychart/
├── Chart.yaml # Métadonnées + dépendances
├── values.yaml # Defaults (dev fonctionnel sans override)
├── values-staging.yaml
├── values-prod.yaml
├── templates/
│ ├── _helpers.tpl # include réutilisables (labels, fullname…)
│ ├── deployment.yaml
│ ├── service.yaml
│ ├── ingress.yaml
│ ├── hpa.yaml
│ ├── configmap.yaml
│ ├── secret.yaml # ou ExternalSecret si ESO
│ ├── serviceaccount.yaml
│ └── NOTES.txt # affiché après install
└── charts/ # dépendances téléchargées
Chart.yaml
apiVersion: v2
name: payment-api
description: API de gestion des paiements
type: application
version: 1.3.0
appVersion: "3.2.0"
dependencies:
- name: postgresql
version: "15.x.x"
repository: "oci://registry-1.docker.io/bitnamicharts"
condition: postgresql.enabled
Critère : incrémenter version à chaque changement de template ; incrémenter appVersion à chaque release applicative.
_helpers.tpl — base minimale
{{- define "mychart.fullname" -}}
{{- printf "%s-%s" .Release.Name .Chart.Name | trunc 63 | trimSuffix "-" }}
{{- end }}
{{- define "mychart.labels" -}}
helm.sh/chart: {{ .Chart.Name }}-{{ .Chart.Version }}
app.kubernetes.io/name: {{ .Chart.Name }}
app.kubernetes.io/instance: {{ .Release.Name }}
app.kubernetes.io/version: {{ .Chart.AppVersion | quote }}
app.kubernetes.io/managed-by: {{ .Release.Service }}
{{- end }}
{{- define "mychart.selectorLabels" -}}
app.kubernetes.io/name: {{ .Chart.Name }}
app.kubernetes.io/instance: {{ .Release.Name }}
{{- end }}
Deployment — template de référence
apiVersion: apps/v1
kind: Deployment
metadata:
name: {{ include "mychart.fullname" . }}
labels:
{{- include "mychart.labels" . | nindent 4 }}
spec:
{{- if not .Values.autoscaling.enabled }}
replicas: {{ .Values.replicaCount }}
{{- end }}
selector:
matchLabels:
{{- include "mychart.selectorLabels" . | nindent 6 }}
template:
metadata:
labels:
{{- include "mychart.selectorLabels" . | nindent 8 }}
annotations:
checksum/config: {{ include (print $.Template.BasePath "/configmap.yaml") . | sha256sum }}
spec:
{{ }}
{{ }}
{{ }}
{{ }}
{{ }}
{{ }}
{{ }}
{{ }}
{{ }}
{{ }}
{{ }}
values.yaml — defaults complets
replicaCount: 1
image:
repository: myregistry.azurecr.io/payment-api
tag: ""
pullPolicy: IfNotPresent
service:
type: ClusterIP
port: 80
targetPort: 8080
ingress:
enabled: false
className: nginx
annotations:
nginx.ingress.kubernetes.io/rewrite-target: /
hosts:
- host: api.company.com
paths:
- path: /
pathType: Prefix
resources:
requests:
cpu: 100m
memory: 256Mi
limits:
cpu: 500m
memory: 512Mi
autoscaling:
enabled: false
minReplicas: 2
maxReplicas: 10
Commandes essentielles
helm create mychart
helm lint mychart
helm template myrelease mychart -f values-prod.yaml | kubectl apply --dry-run=client -f -
helm upgrade --install myrelease ./mychart \
-f values-prod.yaml \
--set image.tag=v3.2.0 \
--namespace prod \
--create-namespace \
--atomic \
--timeout 5m
helm diff upgrade myrelease ./mychart -f values-prod.yaml --set image.tag=v3.2.0
helm rollback myrelease 1
helm dependency update mychart
helm status myrelease -n prod
helm get values myrelease -n prod
helm history myrelease -n prod
helm push mychart-1.3.0.tgz oci://myregistry.azurecr.io/charts
helm install myrelease oci://myregistry.azurecr.io/charts/mychart --version 1.3.0
Critères de décision
| Besoin | Solution recommandée |
|---|
| Secret sensible en prod | ExternalSecret (ESO) ou Vault Agent Injector, pas kind: Secret en clair |
| Multi-environnements | values-<env>.yaml + -f à l'install, pas de Helm templating conditionnel excessif |
| Dépendance DB locale en dev | postgresql.enabled: true dans values-dev.yaml |
| App stateful (DB, Kafka…) | StatefulSet + PVC dans le template, pas Deployment |
| Chart réutilisable entre équipes | Chart de type library dans un registry OCI partagé |
| Rollout zero-downtime | strategy.type: RollingUpdate + minReadySeconds + probes correctes |
Anti-patterns / pièges
image.tag: latest — non reproductible. Toujours passer --set image.tag=$CI_SHA.
- Secrets en clair dans values.yaml — ne jamais committer des credentials ; utiliser ESO, Vault ou
--set secret.password=$VAR depuis CI.
helm install sans --atomic — laisse une release en état FAILED ; préférer --atomic en CI/CD.
- Omettre
checksum/config — le pod ne redémarre pas quand la ConfigMap change sans cette annotation.
- Oublier
helm dependency update — dossier charts/ vide → install échoue silencieusement.
- Versioning mal séparé — ne pas synchroniser
version (chart) et appVersion (image) : les deux bougent indépendamment.
- Templates trop conditionnels —
{{- if .Values.featureX }}…{{- end }} partout rend le chart illisible ; préférer des charts séparés ou des overlays Kustomize pour des variantes majeures.
- Pas de
NOTES.txt — priver les utilisateurs du mode d'emploi post-install.
Bonnes pratiques 2026
- Publier dans un registry OCI (ACR, ECR, GHCR) plutôt qu'un chart repo HTTP classique.
- Utiliser
helm diff en CI pour générer un résumé lisible dans la PR avant merge.
- Coupler avec
ct (chart-testing) pour le lint et les tests d'intégration automatisés.
- Activer
NetworkPolicy par défaut dans le chart pour limiter le blast radius.
- Générer la documentation des values avec
helm-docs (annotations # -- description).
- Préférer
--atomic --timeout en CD pour garantir un rollback automatique en cas d'échec de rollout.