Helm
auf einem Blatt.
Dichte Referenz für Senior Platform Engineers und SREs zum Kubernetes-Paketmanager, ausgerichtet auf Helm 4. Chart-Anatomie, Templating-Patterns, Values-Schichtung & Secrets, Release-Lifecycle, Hooks, Dependencies, OCI-Registries, Signing und Anti-Patterns. Keine Einsteiger-Folien.
Vorschau (2 Seiten A4 quer + Brand-Rückseite)


PDF herunterladen
Direkter Download, keine Mail-Adresse nötig. CC BY-SA 4.0: kopieren, drucken, weiterverteilen ist ausdrücklich erlaubt, solange die Quellenangabe sichtbar bleibt.
Was drin steht
Helm 4 & Migration
Stand Oktober 2026: Helm 4.3.x aktuell, Helm 3 nur noch Security-Fixes, Version-Skew, Flag-Renames, Post-Renderer als Plugins, SSA-Latching, kstatus-RBAC.
Chart-Anatomie & Templating
Chart.yaml-Kernfelder, values.schema.json, Named Templates in _helpers.tpl, include/required/tpl, Checksum-Trick für Config-Rollouts.
Values & Secrets
Präzedenz-Schichtung (-f, --set-Familie), Subchart-Scoping, global:, helm-secrets/SOPS, External Secrets, CI-Injection.
Release-Lifecycle
upgrade --install, history/rollback, 3-way strategic merge vs. Server-Side Apply, --rollback-on-failure, --wait mit kstatus.
Hooks, Tests & Dependencies
helm.sh/hook-Annotationen, weights, delete-policies, helm test, dependencies mit condition/tags/alias, Chart.lock.
OCI, Validierung & Signing
registry login/push, Digest-Pinning, lint/template/kubeconform, helm-diff, package --sign, Provenance-Verify. Anti-Patterns aus der Praxis.
Cheatsheet im Volltext
Derselbe Inhalt wie im PDF, zum Mitlesen, Durchsuchen und direkten Kopieren der YAML- und CLI-Snippets. Stand: Helm v4.3 (Edition 2026.10).
Helm 4: Stand Oktober 2026
Versionen, Support-Fenster
Helm 4 ist die aktuelle Major-Version (4.0.0 am
12.11.2025, aktuell 4.3.x seit 09.09.2026, 4.4.0
geplant für 13.01.2027). Gepflegt wird nur der neueste Minor.
Charts mit apiVersion: v2 laufen unverändert;
bestehende Helm-3-Releases übernimmt Helm 4 ohne
Migrationsschritt.
Helm 3 läuft aus: 3.22.0 (09.09.2026, nur K8s-Client-Updates) war der letzte Minor, Security-Fixes bis 10.02.2027, danach EOL.
Skew n-3 zur einkompilierten K8s-Version: 4.3 und 3.22 → 1.37 bis 1.34, 4.2 → 1.36 bis 1.33. Neuere Cluster als die einkompilierte K8s-Version: ohne Garantie.
Breaking Changes 3 auf 4
--atomic → --rollback-on-failure,
--force → --force-replace (alte
Flags funktionieren mit Deprecation-Warnung).
--post-renderer nimmt einen
Plugin-Namen, kein Executable mehr.
helm registry login akzeptiert nur noch
Domains, keine URLs.
--wait nutzt kstatus (Strategie
watcher, Informer im Namespace): RBAC braucht
list und watch auf die Ressourcentypen
des Releases, für Deployments zusätzlich
list auf ReplicaSets und Pods.
--wait=legacy pollt wie Helm 3.
Neu in Helm 4
Server-Side Apply als Default für neue Releases (Details unter Release-Lifecycle).
Plugin-System neu: plugin.yaml verlangt
apiVersion: v1, type
(cli/v1, getter/v1,
postrenderer/v1) und runtime
(subprocess oder WASM extism/v1);
Helm-3-Plugins laufen bis Helm 5 weiter.
Multi-Dokument-Values, Custom-Template-Funktionen via Plugins, Content-basiertes Chart-Caching, schnellere Dependency-Auflösung.
Chart-Anatomie
Verzeichnis-Layout
Chart.yaml (Metadaten, Pflicht) ·
values.yaml (Defaults) ·
values.schema.json (optionales JSON-Schema) ·
templates/ (Manifeste + _helpers.tpl)
· charts/ (gevendorte Dependencies) ·
crds/ (CRDs, siehe Anti-Patterns).
charts/, crds/,
templates/ sind für Helm reserviert.
Chart.yaml-Kernfelder
apiVersion: v2, Standard für Helm 3
und 4 (v1 = Helm 2; Charts v3
experimentell, helm create erzeugt sie nur mit
HELM_EXPERIMENTAL_CHART_V3=1).
version: SemVer des Charts, treibt Paketname, Registry-Tag und Range-Auflösung.
appVersion: Version der paketierten App, informativ.
type: application oder
library (Library-Charts rendern selbst nichts,
liefern Template-Bausteine).
apiVersion: v2
name: shop-api
version: 1.4.0 # Chart-SemVer
appVersion: "2.8.1" # App-Version, informativ
type: application
dependencies:
- name: postgresql
version: ">=16.0.0 <17.0.0"
repository: oci://registry.example.com/charts
condition: postgresql.enabled
Templating-Patterns
include, required, tpl
include rendert ein Named Template zu einem
String, der Output lässt sich pipen
(| nindent 4), anders als bei der
template-Action.
required bricht das Rendering mit eigener Fehlermeldung ab, wenn der Values-Eintrag leer ist.
tpl evaluiert Strings aus values als
Template, für konfigurierbare Templates und
.Files.Get-Inhalte.
Named Templates (_helpers.tpl)
define-Namen sind global über
Chart + Subcharts, immer mit Chart-Namen prefixen:
shop.labels statt labels. Ablage
konventionell in templates/_helpers.tpl
(Underscore-Dateien rendern kein Manifest).
{{- define "shop.labels" -}}
app.kubernetes.io/name: {{ .Chart.Name }}
app.kubernetes.io/version: {{ .Chart.AppVersion }}
{{- end }}
# Verwendung: Output pipen, nicht 'template'
metadata:
labels: {{- include "shop.labels" . | nindent 4 }}
host: {{ required "host fehlt!" .Values.host }}
conf: {{ tpl (.Files.Get "conf/app.conf") . }}
Checksum-Trick
ConfigMap-Änderung rollt das Deployment nicht automatisch, Checksum-Annotation im Pod-Template erzwingt den Rollout:
annotations:
checksum/config: {{ include (print $.Template.BasePath "/configmap.yaml") . | sha256sum }}
Values-Schichtung & Secrets
Präzedenz
Chart-values.yaml < Parent-Chart-Overrides <
-f-Dateien (rechts gewinnt) <
--set-json < --set <
--set-string < --set-file <
--set-literal, feste Reihenfolge unabhängig von
der Position im Aufruf.
Subchart-Values unter dem Subchart-Namen scopen;
global: ist in allen Charts sichtbar.
--reset-values verwirft beim Upgrade gemerkte
Overrides.
Secrets-Strategien
Nie Klartext-Secrets in values.yaml im Git. Gängige Muster:
helm-secrets-Plugin + SOPS/age: values verschlüsselt im Repo, Entschlüsselung beim Deploy.
External Secrets Operator / Sealed Secrets: Secret-Lifecycle außerhalb des Charts, Chart referenziert nur den Namen.
CI-Injection: --set-file aus dem
Secret-Store der Pipeline, nichts landet im Repo.
helm upgrade --install shop ./shop -n shop \
-f values.yaml -f values-prod.yaml \
--set image.tag=2.8.1 \
--set-file tls.cert=./tls.crt \
--set-json 'resources={"limits":{"cpu":"1"}}'
helm get values shop -n shop # gemerkte Overrides
Release-Lifecycle
install, upgrade, rollback
helm upgrade --install ist der idempotente
Standardpfad (CI-tauglich). helm history zeigt
Revisionen, helm rollback <rel> <rev>
setzt zurück (erzeugt neue Revision).
helm get manifest|values|notes inspiziert den
Ist-Stand. --rollback-on-failure rollt
fehlgeschlagene Upgrades automatisch zurück (Install:
uninstall) und setzt ohne explizites --wait implizit
--wait=watcher.
Ab 4.3 löscht helm uninstall
nur Objekte, deren Label app.kubernetes.io/managed-by
auf Helm steht und deren Annotationen
meta.helm.sh/release-name und -namespace
zum Release passen; fremde oder nicht lesbare bleiben stehen und
werden gelistet.
Jedes helm upgrade stempelt die Metadaten neu, vor dem
Uninstall also ein Upgrade fahren, wenn Labels fehlen.
3-way merge, Server-Side Apply
Helm 3: Three-Way Strategic Merge Patch aus altem Manifest, Live-State und neuem Manifest, out-of-band-Änderungen bleiben erhalten, soweit nicht im Chart überschrieben.
Helm 4: Server-Side Apply
(Field-Ownership beim API-Server) als Default für
neue Releases. Upgrades/Rollbacks
latchen auf die bisherige Apply-Methode des
Releases (--server-side=auto); Umstellung explizit
per --server-side=true|false.
helm upgrade --install shop ./shop -n shop \ --rollback-on-failure --wait --timeout 5m helm history shop -n shop helm rollback shop 3 -n shop helm get manifest shop -n shop --revision 3 helm uninstall shop -n shop --keep-history
Hooks & Tests
Hook-Mechanik
Annotation helm.sh/hook macht ein Template zum
Hook: pre-install, post-install,
pre-upgrade, post-upgrade,
pre-delete, post-delete,
pre-rollback, post-rollback,
test.
Reihenfolge via helm.sh/hook-weight (String!,
aufsteigend). Job/Pod-Hooks blockieren bis
Completion, Fehler = Release fehlgeschlagen.
Delete-Policies, Ownership
Hook-Ressourcen gehören nicht zum Release,
helm uninstall räumt sie nicht ab.
helm.sh/hook-delete-policy:
before-hook-creation (Default),
hook-succeeded, hook-failed.
apiVersion: batch/v1
kind: Job
metadata:
name: "{{ .Release.Name }}-db-migrate"
annotations:
"helm.sh/hook": pre-install,pre-upgrade
"helm.sh/hook-weight": "-5"
"helm.sh/hook-delete-policy": before-hook-creation,hook-succeeded
spec:
backoffLimit: 0
template:
spec:
restartPolicy: Never
containers:
- name: migrate
image: registry.example.com/shop/migrate:2.8.1
Chart-Tests
Tests sind Hooks mit helm.sh/hook: test,
konventionell unter templates/tests/. Nach Deploy
ausführen: helm test <release>, der
Test-Pod muss erfolgreich terminieren (Smoke-Test gegen den
Service).
Dependencies
dependencies-Feld
Subcharts deklarativ in Chart.yaml;
helm dependency update löst Ranges auf,
lädt .tgz nach charts/ und schreibt
Chart.lock (dependency build baut
reproduzierbar aus dem Lock).
condition (z.B. redis.enabled)
schaltet Subcharts, tags bündeln mehrere,
alias instanziiert dasselbe Chart mehrfach.
dependencies:
- name: redis
version: "21.x.x"
repository: oci://registry.example.com/charts
condition: redis.enabled
- name: postgresql
version: ">=16.0.0 <17.0.0"
repository: "@internal" # Alias aus 'helm repo add'
tags: [datastores]
helm repo add internal https://charts.example.com helm dependency update ./shop # Ranges -> Chart.lock helm dependency build ./shop # exakt aus Chart.lock
OCI-Registries
Chart als OCI-Artefakt
helm push lädt das gepackte Chart in eine
OCI-Registry, Referenz mit oci://-Prefix,
ohne Chart-Namen und Tag (kommen aus
Chart.yaml). pull, install,
upgrade, show, template
akzeptieren oci:// + --version; Pinning
per Digest @sha256:.... Login in Helm 4 nur mit
Domain.
helm registry login registry.example.com helm package ./shop # -> shop-1.4.0.tgz helm push shop-1.4.0.tgz oci://registry.example.com/charts helm install shop \ oci://registry.example.com/charts/shop --version 1.4.0 # immutable per Digest: helm install shop \ oci://registry.example.com/charts/shop@sha256:<digest>
Lint, Template & Diff
Validierungs-Pipeline
helm lint --strict: statische Chart-Prüfung.
helm template: Offline-Rendering, in CI gegen
Schema-Validatoren wie kubeconform pipen.
helm install --dry-run=server: rendert mit
Cluster-Zugriff (lookup funktioniert), ohne zu
installieren. --dry-run gibt gerenderte Secrets
unmaskiert aus (nur base64), in CI-Logs --hide-secret
setzen.
helm diff upgrade (Plugin): zeigt den
Manifest-Diff gegen den Live-Stand vor dem Upgrade.
Helm 4 prüft Plugin-Signaturen (.prov) per
Default, Git-URLs sind nicht prüfbar: darum das signierte
Release-.tgz installieren,
--verify=false nur als bewusste Ausnahme.
helm lint ./shop --strict helm template shop ./shop -f values-prod.yaml \ | kubeconform -strict -summary helm install shop ./shop --dry-run=server curl -sL https://github.com/databus23.gpg | gpg --import REL=https://github.com/databus23/helm-diff/releases helm plugin install \ $REL/latest/download/helm-diff-linux-amd64.tgz helm diff upgrade shop ./shop -f values-prod.yaml
Provenance & Signing
Signieren, Verifizieren
helm package --sign erzeugt neben dem
.tgz eine Provenance-Datei .tgz.prov
(PGP-signiert; Secret Key als Export,
gpg --export-secret-keys). Zum Prüfen liest Helm
ab 4.3 auch pubring.kbx und ASCII-armored
Keyrings.
Prüfung: helm verify chart.tgz bzw.
Installation mit --verify, die
.prov muss neben dem Chart abrufbar sein.
gpg --export-secret-keys > ~/.gnupg/secring.gpg helm package --sign --key 'release@example.com' \ --keyring ~/.gnupg/secring.gpg ./shop helm verify shop-1.4.0.tgz helm install shop shop-1.4.0.tgz --verify
Anti-Patterns
Was du nicht tun solltest
Chart-Version wiederverwenden: gleiche
version neu pushen bricht Caches und SemVer-basierte
GitOps-Ranges, pro Änderung bumpen.
Klartext-Secrets in values.yaml im Git: SOPS/helm-secrets, External Secrets oder CI-Injection nutzen.
kubectl edit am Release vorbei: Bei
SSA-Releases bricht danach jedes Upgrade mit Field-Conflict ab,
solange der Chart für das editierte Feld einen anderen Wert
setzt; --force-conflicts holt die Felder
zurück. Änderungen über values fahren.
CRDs als Templates: crds/ wird
nur bei der Installation angelegt, nie geupgradet
oder gelöscht, CRD-Lifecycle separat managen.
App-Logik in Hooks: Hook-Ressourcen gehören nicht zum Release, kein Cleanup bei uninstall, delete-policy setzen, Jobs idempotent bauen.
Upgrade ohne Diff/Dry-Run in Prod:
helm diff bzw. --dry-run=server
gehören vor jedes produktive Upgrade.
--wait ohne watch-RBAC (Helm 4):
kstatus braucht list und watch, sonst
bricht jede Wait-Operation ab, auch die implizite von
--rollback-on-failure.
Verwandte Cheatsheets
Ebenfalls von OMNI52:
kubernetes-cheatsheet.de, Kubernetes Core
flux-cheatsheet.de, GitOps mit Flux
argocd-cheatsheet.de, GitOps mit Argo CD
kubectl-cheatsheet.de, kubectl Power-Usage
Lizenz & Weiterverteilung
Nicht erlaubt: Logo, Marken oder den Eindruck zu vermitteln, dass der Inhalt von dir/euch stammt oder dass OMNI52 GmbH die Weiterverwendung sponsort.
Volltext der Lizenz: creativecommons.org/licenses/by-sa/4.0/deed.de.
Helm and Kubernetes are registered trademarks of The Linux Foundation in the United States and other countries. Helm is a Cloud Native Computing Foundation (CNCF) graduated project. OMNI52™ is a trademark of OMNI52 GmbH (filed, not yet registered). This website is operated by OMNI52 GmbH and is not affiliated with, endorsed by, or sponsored by The Linux Foundation or the CNCF. “Helm” is used in a nominative / descriptive sense to indicate the technology this cheatsheet documents.