Modul 8 — Orchestrace: Kubernetes

39. Helm — správa balíčků pro Kubernetes

Jak Helm zjednodušuje nasazování a verzování komplexních Kubernetes aplikací pomocí balíčků zvaných charts.

Odhadovaná délka studia: 55 minut · Stav: nehotovo

Technologie: Helm

Úvod a kontext

Reálná aplikace v Kubernetes se zřídka skládá jen z jednoho Deploymentu.
Typicky potřebujete Deployment, Service, ConfigMap, Secret, Ingress,
možná ještě HorizontalPodAutoscaler — a to jen pro jednu komponentu.
Když má systém deset takových komponent a existuje ve třech prostředích
(dev, staging, produkce), ruční údržba desítek YAML souborů se rychle
stává neúnosnou: co když potřebujete stejnou sadu manifestů nasadit
podruhé s jinými hodnotami (jiný název, jiný počet replik, jiná verze
image)? Kopírovat a ručně upravovat YAML soubory je chybové a
neopakovatelné. Helm řeší přesně tento problém — je to balíčkovací
manažer pro Kubernetes, obdoba apt nebo npm, ale pro sady
Kubernetes manifestů.

Teorie

Co je Helm chart

Chart je balíček Helm — adresářová struktura obsahující šablony
Kubernetes manifestů a metadata o balíčku. Chart lze nainstalovat do
clusteru jako pojmenovanou release (instanci chartu s konkrétními
hodnotami), více releases stejného chartu může běžet vedle sebe (např.
app-dev a app-staging).

Typická struktura chartu:

mychart/
├── Chart.yaml          # metadata: název, verze chartu, verze aplikace
├── values.yaml         # výchozí konfigurační hodnoty
├── templates/          # Kubernetes manifesty jako šablony (Go templates)
│   ├── deployment.yaml
│   ├── service.yaml
│   ├── ingress.yaml
│   └── _helpers.tpl    # pomocné šablonovací funkce/makra
└── charts/             # vnořené (závislé) charts

Šablonování — od statického YAML k parametrizaci

Soubory v templates/ nejsou čisté YAML, ale Go šablony, do kterých se
vkládají hodnoty z values.yaml (nebo z příkazové řádky). Místo napevno
zapsaného počtu replik nebo image tagu se použije proměnná:

# templates/deployment.yaml
apiVersion: apps/v1
kind: Deployment
metadata:
  name: {{ .Release.Name }}-web
spec:
  replicas: {{ .Values.replicaCount }}
  selector:
    matchLabels:
      app: {{ .Release.Name }}
  template:
    metadata:
      labels:
        app: {{ .Release.Name }}
    spec:
      containers:
        - name: web
          image: "{{ .Values.image.repository }}:{{ .Values.image.tag }}"
          ports:
            - containerPort: {{ .Values.service.port }}
# values.yaml — výchozí hodnoty
replicaCount: 2
image:
  repository: myregistry.example.com/web
  tag: "1.4.0"
service:
  port: 8080

.Release.Name je vestavěná proměnná Helm (jméno konkrétní instalace),
.Values.* čerpá z values.yaml, případně z hodnot předaných na
příkazové řádce, které mají přednost.

Základní příkazy

  • helm repo add / helm repo update — přidání a aktualizace registru
    charts (repository).
  • helm search repo — hledání dostupných charts.
  • helm install <release-name> <chart> — instalace nové release.
  • helm upgrade <release-name> <chart> — aktualizace existující release
    (nová verze chartu nebo nové hodnoty), s automatickým rolling
    update podkladových zdrojů.
  • helm rollback <release-name> <revision> — návrat na předchozí
    revizi, pokud upgrade způsobil problém.
  • helm uninstall <release-name> — odstranění release a všech jejích
    zdrojů z clusteru.
  • helm list — přehled nainstalovaných releases.

Helm si u každé release drží historii revizí, takže rollback je
rychlá a bezpečná operace bez nutnosti ručně dohledávat starý YAML.

Přepisování hodnot

Výchozí values.yaml lze přepsat vlastním souborem nebo přímo na
příkazové řádce, což je základ pro rozlišení prostředí (dev/staging/
produkce) při použití stejného chartu:

# values-produkce.yaml obsahuje jen to, co se liší od výchozích hodnot
helm install web-prod ./mychart -f values-produkce.yaml \
  --set replicaCount=5 \
  --set image.tag=1.4.0

Praktický příklad

# vytvoření kostry nového chartu
helm create mychart

# nasazení do clusteru pod jménem "demo"
helm install demo ./mychart --set replicaCount=3

# ověření stavu release
helm list
# NAME  NAMESPACE  REVISION  STATUS    CHART        APP VERSION
# demo  default    1         deployed  mychart-0.1.0 1.16.0

kubectl get deployment demo-web
# demo-web   3/3     3            3           30s

# aktualizace na novou verzi image
helm upgrade demo ./mychart --set image.tag=1.5.0

# pokud nová verze způsobí problém, návrat zpět
helm rollback demo 1

# úplné odstranění release
helm uninstall demo

Shrnutí

Helm balí sadu souvisejících Kubernetes manifestů do znovupoužitelného
chartu s parametrizovanými šablonami a výchozími hodnotami v
values.yaml. Instalace chartu vytvoří pojmenovanou release, kterou
lze aktualizovat (upgrade), vrátit zpět (rollback) nebo odstranit
(uninstall) jako jeden celek, místo ručního spravování desítek
jednotlivých YAML souborů. To výrazně zjednodušuje nasazování stejné
aplikace do více prostředí s odlišnou konfigurací.

Kontrolní otázky

  1. Jaký problém řeší Helm oproti ručnímu spravování sady YAML manifestů?
  2. Jaký je rozdíl mezi chartem a release?
  3. K čemu slouží values.yaml a jak lze jeho hodnoty přepsat při
    instalaci?
  4. Mini cvičení: spusťte helm create testapp, prohlédněte si
    vygenerovanou strukturu adresářů a v values.yaml změňte
    replicaCount na 1 — poté chart nainstalujte příkazem helm install
    a ověřte kubectl get pods, že běží právě jeden Pod.

Lekce na sebe nejsou zamčené — libovolnou lekci můžete otevřít i označit jako hotovou v jakémkoliv pořadí.