Robocikowo>ROBOCIKOWO
Infrastruktura

Helm — czym jest menedżer pakietów dla Kubernetes?

helm-czym-jest-menedzer-pakietow-dla-kubernetes-cover

Helm to menedżer pakietów dla Kubernetes — pakuje zestaw powiązanych zasobów klastra w jeden wersjonowany artefakt i zarządza jego cyklem życia. Warto go rozumieć, bo to jeden z fundamentów codziennego wdrażania aplikacji w Kubernetes.

Czym jest Helm?

Helm to menedżer pakietów dla Kubernetes: otwartoźródłowy system do automatycznego wdrażania i zarządzania aplikacjami działającymi w kontenerach. Jego zadaniem jest spakowanie zestawu powiązanych zasobów klastra (Deployment, Service, ConfigMap, Ingress i innych) w jeden, wersjonowany i dystrybuowalny artefakt zwany chartem, a następnie zainstalowanie go, zaktualizowanie i — w razie potrzeby — wycofanie w klastrze. Oficjalne repozytorium projektu na GitHubie opisuje go wprost: „Helm is a tool for managing Charts. Charts are packages of pre-configured Kubernetes resources", z porównaniem „think of it like apt/yum/homebrew for Kubernetes".

Ważne rozróżnienie na wstępie: Helm nie jest modelem AI ani platformą uczenia maszynowego. To narzędzie deweloperskie i infrastrukturalne — warstwa nad Kubernetes, która pełni trzy role naraz: menedżera pakietów (dystrybucja gotowych aplikacji), silnika szablonów (generowanie manifestów YAML: czytelny dla człowieka format zapisu danych i konfiguracji z parametrów) oraz menedżera wydań (śledzenie kolejnych wersji zainstalowanej aplikacji). Od wersji 3 Helm działa wyłącznie po stronie klienta — jako narzędzie wiersza poleceń (CLI), które komunikuje się bezpośrednio z API Kubernetes.

Kto za tym stoi?

