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
Связанные темы
- _MOC DevOps
- Kubernetes -- основы и концепции
- Kubernetes -- Pods, Services, Deployments
- GitOps -- принципы