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
- Revision — 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
helm repo add cert-manager https://charts.jetstack.io
helm repo add prometheus-community https://prometheus-community.github.io/helm-charts
# Repositories bijwerken (als apt-get update)
helm repo update
# Alle repositories weergeven
helm repo list
# Repository verwijderen
helm repo remove bitnami
# Zoeken in alle repositories
helm search repo nginx
# Zoeken op Artifact Hub (publieke index)
helm search hub wordpress
Charts installeren
# Eenvoudige installatie
helm install mijn-nginx ingress-nginx/ingress-nginx
# In een specifieke namespace
helm install mijn-nginx ingress-nginx/ingress-nginx \
--namespace ingress-nginx \
--create-namespace
# Specifieke versie installeren
helm install mijn-nginx ingress-nginx/ingress-nginx \
--version 4.9.1
# Met aangepaste waarden via command line
helm install mijn-nginx ingress-nginx/ingress-nginx \
--set controller.replicaCount=2 \
--set controller.service.type=LoadBalancer
# Met een values-bestand
helm install mijn-nginx ingress-nginx/ingress-nginx \
-f mijn-values.yaml
# Droge run (geen installatie, toont wat er zou worden aangemaakt)
helm install mijn-nginx ingress-nginx/ingress-nginx \
--dry-run --debug
Releases beheren
# Alle releases weergeven
helm list
helm list -A # Alle namespaces
helm list -n ingress-nginx # Specifieke namespace
# Status van een release
helm status mijn-nginx -n ingress-nginx
# Geïnstalleerde waarden bekijken
helm get values mijn-nginx -n ingress-nginx
helm get values mijn-nginx -n ingress-nginx --all # Inclusief standaardwaarden
# Gegenereerde manifesten bekijken
helm get manifest mijn-nginx -n ingress-nginx
# Upgrade uitvoeren
helm upgrade mijn-nginx ingress-nginx/ingress-nginx \
--version 4.10.0 \
-n ingress-nginx
# Upgrade met gewijzigde waarden
helm upgrade mijn-nginx ingress-nginx/ingress-nginx \
--set controller.replicaCount=3 \
-n ingress-nginx
# Installeren als niet bestaat, upgraden als al bestaat
helm upgrade --install mijn-nginx ingress-nginx/ingress-nginx \
-n ingress-nginx \
--create-namespace
# Terugdraaien naar vorige revisie
helm rollback mijn-nginx -n ingress-nginx
# Terugdraaien naar specifieke revisie
helm rollback mijn-nginx 2 -n ingress-nginx
# Revisiegeschiedenis bekijken
helm history mijn-nginx -n ingress-nginx
# Release verwijderen
helm uninstall mijn-nginx -n ingress-nginx
Chart-informatie bekijken
# Standaardwaarden van een chart bekijken (vóór installatie)
helm show values ingress-nginx/ingress-nginx
# Chart-metadata bekijken
helm show chart ingress-nginx/ingress-nginx
# Alles weergeven
helm show all ingress-nginx/ingress-nginx
# Chart lokaal downloaden voor inspectie
helm pull ingress-nginx/ingress-nginx
helm pull ingress-nginx/ingress-nginx --untar # Uitpakken
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
# ├── deployment.yaml
# ├── service.yaml
# ├── ingress.yaml
# ├── hpa.yaml
# ├── serviceaccount.yaml
# ├── _helpers.tpl # Template-hulpfuncties
# └── NOTES.txt # Installatie-instructies
Chart.yaml
apiVersion: v2
name: mijn-app
description: Mijn applicatie als Helm chart
type: application
version: 0.1.0 # Chart-versie (volg SemVer)
appVersion: "1.2.3" # Versie van de applicatie zelf
values.yaml
replicaCount: 2
image:
repository: mijn-registry/mijn-app
tag: "1.2.3"
pullPolicy: IfNotPresent
service:
type: ClusterIP
port: 80
ingress:
enabled: false
hosts:
- host: mijn-app.voorbeeld.nl
paths:
- path: /
pathType: Prefix
resources:
requests:
cpu: 100m
memory: 128Mi
limits:
cpu: 500m
memory: 256Mi
templates/deployment.yaml
apiVersion: apps/v1
kind: Deployment
metadata:
name: {{ include "mijn-app.fullname" . }}
labels:
{{- include "mijn-app.labels" . | nindent 4 }}
spec:
replicas: {{ .Values.replicaCount }}
selector:
matchLabels:
{{- include "mijn-app.selectorLabels" . | nindent 6 }}
template:
metadata:
labels:
{{- include "mijn-app.selectorLabels" . | nindent 8 }}
spec:
containers:
- name: {{ .Chart.Name }}
image: "{{ .Values.image.repository }}:{{ .Values.image.tag }}"
imagePullPolicy: {{ .Values.image.pullPolicy }}
ports:
- containerPort: 8080
resources:
{{- toYaml .Values.resources | nindent 10 }}
Templates testen en valideren
# Templates renderen zonder installeren
helm template mijn-release ./mijn-app
helm template mijn-release ./mijn-app -f productie-values.yaml
# Chart valideren (YAML-syntaxcontrole + best practices)
helm lint ./mijn-app
# Sjablonen renderen en valideren tegen de API server
helm template mijn-release ./mijn-app | kubectl apply --dry-run=client -f -
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 \
--set replicaCount=3 \
--wait \ # Wacht tot de deployment gereed is
--timeout 5m # Maximale wachttijd
# Met een values-bestand per omgeving
- helm upgrade --install mijn-app mijn-repo/mijn-app \
-f values-productie.yaml \
--set image.tag=$CI_COMMIT_SHA
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 — Helm wordt gebruikt in combinatie met Argo CD voor GitOps-deployments
- CGOA — Helm charts als bron voor GitOps-tools (Flux, ArgoCD)
💡 Tijdens het CKA/CKAD-examen mag je de officiële Helm-documentatie raadplegen via helm.sh/docs — weet waar je snel commando’s kunt vinden.
Veelgemaakte fouten
- helm install vs helm upgrade –install — gebruik “upgrade –install” in CI/CD: werkt bij eerste installatie én bij updates
- Vergeten –namespace op te geven — Helm installeert standaard in de “default” namespace
- Values niet opslaan na upgrade — gebruik altijd “–reuse-values” of geef de volledige values mee bij elke upgrade
- Chart-versie vs appVersion verwarren — Chart.yaml heeft twee versies: version (het chart) en appVersion (de applicatie)
Veelgestelde vragen
Wat is het verschil tussen Helm en Kustomize?
Helm gebruikt templating (Go-templates met placeholders) 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 van bestaande manifesten. Beide worden ondersteund door Argo CD en Flux.
Kan ik een chart terugdraaien na een mislukte upgrade?
Ja — helm rollback <release> zet de release terug naar de vorige werkende revisie. Helm bewaart de geschiedenis van alle revisies (standaard 10). Dit is één van de grote voordelen van Helm ten opzichte van handmatige kubectl apply.