Серверное оборудование для бизнеса — надёжные решения для любых задач Подробнее →
Статья

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.

2 Ответа

  1. Флаг --atomic реально спас нас несколько раз, когда деплой падал на этапе readiness probe — релиз сам откатывался и кластер оставался в рабочем состоянии.

  1. Спасибо за раздел про хуки, не знал что так можно делать миграции базы. Буду пробовать на нашем стейджинге.