Helm Cheatsheet & Gids

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.