Helm: управление приложениями в Kubernetes
Helm — это менеджер пакетов для Kubernetes, который упрощает развёртывание и управление приложениями. Представьте его как apt или yum для K8s. С помощью Helm вы можете упаковать сложное приложение из десятков манифестов в один чарт, управлять версиями и легко развёртывать приложения в разных окружениях с разными конфигурациями.
Установка
Helm устанавливается как обычный бинарный файл. После установки вы получите доступ к команде helm в терминале.
# macOS
brew install helm
# Linux
curl https://raw.githubusercontent.com/helm/helm/main/scripts/get-helm-3 | bash
# Windows
winget install Helm.Helm
После установки проверьте версию:
helm version
Основные понятия
Helm оперирует двумя ключевыми понятиями: Chart и Release. Понимание разницы между ними критически важно для эффективной работы.
Chart
Chart — это пакет Kubernetes-ресурсов. Содержит:
Chart.yaml— метаинформацияvalues.yaml— значения по умолчаниюtemplates/— шаблоны манифестовcharts/— зависимости
Chart можно сравнить с пакетом в apt или npm — это описание приложения со всеми зависимостями.
Release
Release — это экземпляр чарта, запущенный в кластере.
Один и тот же чарт может быть установлен несколько раз с разными параметрами, создавая несколько Release. Например, чарт nginx можно установить как nginx-dev, nginx-staging и nginx-prod с разными конфигурациями.
Структура чарта
mychart/
├── Chart.yaml # Метаданные чарта
├── values.yaml # Значения по умолчанию
├── values.schema.json # JSON Schema для валидации
├── templates/ # Шаблоны манифестов
│ ├── deployment.yaml
│ ├── service.yaml
│ └── _helpers.tpl # Вспомогательные шаблоны
└── charts/ # Зависимости
Создание своего чарта
Команда helm create генерирует базовую структуру чарта с примерами шаблонов. Это отличная отправная точка для изучения.
helm create mychart
После создания вы получите готовую структуру с примерами deployment, service и ingress. Изучите сгенерированные файлы, чтобы понять синтаксис шаблонов.
Chart.yaml
Файл Chart.yaml содержит метаданные чарта. Это обязательный файл для любого чарта.
apiVersion: v2
name: mychart
description: My Kubernetes application
type: application
version: 1.0.0
appVersion: "1.0"
Поле version — это версия чарта (по семверу), а appVersion — версия приложения внутри чарта.
values.yaml
Файл values.yaml содержит значения по умолчанию. Пользователи могут переопределять их при установке.
replicaCount: 3
image:
repository: nginx
pullPolicy: IfNotPresent
tag: "latest"
Использование values.yaml позволяет устанавливать один чарт с разными конфигурациями без изменения шаблонов.
Ниже показан полный пример values.yaml с настройками сервиса, ingress и ресурсов:
service:
type: ClusterIP
port: 80
ingress:
enabled: true
hosts:
- host: myapp.local
paths:
- path: /
pathType: Prefix
resources:
limits:
cpu: 500m
memory: 128Mi
requests:
cpu: 250m
memory: 64Mi
templates/deployment.yaml
apiVersion: apps/v1
kind: Deployment
metadata:
name: {{ .Release.Name }}
labels:
app: {{ .Chart.Name }}
version: {{ .Chart.Version }}
spec:
replicas: {{ .Values.replicaCount }}
selector:
matchLabels:
app: {{ .Chart.Name }}
template:
metadata:
labels:
app: {{ .Chart.Name }}
spec:
containers:
- name: {{ .Chart.Name }}
image: "{{ .Values.image.repository }}:{{ .Values.image.tag }}"
imagePullPolicy: {{ .Values.image.pullPolicy }}
ports:
- name: http
containerPort: {{ .Values.service.port }}
resources:
{{- toYaml .Values.resources | nindent 10 }}
Использование Helm
Установка чарта
# Из локальной директории
helm install my-release ./mychart
# Из репозитория
helm install my-release bitnami/nginx
# С переопределением значений
helm install my-release ./mychart --set replicaCount=5
# С custom values file
helm install my-release ./mychart -f values-prod.yaml
Обновление
helm upgrade my-release ./mychart --set image.tag=v2.0.0
Откат
# Посмотреть историю
helm history my-release
# Откатить к предыдущей версии
helm rollback my-release
# Откатить к конкретной версии
helm rollback my-release 2
Удаление
helm uninstall my-release
Встроенные функции шаблонизации
Функции Go template
# Доступ к значениям
{{ .Values.key }}
{{ .Values.nested.key }}
# Функции
{{ .Values.image | default "nginx:latest" }}
{{ .Values.name | upper }}
{{ .Values.replicas | toJson }}
# Логика
{{- if .Values.ingress.enabled }}
...
{{- end }}
{{- if eq .Values.environment "production" }}
...
{{- end }}
# Циклы
{{- range .Values.ingress.hosts }}
- host: {{ .host }}
{{- end }}
Функции Sprig
# Математика
{{ add 1 2 }} # 3
{{ mul 2 3 }} # 6
{{ div 10 2 }} # 5
# Работа со строками
{{ "hello" | upper }} # HELLO
{{ "HELLO" | lower }} # hello
{{ "hello" | title }} # Hello
{{ "foo" | quote }} # "foo"
# Работа с датами
{{ now | date "2006-01-02" }}
Хуки
apiVersion: v1
kind: ConfigMap
metadata:
name: {{ .Release.Name }}-config
annotations:
"helm.sh/hook": pre-install,pre-upgrade
"helm.sh/hook-delete-policy": before-hook-creation
data:
key: value
Репозитории
# Добавить репозиторий
helm repo add bitnami https://charts.bitnami.com/bitnami
# Обновить
helm repo update
# Поиск
helm search repo nginx
helm search hub wordpress
# Скачать чарт
helm pull bitnami/wordpress --untar
Продвинутые техники
Library Charts
# Chart.yaml
apiVersion: v2
name: mylib
type: library
dependent charts
# Chart.yaml
dependencies:
- name: postgresql
version: "12.x.x"
repository: "https://charts.bitnami.com/bitnami"
condition: postgresql.enabled
Тестирование
# Валидация чарта
helm lint ./mychart
# Проверка рендеринга
helm template my-release ./mychart
# Тесты (test-hook)
helm test my-release
Практические примеры
Многоenvironment
# values-dev.yaml
replicaCount: 1
resources:
limits:
cpu: 250m
memory: 128Mi
# values-prod.yaml
replicaCount: 5
resources:
limits:
cpu: 2000m
4Gi
# Установка
helm install myapp ./mychart -f values-dev.yaml
helm upgrade myapp ./mychart -f values-prod.yaml
Заключение
Helm — незаменимый инструмент для работы с Kubernetes. Он превращает набор манифестов в переиспользуемые пакеты с версионированием, шаблонизацией и удобным управлением.