Helm powstał w 2015 roku jako projekt firmy Deis („Helm Classic"), zaprezentowany na pierwszej konferencji KubeCon (historia projektu). W czerwcu 2018 roku dołączył do Cloud Native Computing Foundation (CNCF), a w kwietniu 2020 osiągnął status „graduated" — najwyższy poziom dojrzałości w fundacji (komunikat CNCF). Przełomem technicznym było wydanie Helm 3 w listopadzie 2019 roku, które usunęło serwerowy komponent Tiller i sprowadziło Helma z powrotem do roli narzędzia klienckiego. Dziś projekt utrzymuje społeczność, a wśród głównych opiekunów są osoby z Microsoftu, Samsung SDS i IBM (blog z ogłoszeniem Helm 3).

Jak to działa?

Sercem Helma jest silnik szablonów. Chart zawiera katalog templates/ z plikami, które nie są jeszcze gotowymi manifestami Kubernetes, lecz szablonami. Gdy Helm przetwarza chart, przepuszcza wszystkie pliki z tego katalogu przez silnik renderujący. Szablony pisze się w języku szablonów Go, rozszerzonym o około 50 dodatkowych funkcji z biblioteki Sprig oraz kilka funkcji specyficznych dla Helma — potwierdza to dokumentacja chartów.

Mechanika jest prosta w opisie: dyrektywy szablonu zamyka się w podwójnych nawiasach klamrowych {{ }}, a wewnątrz można odwoływać się do wartości konfiguracyjnych oraz do wbudowanych obiektów. Przykładowo {{ .Release.Name }} wstawia do manifestu nazwę bieżącego wydania — jak wyjaśnia przewodnik po szablonach. Wartości, którymi karmiony jest szablon, pochodzą z pliku values.yaml (wartości domyślne) oraz z parametrów podanych przy instalacji.

Efektem renderowania są kompletne manifesty YAML, które Helm wysyła do API Kubernetes. Każda instalacja tworzy wydanie (release) — nazwaną instancję charta działającą w klastrze. Ten sam chart można zainstalować w jednym klastrze wielokrotnie, a każda instalacja tworzy osobne wydanie z własną nazwą, co opisuje dokumentacja architektury. Kolejne operacje helm upgrade i helm rollback tworzą nowe rewizje tego samego wydania. Helm przechowuje historię tych rewizji, dzięki czemu przywrócenie poprzedniego stanu jest jedną komendą.

Od kodu aplikacji do działających Podów

Helm nie działa w próżni — jest jednym ogniwem łańcucha, który zaczyna się przy kodzie aplikacji, a kończy na uruchomionych kontenerach. Warto prześledzić ten przepływ krok po kroku, bo dobrze pokazuje, gdzie kończy się rola Docker: otwartoźródłowa platforma do pakowania aplikacji wraz z zależnościami w przenośne obrazy kontenerówa, a zaczyna rola Helma i Kubernetesa:

  1. Programista commituje zmianę w kodzie aplikacji.
  2. Pipeline CI buduje obraz Dockera i wypycha go do rejestru obrazów z konkretnym tagiem (np. numerem wersji albo skrótem commita).
  3. Chart Helma wskazuje ten obraz przez wartość w values.yaml (repozytorium + tag) — to zwykle jedyne miejsce, które trzeba zmienić, by wdrożyć nową wersję.
  4. Komenda helm upgrade --install renderuje szablony do manifestów i wysyła je do API Kubernetes.
  5. Kubernetes porównuje stan pożądany z aktualnym i tworzy lub aktualizuje obiekty Deployment, które uruchamiają nowe Pody: najmniejsze jednostki uruchomieniowe w Kubernetes — jeden lub kilka kontenerów działających razem.
  6. Jeśli nowa wersja się nie sprawdzi, jedno helm rollback przywraca poprzednią rewizję wydania.

Podział ról jest tu czytelny: Docker buduje obraz, Helm opisuje i wdraża to, co ma z tego obrazu powstać w klastrze, a Kubernetes utrzymuje pożądany stan. Helm sam nie buduje obrazów ani nie uruchamia kontenerów — spina gotowe klocki w jedno powtarzalne wdrożenie.

Helm w pipeline CI/CD

Największą wartością Helma w praktyce jest to, że jeden chart obsługuje wiele środowisk. Zamiast utrzymywać osobne komplety plików YAML dla dev, staging i produkcji, podmienia się tylko plik wartości (np. values-prod.yaml), a resztą zajmuje się szablon. Do tego dochodzi wersjonowanie wydań i atomowy rollback — i to właśnie te trzy rzeczy rozwiązują realny ból ręcznego zarządzania manifestami przy każdej zmianie.

W klasycznym pipelinie CI/CD (model push) wdrożenie sprowadza się do jednej komendy: po zbudowaniu obrazu pipeline wywołuje helm upgrade --install z wartościami właściwymi dla danego środowiska. Ten sam chart, inne values, przewidywalny wynik — bez ręcznego klejenia manifestów.

Alternatywą jest model pull, czyli GitOps: model pracy, w którym pożądany stan klastra jest opisany w repozytorium Git i automatycznie synchronizowany. Narzędzie ArgoCD natywnie obsługuje charty — renderuje je przez helm template i samo pilnuje, by stan klastra zgadzał się z tym, co opisano w repozytorium Git. Źródłem prawdy staje się Git, a nie ręcznie wpisywane komendy.

Z kolei Terraform pozwala potraktować chart jak element infrastruktury. Oficjalny provider helm instaluje i utrzymuje charty w klastrze w ramach tego samego opisu, który tworzy sam klaster, więc jednym terraform apply można postawić klaster i od razu wdrożyć na nim bazowe aplikacje.

WarstwaRola w cyklu wdrożenia
DockerBuduje obraz kontenera z kodu aplikacji
KubernetesUruchamia obrazy jako Pody i pilnuje ich pożądanego stanu
HelmPakuje, wersjonuje i wdraża manifesty; wycofuje nieudane wydania
ArgoCDSynchronizuje stan klastra z repozytorium Git (GitOps), renderując charty przez helm template
TerraformProvisioning infrastruktury; instaluje charty przez provider helm
Helm zajmuje warstwę wdrożenia aplikacji — nie zastępuje Dockera, Kubernetesa ani narzędzi GitOps/IaC, lecz się z nimi łączy.

Z jakich elementów się składa?

Chart ma ściśle określoną strukturę katalogów, opisaną w dokumentacji:

Plaintext
mychart/            # katalog charta
├── Chart.yaml      # metadane: nazwa, wersja, zależności
├── values.yaml     # domyślne wartości konfiguracji
├── templates/      # szablony → manifesty K8s      [zarezerwowany]
│   ├── deployment.yaml
│   ├── service.yaml
│   └── _helpers.tpl
├── charts/         # subcharty = zależności        [zarezerwowany]
│   └── postgresql/ # przykładowa zależność
└── crds/           # Custom Resource Definitions   [zarezerwowany]
  • Chart.yaml — obowiązkowy plik metadanych: nazwa, wersja charta, wersja aplikacji, zależności.
  • values.yaml — domyślne wartości konfiguracyjne, które użytkownik może nadpisać przy instalacji.
  • templates/ — szablony, które po połączeniu z wartościami dają poprawne manifesty Kubernetes.
  • charts/ — katalog na zależności, czyli tzw. subcharty (chart może zależeć od innych chartów, np. aplikacja od bazy danych).
  • crds/ — definicje zasobów niestandardowych (Custom Resource Definitions).

Katalogi templates/, charts/ i crds/ są zarezerwowane przez Helma. Poza pojedynczym chartem istnieją dwa elementy dystrybucji: repozytoria chartów (serwery HTTP z indeksem chartów) oraz — w nowszych wersjach — rejestry OCI: repozytoria zgodne ze standardem Open Container Initiative — tym samym, w którym przechowuje się obrazy kontenerów, które pozwalają przechowywać charty w tej samej infrastrukturze co obrazy kontenerów. Helm oferuje też mechanizm hooków — zwykłych manifestów Kubernetes oznaczonych specjalną adnotacją helm.sh/hook, które pozwalają wpiąć się w konkretne momenty cyklu życia wydania (np. wykonać kopię zapasową przed aktualizacją albo zadanie inicjujące przed startem aplikacji).

Czym różni się od innych rozwiązań?

Najczęstsze porównanie to Helm kontra Kustomize — różnice dobrze zestawia analiza w serwisie Baeldung, a projekty z typowaną konfiguracją, jak Timoni (oparty na języku CUE), pokazują alternatywne podejście. Poniżej najważniejsze rozwiązania obok Helma:

RozwiązanieNa czym polegaKiedy wygrywa
HelmSzablony Go + wartości z values.yamlParametryzacja, dystrybucja i wersjonowanie całych aplikacji
KustomizeNakładki (overlays) na czysty YAML, bez szablonówDrobne modyfikacje istniejących manifestów
kubectl applySurowe pliki YAMLNajprostsze, jednorazowe wdrożenia
Jsonnet / cdk8s / TimoniTypowana konfiguracjaOdporność na błędy typów
OperatoryCiągłe zarządzanie stanem w czasie działaniaAplikacje wymagające stałej automatyzacji
TerraformProvisioning infrastrukturyZarządzanie infrastrukturą (może wywoływać Helma)

Kustomize jest wbudowany w kubectl i bywa prostszy do drobnych zmian, a Operatory i Terraform rozwiązują inne problemy niż jednorazowe wdrożenie — dlatego częściej uzupełniają Helma, niż go zastępują.

Najważniejsze ograniczenia i wyzwania

Największa krytyka dotyczy modelu szablonowania tekstu: Helm operuje na ciągach znaków, a nie na typowanych strukturach, więc błąd w szablonie łatwo daje niepoprawny YAML wykryty dopiero przy renderowaniu. To właśnie ta słabość napędza projekty alternatywne pokroju Timoni.

Sekrety to pięta achillesowa Helma. Narzędzie samo z siebie nie szyfruje wrażliwych wartości — do bezpiecznego przechowywania haseł i kluczy trzeba dołożyć zewnętrzne narzędzia i wtyczki.

Kolejnym wyzwaniem jest złożoność przy skali: rozbudowane charty z wieloma subchartami i zagnieżdżonymi wartościami bywają trudne do utrzymania i debugowania. Helm oferuje wprawdzie helm lint i helm test oraz zbiór dobrych praktyk, ale testowanie logiki szablonów pozostaje pracochłonne. Warto też pamiętać, że część opisanych tu szczegółów (dokładne daty, mechanika rewizji) pochodzi z pierwszorzędnych źródeł projektu, lecz Helm szybko ewoluuje — przy wdrożeniu produkcyjnym zawsze warto sprawdzić bieżącą dokumentację.

Dlaczego to jest istotne?

Helm zajął w ekosystemie Kubernetes miejsce, które w systemach operacyjnych zajmują apt czy homebrew — stał się domyślnym sposobem dystrybucji i instalacji oprogramowania w klastrach. Jego znaczenie wynika nie tyle z technicznej elegancji (model szablonów tekstowych bywa krytykowany), ile z efektu sieciowego: skoro większość popularnych aplikacji publikowana jest jako charty, a narzędzia CI/CD i GitOps mówią „po helmowemu", znajomość Helma jest praktycznie warunkiem sprawnej pracy z Kubernetes.

Równie istotna jest lekcja, jaką niesie ewolucja projektu. Usunięcie serwerowego komponentu Tiller w Helm 3 pokazało, że upraszczanie architektury i przeniesienie kontroli uprawnień do standardowego mechanizmu Kubernetes (pliku kubeconfig: plik z danymi dostępowymi i uprawnieniami użytkownika do klastra Kubernetes) potrafią rozwiązać realne problemy bezpieczeństwa. Dla osoby uczącej się DevOps Helm jest więc podwójnie wartościowy: jako codzienne narzędzie i jako studium przypadku, jak dojrzewa projekt open source pod skrzydłami dużej fundacji.

Helm nie jest rozwiązaniem uniwersalnym — dla prostych przypadków wystarczy Kustomize lub czysty YAML, a zwolennicy typowanej konfiguracji sięgną po nowsze narzędzia. Pozostaje jednak najczęściej spotykanym menedżerem pakietów dla Kubernetes, a jego pojęcia — chart, wydanie, wartości, rewizja — stały się częścią wspólnego języka całego ekosystemu.

Źródła

  • Helm — oficjalna dokumentacja chartów — link
  • Helm — architektura i pojęcia (release) — link
  • Helm — historia projektu (Deis, Tiller) — link
  • Helm — blog: wydanie Helm 3 — link
  • CNCF — ogłoszenie o statusie „graduated" — link
  • GitHub — helm/helm (definicja narzędzia) — link
  • Argo CD — obsługa chartów Helm — link
  • HashiCorp — Terraform Helm provider — link
  • Baeldung — Helm vs Kustomize — link
Udostępnij to opracowanie