Helm
| Тип | пакетный менеджер Kubernetes |
|---|---|
| Авторы | Deis (2015), затем совместно с Google |
| Язык | Go |
| Лицензия | Apache 2.0 |
| Статус в CNCF | выпускник (graduated, апрель 2020) |
| Ключевые версии | Helm 2 (2016, сервер Tiller), Helm 3 (ноябрь 2019, без Tiller), Helm 4 (ноябрь 2025) |
| Шаблоны | Go templates + библиотека Sprig |
| Каталог чартов | Artifact Hub |
Helm — пакетный менеджер для Kubernetes. Приложение в кластере — это обычно десяток манифестов: Deployment, Service, Ingress, ConfigMap, Secret, права доступа. Helm собирает их в чарт (chart) — пакет с шаблонами и настройками по умолчанию — и позволяет одной командой установить, обновить или откатить всё приложение целиком.[1] Его часто сравнивают с apt или Homebrew (см. пакетные менеджеры): helm install для кластера — то же, что apt install для сервера.
История
Helm создала компания Deis и представила в 2015 году; вскоре проект объединился с похожей разработкой Google и вошёл в экосистему Kubernetes. Helm 2 (2016) состоял из клиента и серверного компонента Tiller, который работал в кластере с широкими правами и считался серьёзной проблемой безопасности. Helm 3 (ноябрь 2019) убрал Tiller: клиент обращается к API напрямую с правами пользователя, а данные о релизах хранит в Secret'ах того же пространства имён.[5] В 2020 году Helm получил статус выпускника CNCF.[6] В ноябре 2025 года вышел Helm 4 с новой системой плагинов и переходом на server-side apply.
Основные понятия
- Чарт — каталог (или архив
.tgz) с шаблонами манифестов и метаданными. - Values — параметры, подставляемые в шаблоны: значения по умолчанию лежат в
values.yaml, пользователь переопределяет их своими файлами или флагами--set. - Релиз — установленный экземпляр чарта с именем; один чарт можно установить много раз (
redis-cache,redis-sessions). - Ревизия — номер версии релиза; каждое
upgradeсоздаёт новую, к любой можно откатиться. - Репозиторий — место, откуда скачивают чарты: HTTP-сервер с файлом
index.yamlили OCI-реестр.
Структура чарта
mychart/
├── Chart.yaml # имя, версия чарта, appVersion, зависимости
├── values.yaml # параметры по умолчанию
├── values.schema.json # необязательная JSON-схема для проверки values
├── templates/
│ ├── deployment.yaml
│ ├── service.yaml
│ ├── _helpers.tpl # общие именованные шаблоны
│ └── NOTES.txt # подсказка, выводимая после установки
└── charts/ # зависимости (подчарты)
Шаблоны написаны на языке Go templates с библиотекой функций Sprig:[3]
apiVersion: apps/v1
kind: Deployment
metadata:
name: {{ include "mychart.fullname" . }}
spec:
replicas: {{ .Values.replicaCount }}
template:
spec:
containers:
- name: app
image: "{{ .Values.image.repository }}:{{ .Values.image.tag | default .Chart.AppVersion }}"
{{- with .Values.resources }}
resources:
{{- toYaml . | nindent 12 }}
{{- end }}
В Chart.yaml различают version — версию самого чарта по правилам SemVer — и appVersion — версию упакованного приложения.[2]
Работа с Helm
helm repo add bitnami https://charts.bitnami.com/bitnami
helm search repo postgresql
helm show values bitnami/postgresql > pg-values.yaml # что можно настроить
helm install pg bitnami/postgresql -n db --create-namespace -f pg-values.yaml
helm upgrade --install web ./mychart -f values-prod.yaml --set image.tag=1.5.0 --atomic
helm list -A
helm history web
helm rollback web 3
helm template web ./mychart -f values-prod.yaml # отрендерить манифесты без установки
helm lint ./mychart
helm uninstall web
upgrade --install — идемпотентная команда, удобная в CI/CD: установит релиз, если его нет, и обновит, если есть. Флаг --atomic откатывает изменения при неудачном обновлении.
С версии 3.8 чарты хранятся в OCI-реестрах наравне с образами контейнеров: helm push mychart-0.1.0.tgz oci://ghcr.io/example/charts.[4] Готовые чарты для популярных систем ищут в каталоге Artifact Hub.
Достоинства и критика
Helm стал стандартом распространения приложений для Kubernetes: почти у каждого серверного продукта есть официальный чарт. Однако у подхода есть известные недостатки:
- шаблонизация YAML как текста — с ручными отступами (
nindent) — хрупка и плохо читается; - большие чарты обрастают сотнями параметров и становятся сложнее самих манифестов;
helm upgradeне замечает ручных изменений объектов в кластере.
Поэтому Helm сочетают или заменяют другими инструментами: Kustomize (наложения без шаблонов, встроен в kubectl), Helmfile (декларативный список релизов), GitOps-контроллеры Argo CD и Flux, которые умеют разворачивать Helm-чарты из Git, а также языки конфигурации вроде CUE и Jsonnet. Сравнение подходов к декларативному описанию инфраструктуры — в статье Infrastructure as Code.