Helm en Helm Charts: complete gids voor Kubernetes package management
Helm is de package manager voor Kubernetes — vergelijkbaar met apt op Ubuntu of pip voor Python. In plaats van tientallen losse YAML-bestanden te beheren, bundel je alles in een Helm chart: één versioned pakket dat je kunt installeren, upgraden en terugdraaien met één commando. Helm is een officieel CNCF-project en is onderdeel van de examenstof voor CKA en CKAD.
Kernconcepten
- Chart — het pakket zelf: YAML-templates, standaardwaarden en metadata
- Release — een geïnstalleerde instantie van een chart in een specifieke namespace
- Repository — een verzameling charts, vergelijkbaar met een apt-repository
- Values — configuratiewaarden die de templates invullen; te overschrijven bij installatie
- Revisie — elke installatie of upgrade maakt een nieuwe revisie aan; herstel is mogelijk naar eerdere revisies
Helm installeren
# Via script (Linux/macOS)
curl https://raw.githubusercontent.com/helm/helm/main/scripts/get-helm-3 | bash
# Via package manager
brew install helm # macOS
choco install kubernetes-helm # Windows
# Versie verifiëren
helm version
Repositories beheren
# Repository toevoegen
helm repo add bitnami https://charts.bitnami.com/bitnami
helm repo add ingress-nginx https://kubernetes.github.io/ingress-nginx
# Repositories bijwerken (als apt-get update)
helm repo update
# Zoeken
helm search repo nginx
helm search hub wordpress
Charts installeren en beheren
# Eenvoudige installatie
helm install mijn-nginx ingress-nginx/ingress-nginx --namespace ingress-nginx --create-namespace
# Met aangepaste waarden
helm install mijn-nginx ingress-nginx/ingress-nginx --set controller.replicaCount=2
# Droge run
helm install mijn-nginx ingress-nginx/ingress-nginx --dry-run --debug
# Releases weergeven
helm list -A
# Upgrade (of installeren als nog niet bestaat — ideaal voor CI/CD)
helm upgrade --install mijn-nginx ingress-nginx/ingress-nginx -n ingress-nginx --create-namespace
# Terugdraaien
helm rollback mijn-nginx -n ingress-nginx
helm history mijn-nginx -n ingress-nginx
# Verwijderen
helm uninstall mijn-nginx -n ingress-nginx
Hoe de template engine werkt
Helm gebruikt Go-templates om YAML-manifesten te genereren. De templates bevatten placeholders ({{ .Values.replicaCount }}) die worden gevuld met waarden uit values.yaml en/of command-line overrides.
# templates/deployment.yaml
apiVersion: apps/v1
kind: Deployment
metadata:
name: {{ include "mijn-app.fullname" . }}
spec:
replicas: {{ .Values.replicaCount }}
template:
spec:
containers:
- name: {{ .Chart.Name }}
image: "{{ .Values.image.repository }}:{{ .Values.image.tag | default .Chart.AppVersion }}"
Rendering bekijken zonder te installeren
# Templates renderen (ziet precies wat naar het cluster gaat)
helm template mijn-release ./mijn-chart -f productie-values.yaml
# Valideren tegen de API server (dry-run)
helm install mijn-app ./mijn-chart --dry-run --debug
# Chart valideren
helm lint ./mijn-app
Waar Helm de release history opslaat
Helm slaat de release history op als Kubernetes Secrets in dezelfde namespace als de release. Elke revisie is een apart secret met de volledige staat (templates + values) gecodeerd in base64.
# Release history bekijken
helm history mijn-app -n mijn-namespace
# Secrets bekijken (Helm-interne opslag)
kubectl get secrets -n mijn-namespace | grep helm
# sh.helm.release.v1.mijn-app.v1 helm.sh/release.v1 ...
Eigen Helm chart bouwen
# Nieuwe chart aanmaken (scaffold)
helm create mijn-app
# Gegenereerde structuur:
# mijn-app/
# ├── Chart.yaml # Chart-metadata
# ├── values.yaml # Standaardwaarden
# ├── charts/ # Afhankelijke charts
# └── templates/ # YAML-templates
Helm hooks: pre- en post-lifecycle acties
Helm ondersteunt hooks: jobs of pods die op specifieke momenten in de lifecycle worden uitgevoerd, zoals database-migraties vóór een upgrade:
# templates/migration-job.yaml
apiVersion: batch/v1
kind: Job
metadata:
name: db-migratie
annotations:
"helm.sh/hook": pre-upgrade,pre-install
"helm.sh/hook-weight": "-5"
"helm.sh/hook-delete-policy": hook-succeeded
spec:
template:
spec:
containers:
- name: migratie
image: mijn-app:{{ .Values.image.tag }}
command: ["python", "manage.py", "migrate"]
restartPolicy: Never
Upgrade en rollback in detail
# Upgrade met reuse van vorige values (PLUS de --set override)
helm upgrade mijn-app ./mijn-chart --reuse-values --set image.tag=2.0.0
# Upgrade + installeren als nog niet bestaat (ideaal voor CI/CD)
helm upgrade --install mijn-app ./mijn-chart
--namespace mijn-namespace --create-namespace
--set image.tag=$CI_COMMIT_SHA
--wait --timeout 5m
# Rollback naar specifieke revisie
helm rollback mijn-app 1 -n mijn-namespace
Helm in CI/CD pipelines
# GitLab CI voorbeeld
deploy:
stage: deploy
script:
- helm repo add mijn-repo https://charts.voorbeeld.nl
- helm repo update
- helm upgrade --install mijn-app mijn-repo/mijn-app
--namespace productie --create-namespace
--set image.tag=$CI_COMMIT_SHA
--wait --timeout 5m
Helm-best practices
- helm upgrade --install in CI — werkt bij eerste installatie én bij updates
- --reuse-values gebruiken bij upgrades, anders worden waarden gereset naar defaults
- Pin chart-versies in CI/CD — voorkomt verrassingen bij automatische updates
- Chart-versie vs appVersion niet verwarren — Chart.yaml heeft twee versies: version (het chart) en appVersion (de applicatie)
- Bewaar values-bestanden per omgeving — values-dev.yaml, values-productie.yaml
Helm in relatie tot certificeringen
- CKAD — Helm is een examendoel: charts installeren, upgraden, waarden inspecteren en terugdraaien
- CKA — Helm is beschikbaar als hulpmiddel voor cluster-componenten (Ingress, Cert-Manager)
- EX380/CGOA — Helm wordt gebruikt in combinatie met Argo CD/Flux voor GitOps-deployments
Veelgestelde vragen
Wat is het verschil tussen Helm en Kustomize?
Helm gebruikt templating (Go-templates) en heeft een centrale chart-repository voor hergebruik. Kustomize werkt met overlays op bestaande YAML-bestanden zonder templating. Helm is beter voor complexe, configureerbare applicaties; Kustomize is beter voor eenvoudige omgeving-specifieke aanpassingen. Beide worden ondersteund door Argo CD en Flux.
Kan ik een chart terugdraaien na een mislukte upgrade?
helm rollback <release> zet de release terug naar de vorige werkende revisie. Helm bewaart standaard de geschiedenis van de laatste 10 revisies.