Helm Charts: пакетный менеджер для Kubernetes
Helm Charts: пакетный менеджер для Kubernetes
Деплоить приложение в Kubernetes вручную — писать десятки YAML-файлов, следить за их версиями, передавать коллегам через git с магическими комментариями. Helm решает эту проблему, превращая набор манифестов в переиспользуемый пакет с параметрами, историей релизов и возможностью отката. По сути, это apt или yum для вашего кластера.
Основные понятия
Chart — пакет Helm. Содержит шаблоны манифестов, значения по умолчанию (values.yaml) и метаданные (Chart.yaml).
Release — установленный экземпляр chart в кластере. Один chart можно установить несколько раз под разными именами.
Repository — каталог chart-ов. Публичные репозитории: Artifact Hub, Bitnami. Приватные — можно поднять через Harbor или Chartmuseum.
Установка и первые шаги
# Установка Helm (Linux)
curl https://raw.githubusercontent.com/helm/helm/main/scripts/get-helm-3 | bash
# Добавить репозиторий
helm repo add bitnami https://charts.bitnami.com/bitnami
helm repo update
# Установить nginx
helm install my-nginx bitnami/nginx
# Список релизов
helm list
Структура chart
my-app/
├── Chart.yaml # метаданные: name, version, appVersion
├── values.yaml # значения по умолчанию
├── templates/
│ ├── deployment.yaml
│ ├── service.yaml
│ ├── ingress.yaml
│ └── _helpers.tpl # переиспользуемые шаблонные функции
└── charts/ # зависимости (sub-charts)
Шаблонизация
Helm использует Go templates. Переменные из values.yaml доступны через .Values:
# templates/deployment.yaml
spec:
replicas: {{ .Values.replicaCount }}
template:
spec:
containers:
- name: {{ .Chart.Name }}
image: "{{ .Values.image.repository }}:{{ .Values.image.tag }}"
resources:
limits:
memory: {{ .Values.resources.limits.memory }}
Переопределить значения при установке:
helm install my-app ./my-app
--set replicaCount=3
--set image.tag=v2.1.0
-f custom-values.yaml
Управление релизами
# Обновить релиз
helm upgrade my-app ./my-app -f prod-values.yaml
# История релизов
helm history my-app
# Откат к предыдущей версии
helm rollback my-app 2
# Удалить релиз
helm uninstall my-app
Откат работает мгновенно — Helm хранит историю релизов в секретах Kubernetes (по умолчанию последние 10).
Хуки
Helm hooks позволяют выполнять задачи в определённые моменты жизненного цикла: перед установкой, после обновления, перед удалением. Типичный пример — миграция базы данных перед деплоем:
apiVersion: batch/v1
kind: Job
metadata:
annotations:
"helm.sh/hook": pre-upgrade
"helm.sh/hook-weight": "-5"
Зависимости
Если ваше приложение требует PostgreSQL или Redis, не нужно управлять ими отдельно. Опишите зависимости в Chart.yaml:
dependencies:
- name: postgresql
version: "12.x.x"
repository: https://charts.bitnami.com/bitnami
condition: postgresql.enabled
Затем: helm dependency update ./my-app.
Helm в CI/CD
В GitLab CI типичный деплой через Helm выглядит так:
deploy:
stage: deploy
script:
- helm upgrade --install my-app ./chart
--namespace production
--set image.tag=$CI_COMMIT_SHORT_SHA
--atomic
--timeout 5m
Флаг --atomic гарантирует, что при ошибке релиз автоматически откатится — очень полезно в продакшне.
Helm — не серебряная пуля, и сложные chart-ы с запутанной шаблонизацией сложно читать и отлаживать. Но как стандарт упаковки и деплоя приложений в Kubernetes он давно победил, и знать его обязан каждый, кто работает с k8s.
Флаг --atomic реально спас нас несколько раз, когда деплой падал на этапе readiness probe — релиз сам откатывался и кластер оставался в рабочем состоянии.