Kubernetes YAML manifesty jsou mocné, ale spravovat desítky souborů pro každé prostředí je noční můra. Helm je „package manager pro Kubernetes” — balí manifesty do znovupoužitelných chartů s parametrizací. Helm 2.x je v roce 2018 de facto standard pro Kubernetes deployment.
Proč Helm¶
Představte si typickou aplikaci: Deployment, Service, ConfigMap, Secret, Ingress, HorizontalPodAutoscaler. To je 6 YAML souborů. Pro 3 prostředí (dev, staging, prod) s drobnými odlišnostmi to je 18 souborů. S Helmem máte jeden chart a 3 values soubory.
- Parametrizace — jeden template, různé hodnoty per prostředí
- Versioning — každý release má verzi, můžete rollbackovat
- Dependencies — chart může záviset na jiných chartech (PostgreSQL, Redis)
- Ekosystém — stable/ a incubator/ repozitáře s hotovými charty pro Prometheus, Grafana, nginx-ingress, cert-manager
Anatomie Helm chartu¶
myapp/
├── Chart.yaml # Metadata chartu (name, version, description)
├── values.yaml # Default hodnoty
├── templates/
│ ├── deployment.yaml
│ ├── service.yaml
│ ├── ingress.yaml
│ ├── configmap.yaml
│ ├── _helpers.tpl # Reusable template snippety
│ └── NOTES.txt # Post-install instrukce
├── charts/ # Sub-charty (dependencies)
└── requirements.yaml # Deklarace závislostí
Templates a values¶
Helm používá Go template engine. Hodnoty z values.yaml se interpolují do templateů:
# values.yaml
replicaCount: 3
image:
repository: registry.company.com/myapp
tag: "1.4.2"
pullPolicy: IfNotPresent
resources:
limits:
cpu: 500m
memory: 256Mi
requests:
cpu: 100m
memory: 128Mi
ingress:
enabled: true
host: api.company.com
# templates/deployment.yaml
apiVersion: apps/v1
kind: Deployment
metadata:
name: {{ include "myapp.fullname" . }}
labels:
{{- include "myapp.labels" . | nindent 4 }}
spec:
replicas: {{ .Values.replicaCount }}
selector:
matchLabels:
{{- include "myapp.selectorLabels" . | nindent 6 }}
template:
metadata:
labels:
{{- include "myapp.selectorLabels" . | nindent 8 }}
spec:
containers:
- name: {{ .Chart.Name }}
image: "{{ .Values.image.repository }}:{{ .Values.image.tag }}"
imagePullPolicy: {{ .Values.image.pullPolicy }}
resources:
{{- toYaml .Values.resources | nindent 12 }}
Práce s Helmem¶
# Instalace chartu
$ helm install myapp ./myapp -f values-prod.yaml
# Upgrade s novými hodnotami
$ helm upgrade myapp ./myapp --set image.tag=1.4.3
# Rollback na předchozí verzi
$ helm rollback myapp 1
# Historie releasů
$ helm history myapp
REVISION UPDATED STATUS DESCRIPTION
1 Mon Oct 15 10:00:00 2018 SUPERSEDED Install complete
2 Tue Oct 16 14:30:00 2018 SUPERSEDED Upgrade complete
3 Wed Oct 17 09:00:00 2018 DEPLOYED Rollback to 1
# Debug — vyrenderovat templates bez instalace
$ helm template myapp ./myapp -f values-staging.yaml
Dependencies — skládání chartů¶
Vaše aplikace potřebuje PostgreSQL a Redis? Nemusíte je definovat ručně:
# requirements.yaml
dependencies:
- name: postgresql
version: "3.18.3"
repository: "https://charts.helm.sh/stable"
condition: postgresql.enabled
- name: redis
version: "5.1.3"
repository: "https://charts.helm.sh/stable"
condition: redis.enabled
Příkaz helm dependency update stáhne sub-charty do charts/ adresáře. Hodnoty pro dependencies konfigurujete v hlavním values.yaml:
# values.yaml
postgresql:
enabled: true
postgresqlPassword: "secret"
persistence:
size: 10Gi
redis:
enabled: true
cluster:
enabled: false
Helm v CI/CD pipeline¶
Helm se výborně integruje do CI/CD pipeline:
- Lint:
helm lint ./myapp— validace syntaxe a best practices - Dry-run:
helm upgrade --install --dry-run— simulace bez skutečného deploymentu - Diff: helm-diff plugin ukáže, co se změní oproti aktuálnímu stavu
- Automated rollback:
helm upgrade --atomic --timeout 5m— automatický rollback pokud deployment selže
Tiller — bezpečnostní problém Helm 2¶
Helm 2 používá server-side komponentu Tiller, která běží v clusteru s cluster-admin právy. To je bezpečnostní riziko — kdokoliv s přístupem k Tiller API může deployovat cokoliv kamkoliv.
Mitigace:
- Tiller per namespace s omezenými RBAC právy
--tiller-namespaceflag pro izolaci- TLS mezi Helm klientem a Tillerem
Dobrou zprávou je, že Helm 3 (aktuálně v alpha) Tiller kompletně odstraňuje. Release informace se ukládají jako Kubernetes Secrets. Očekáváme stabilní release v roce 2019.
Best practices¶
- Sémantické verzování — Chart.yaml version dodržuje semver (MAJOR.MINOR.PATCH)
- Immutable tags — nepoužívejte
:latestv produkci, vždy konkrétní tag - Resource limits — vždy definujte CPU/memory requests a limits
- NOTES.txt — po instalaci zobrazí užitečné informace (URL, credentials)
- Helm test —
helm test myappspustí testovací pody (smoke tests) - Chart repository — ChartMuseum nebo GitHub Pages pro hostování vlastních chartů
Helm je essential tool pro Kubernetes¶
Bez Helmu je správa Kubernetes manifestů pro reálné aplikace neúnosná. Helm Charts přinášejí parametrizaci, verzování, dependencies a ekosystém hotových řešení. Začněte s helm create, přidejte vlastní templates a integrujte do CI/CD. A sledujte Helm 3 — odstranění Tilleru bude game changer.