Helm: пакетный менеджер для K8s

Helm — пакетный менеджер для Kubernetes: позволяет устанавливать, обновлять и откатывать приложения в кластере через chart (пакет шаблонов Kubernetes-манифестов).

Зачем нужно

Kubernetes-манифесты для реального приложения — десятки YAML-файлов с повторяющимися значениями. Helm заменяет их параметризованными шаблонами. Нужен PostgreSQL? helm install postgres bitnami/postgresql — и готово. Нужно откатить версию? helm rollback myapp 1. Это также стандартный способ распространения сложных приложений (ingress-nginx, cert-manager, Prometheus).

Где используется

  • Установка готовых chart-ов: ingress-nginx, cert-manager, PostgreSQL, Redis
  • Деплой собственного приложения в Kubernetes через chart
  • GitOps: Helm chart в Git, обновление через CI/CD

Основной контент

Установка и базовые команды

# Установка Helm
curl https://raw.githubusercontent.com/helm/helm/main/scripts/get-helm-3 | bash

# Добавить репозиторий
helm repo add bitnami https://charts.bitnami.com/bitnami
helm repo add ingress-nginx https://kubernetes.github.io/ingress-nginx
helm repo update

# Найти chart
helm search repo postgresql

# Установить PostgreSQL
helm install my-postgres bitnami/postgresql \
  --namespace databases \
  --create-namespace \
  --set auth.postgresPassword=mysecret \
  --set primary.persistence.size=10Gi

# Список установленных релизов
helm list -A

# Обновить релиз
helm upgrade my-postgres bitnami/postgresql --set auth.postgresPassword=newpass

# Откат
helm rollback my-postgres 1

# Удалить
helm uninstall my-postgres -n databases

Создание собственного chart

helm create myapp

Структура:

myapp/
├── Chart.yaml          # метаданные chart
├── values.yaml         # значения по умолчанию
└── templates/
    ├── deployment.yaml
    ├── service.yaml
    ├── ingress.yaml
    └── _helpers.tpl    # переиспользуемые шаблоны
# values.yaml
image:
  repository: myuser/myapp
  tag: latest
  pullPolicy: IfNotPresent

replicaCount: 2

service:
  type: ClusterIP
  port: 3000

ingress:
  enabled: true
  host: myapp.example.com
# templates/deployment.yaml
apiVersion: apps/v1
kind: Deployment
metadata:
  name: {{ include "myapp.fullname" . }}
spec:
  replicas: {{ .Values.replicaCount }}
  selector:
    matchLabels:
      app: {{ include "myapp.name" . }}
  template:
    spec:
      containers:
        - name: {{ .Chart.Name }}
          image: "{{ .Values.image.repository }}:{{ .Values.image.tag }}"
          ports:
            - containerPort: {{ .Values.service.port }}

Деплой с кастомными значениями

# Установить с values-файлом
helm install myapp ./myapp -f values-production.yaml

# Или переопределить конкретное значение
helm upgrade myapp ./myapp \
  --set image.tag=abc123 \
  --set replicaCount=3

# Проверить шаблоны перед деплоем
helm template myapp ./myapp -f values-production.yaml
helm lint ./myapp

Частые ошибки

  • Хранить секреты в values.yaml в Git — использовать Helm Secrets плагин или External Secrets
  • Не проверять helm lint и helm template перед деплоем — синтаксические ошибки видны только в кластере
  • Устанавливать bitnami chart с дефолтными паролями — обязательно указывать auth.*Password

Связанные темы

Ресурсы