Развернуть приложение в K8s — это 5–10 YAML-файлов: Deployment, Service, Ingress, ConfigMap, Secret, HPA… Для каждого окружения (dev/staging/prod) файлы чуть разные. Helm решает эту проблему.
Что такое Helm и Chart
Helm — пакетный менеджер для Kubernetes. Как apt для Ubuntu или pip для Python.
Chart — пакет Helm. Содержит набор YAML-шаблонов с переменными и файл values.yaml со значениями по умолчанию. Одним helm install разворачивает всё приложение.
Release — установленный экземпляр Chart. Можно установить один Chart несколько раз с разными именами и значениями.
Chart (шаблон) → helm install → Release (запущенное приложение)
Установка Helm
# macOS
brew install helm
# Проверка
helm version
# version.BuildInfo{Version:"v3.14.0", ...}
helm install, upgrade, rollback, uninstall
Поиск и установка Chart
# Добавить репозиторий
helm repo add bitnami https://charts.bitnami.com/bitnami
helm repo update
# Поиск chart
helm search repo postgresql
# NAME CHART VERSION APP VERSION DESCRIPTION
# bitnami/postgresql 13.2.0 16.1.0 PostgreSQL chart
# Информация о chart
helm show values bitnami/postgresql | head -50
# Установка
helm install my-postgres bitnami/postgresql \
--namespace database \
--create-namespace \
--set auth.postgresPassword=mysecretpassword \
--set primary.persistence.size=10Gi
# Список установленных releases
helm list -A
# NAME NAMESPACE REVISION STATUS CHART
# my-postgres database 1 deployed postgresql-13.2.0
Обновление
# Обновить values без смены версии chart
helm upgrade my-postgres bitnami/postgresql \
--namespace database \
--set auth.postgresPassword=newsecretpassword
# Обновить до новой версии chart
helm upgrade my-postgres bitnami/postgresql \
--namespace database \
--version 13.3.0
# Upgrade с откатом при ошибке
helm upgrade --install my-postgres bitnami/postgresql \
--atomic \
--timeout 5m
Откат и удаление
# История releases
helm history my-postgres -n database
# REVISION STATUS CHART DESCRIPTION
# 1 superseded postgresql-13.2.0 Install complete
# 2 deployed postgresql-13.2.0 Upgrade complete
# Откат на предыдущую ревизию
helm rollback my-postgres -n database
# Откат на конкретную ревизию
helm rollback my-postgres 1 -n database
# Удаление (данные PVC сохраняются)
helm uninstall my-postgres -n database
values.yaml для параметризации
Главная сила Helm — параметризация через values.yaml. Один Chart, разные конфиги для разных окружений.
# values.yaml (значения по умолчанию)
replicaCount: 1
image:
repository: my-app
tag: "1.0.0"
pullPolicy: IfNotPresent
service:
type: ClusterIP
port: 80
ingress:
enabled: false
host: ""
resources:
requests:
cpu: 100m
memory: 128Mi
limits:
cpu: 500m
memory: 256Mi
env:
LOG_LEVEL: info
DATABASE_HOST: postgres-service
# values-prod.yaml (переопределения для production)
replicaCount: 3
image:
tag: "1.5.2"
ingress:
enabled: true
host: api.example.com
resources:
requests:
cpu: 500m
memory: 512Mi
limits:
cpu: 2000m
memory: 1Gi
env:
LOG_LEVEL: warning
# Установка с файлом values для prod
helm install my-app ./my-chart \
-f values.yaml \
-f values-prod.yaml
# Или через --set для точечных изменений
helm install my-app ./my-chart \
-f values.yaml \
--set image.tag=1.5.3
Популярные Charts
# nginx Ingress Controller
helm repo add ingress-nginx https://kubernetes.github.io/ingress-nginx
helm install ingress-nginx ingress-nginx/ingress-nginx \
--namespace ingress-nginx --create-namespace
# cert-manager (TLS-сертификаты)
helm repo add jetstack https://charts.jetstack.io
helm install cert-manager jetstack/cert-manager \
--namespace cert-manager --create-namespace \
--set installCRDs=true
# Prometheus + Grafana (мониторинг)
helm repo add prometheus-community https://prometheus-community.github.io/helm-charts
helm install kube-prometheus prometheus-community/kube-prometheus-stack \
--namespace monitoring --create-namespace
Создание своего Chart
# Создать структуру chart
helm create my-app
my-app/
├── Chart.yaml # метаданные chart
├── values.yaml # значения по умолчанию
├── charts/ # зависимости (sub-charts)
└── templates/ # шаблоны YAML
├── deployment.yaml
├── service.yaml
├── ingress.yaml
├── _helpers.tpl # вспомогательные шаблоны
└── NOTES.txt # сообщение после установки
# Chart.yaml
apiVersion: v2
name: my-app
description: A Helm chart for my application
type: application
version: 0.1.0 # версия chart
appVersion: "1.0.0" # версия приложения
# templates/deployment.yaml
apiVersion: apps/v1
kind: Deployment
metadata:
name: {{ include "my-app.fullname" . }}
labels:
{{- include "my-app.labels" . | nindent 4 }}
spec:
replicas: {{ .Values.replicaCount }}
selector:
matchLabels:
{{- include "my-app.selectorLabels" . | nindent 6 }}
template:
metadata:
labels:
{{- include "my-app.selectorLabels" . | nindent 8 }}
spec:
containers:
- name: {{ .Chart.Name }}
image: "{{ .Values.image.repository }}:{{ .Values.image.tag }}"
imagePullPolicy: {{ .Values.image.pullPolicy }}
ports:
- containerPort: {{ .Values.service.port }}
resources:
{{- toYaml .Values.resources | nindent 12 }}
# Проверить шаблон перед установкой (dry-run)
helm template my-app ./my-app -f values-prod.yaml
# Установить с lint-проверкой
helm lint ./my-app
helm install my-app ./my-app --dry-run
# Реальная установка
helm install my-app ./my-app -f values-prod.yaml
💬 Комментарии (0)
Комментариев пока нет
Станьте первым, кто поделится мнением об этой статье!