Helm commands: install, upgrade, rollback
Команд в helm много, но в практике CKAD и SRE-работе крутятся одни и те же десять. Цель этого урока — пройти полный жизненный цикл релиза: добавить repository, найти chart, установить, обновить, откатить, просмотреть state, удалить. Плюс параллельно покажем дебаг-команды (helm template, helm get), которые экономят часы при разборе чужих чартов.
Реестры образов: Docker Hub, GHCR, ECR, Harbor
Repository: где жить chart-ам
Прежде чем установить chart, нужно его найти. Это либо локальный путь (./mychart), либо chart из repository (bitnami/nginx), либо OCI-реестр (oci://registry-1.docker.io/bitnamicharts/nginx).
# Добавить repository (URL — это HTTP-сервер с index.yaml)
helm repo add bitnami https://charts.bitnami.com/bitnami
helm repo add prometheus-community https://prometheus-community.github.io/helm-charts
helm repo add grafana https://grafana.github.io/helm-charts
# Посмотреть список добавленных repos
helm repo list
# Обновить локальные индексы (обязательно перед install после долгого перерыва)
helm repo update
# Удалить repo
helm repo remove bitnami
Поиск:
# По имени chart-а
helm search repo nginx
# NAME CHART VERSION APP VERSION DESCRIPTION
# bitnami/nginx 15.4.4 1.25.3 NGINX HTTP server
# Все версии (default — только последняя)
helm search repo nginx --versions
# По описанию (full-text)
helm search repo "ingress controller"
# В Artifact Hub (без локального repo add, прямо через API hub-а)
helm search hub wordpress
OCI registries с 2022 — стандарт для хранения charts. Bitnami, AWS ECR, GitHub Container Registry, Docker Hub — все поддерживают. Команда меняется: helm install web oci://registry-1.docker.io/bitnamicharts/nginx --version 15.4.4. Преимущества: один и тот же registry для images и charts, IAM-интеграция, signing через cosign.
helm install: создаём релиз
Базовый паттерн:
helm install <RELEASE_NAME> <CHART> [flags]
Примеры с растущей сложностью:
# Минимум
helm install web bitnami/nginx
# С namespace и автосозданием (без --create-namespace выдаст error если ns нет)
helm install web bitnami/nginx \
--namespace web \
--create-namespace
# Конкретная версия chart (без этого — latest, что в проде плохо)
helm install web bitnami/nginx \
--version 15.4.4 \
--namespace web --create-namespace
# Override через --set (быстро, для простых значений)
helm install web bitnami/nginx \
--set replicaCount=3 \
--set image.tag=1.25 \
--set service.type=NodePort
# Override через values-файл (для complex)
helm install web bitnami/nginx \
-f production-values.yaml \
--namespace web --create-namespace
# Комбинация: -f + --set (--set имеет priority)
helm install web bitnami/nginx \
-f base-values.yaml \
-f environment-overrides.yaml \
--set image.tag=$(git rev-parse --short HEAD)
# Generate-name (Helm сам придумает имя)
helm install bitnami/nginx --generate-name
# NAME: nginx-1715600000
Полезные флаги:
--dry-run— рендерит и валидирует, но не применяет. Идеально для CI.--debug— печатает rendered manifests перед apply.--wait— блокирует CLI до момента, когда все resources в Ready. Удобно для CI/CD.--timeout 5m— таймаут для--wait.--atomic— если install fails, автоматически делает rollback (для CI).
# Production CI pattern
helm install web bitnami/nginx \
--version 15.4.4 \
--namespace web --create-namespace \
-f production-values.yaml \
--atomic --wait --timeout 5m
Priority переопределения values
Когда один и тот же ключ задан в нескольких местах — кто побеждает? Порядок (от низшего к высшему priority):
values.yamlв Chart-е (defaults).-fфайлы в порядке указания (последний overrides предыдущие).--set— flat key path с CLI.--set-file— значение из файла (для длинных строк, certs).--set-string— принудительно string (без auto-detection типа).
helm install web ./mychart \
-f base.yaml \
-f prod.yaml \
--set image.tag=v1.2.3
В этом примере: base.yaml даёт fundament, prod.yaml перетирает env-specific keys, --set image.tag перетирает image.tag с того, что был в base или prod.
--set парсит значение по типу: --set replicaCount=3 → integer 3, --set version=1.2.3 → string “1.2.3” (точки в строке — это not int). Но --set version=1.25 парсится как float 1.25. Если нужна строка “1.25” — используй --set-string version=1.25 или --set version="1.25".
helm list: что у меня в кластере
# В текущем namespace
helm list
# Конкретный namespace
helm list -n web
# Все namespaces
helm list -A
# Фильтры
helm list --filter '^web' # regex по имени
helm list --pending --failed # только в этих статусах
helm list --deployed # только успешные
# Включая удалённые с --keep-history
helm list --uninstalled
Output:
NAME NAMESPACE REVISION UPDATED STATUS CHART APP VERSION
web web 3 2026-05-13 10:00:00 deployed nginx-15.4.4 1.25.3
REVISION=3 — это третья ревизия. Каждый upgrade инкрементирует. STATUS бывает: deployed, failed, pending-install, pending-upgrade, pending-rollback, uninstalled (если был --keep-history).
helm upgrade: обновляем релиз
upgrade создаёт новую ревизию release-а. По дефолту он сбрасывает все предыдущие values и применяет дефолты chart-а + текущие -f / --set. Это часто confusing — поэтому два важных флага:
# По умолчанию: --reset-values неявно если новый chart версии
# Возьмёт values.yaml из нового chart + указанные сейчас -f и --set
helm upgrade web bitnami/nginx --version 15.5.0
# --reuse-values: взять прошлые финальные values, +new flags
helm upgrade web bitnami/nginx --version 15.5.0 --reuse-values
# --reset-values: явно сказать "забудь старые values, начни с chart defaults"
helm upgrade web bitnami/nginx --version 15.5.0 --reset-values
# Только поменять values, не chart
helm upgrade web bitnami/nginx --reuse-values --set replicaCount=5
# Обычный install-если-нет-релиза, upgrade-если-есть (для CI)
helm upgrade --install web bitnami/nginx \
-f values.yaml \
--namespace web --create-namespace
Defaults для Helm 3:
- По умолчанию
helm upgradeиспользует chart defaults + только те values, которые переданы через-f/--setв этом запуске. Старые values предыдущего release не сохраняются автоматически. Это значит: если при install указал 20 параметров через--set, а на upgrade передал только--set image.tag=v2— остальные 19 откатятся к chart defaults. --reuse-values— явно сохранить values из текущего release; новые-f/--setмерджатся поверх. Полезно для точечного обновления без передачи полного values.yaml.--reset-values— явно сбросить все user-values до chart defaults; считать только новые-f/--set.
helm upgrade без -f и без --reuse-values — частый способ выстрелить в ногу: все custom values, что задавались при install, забудутся. Промышленная практика — хранить values.yaml в git (рядом с chart-ом) и всегда передавать -f values.yaml при upgrade. Тогда поведение детерминированное вне зависимости от --reuse-values/--reset-values.
helm history & helm rollback
После нескольких upgrade-ов:
helm history web -n web
# REVISION UPDATED STATUS CHART APP VERSION DESCRIPTION
# 1 Mon May 12 10:00:00 superseded nginx-15.4.4 1.25.3 Install complete
# 2 Mon May 12 12:00:00 superseded nginx-15.4.5 1.25.3 Upgrade complete
# 3 Mon May 12 15:00:00 deployed nginx-15.5.0 1.26.0 Upgrade complete
Откат:
# На конкретную ревизию
helm rollback web 2 -n web
# На предыдущую (без указания номера)
helm rollback web -n web
# Сухой запуск
helm rollback web 2 --dry-run
# С wait и timeout (CI-friendly)
helm rollback web 2 --wait --timeout 3m
После rollback в history появляется новая запись:
# REVISION UPDATED STATUS ...
# 1 Mon May 12 10:00:00 superseded ...
# 2 Mon May 12 12:00:00 superseded ...
# 3 Mon May 12 15:00:00 superseded ...
# 4 Mon May 12 16:00:00 deployed ... Rollback to 2
Revision 4 — это новая deployed-ревизия со state из revision 2. Helm всегда forward-only — rollback это новая ревизия.
helm uninstall: удаляем релиз
# Базовое
helm uninstall web -n web
# С --keep-history (статус uninstalled, можно rollback)
helm uninstall web --keep-history -n web
# Сухой прогон без реального удаления
helm uninstall web --dry-run -n web
Что происходит:
- Helm читает Release Secret последней ревизии.
- Через
app.kubernetes.io/managed-by=Helmlabel и ownership tracking находит все K8s resources. - Удаляет их через apiserver.
- Удаляет Release Secrets (если не
--keep-history). - CRDs из
crds/директории НЕ удаляются — по дизайну. - PersistentVolumeClaims часто не удаляются — зависит от Chart-а (некоторые chart-ы используют annotation
helm.sh/resource-policy: keep).
PVC + PV — самая частая проблема при helm uninstall. Bitnami charts (Redis, PostgreSQL) часто оставляют PVC с данными (через helm.sh/resource-policy: keep), чтобы не потерять state случайно. После uninstall нужно вручную kubectl delete pvc -l app.kubernetes.io/instance=web если хочешь полную очистку.
helm template: render без apply
Самая полезная debug-команда:
# Render и вывести в stdout все templates с подставленными values
helm template web bitnami/nginx \
--version 15.4.4 \
-f production-values.yaml
# Только конкретный template
helm template web bitnami/nginx --show-only templates/deployment.yaml
# С namespace-контекстом
helm template web bitnami/nginx --namespace web
# Для CI: render и apply через kubectl (GitOps-style)
helm template web bitnami/nginx -f values.yaml | kubectl apply -f -
Использования:
- Debug: что именно Helm применит? Особенно полезно для conditional logic в templates.
- GitOps: ArgoCD/Flux часто рендерят helm через
helm templateи применяют — без хранения Release Secrets, source of truth — git. - Linting:
helm template ./mychart | kubevalилиkubeconform— валидация рендеренных манифестов против K8s schemas. - CI: проверить, что ничего не изменилось между чартами —
helm template old > old.yaml; helm template new > new.yaml; diff.
helm get: инспекция текущего state
После install/upgrade — что у нас в кластере?
# Values, которые сейчас активны для release
helm get values web -n web
# С computed defaults
helm get values web -n web --all
# Rendered manifests (то, что в кластере)
helm get manifest web -n web
# Notes (то, что вывелось после install)
helm get notes web -n web
# Все hooks
helm get hooks web -n web
# Полная инфа (values + manifest + hooks + notes)
helm get all web -n web
helm get manifest особенно полезен для understanding “что Helm считает текущим state”. Это то, что он будет diff-ить при следующем upgrade.
helm diff: ваш friend (плагин)
Это плагин, не часть core Helm, но используется повсеместно:
helm plugin install https://github.com/databus23/helm-diff
# Что изменится при upgrade?
helm diff upgrade web ./mychart -f values.yaml
# Что изменится при rollback?
helm diff rollback web 2
Это buy-in для production: всегда смотреть diff перед apply.
CKAD-частый паттерн
На экзамене типичная задача:
# Дано: chart на диске или указан repo
helm install web ./mychart -f values.yaml --namespace dev --create-namespace
# Verify
kubectl get all -n dev -l app.kubernetes.io/instance=web
helm list -n dev
helm status web -n dev
Часто задание требует --set для конкретного values:
helm install api ./mychart \
--set image.tag=v2.0.0 \
--set replicaCount=5 \
-n production --create-namespace
Killer-моменты
helm upgradeбез--reuse-valuesсбрасывает values при смене chart версии. Все custom values забудутся, если их нет в-fфайле.--atomicнужно в CI — иначе failed install / upgrade оставляет broken release, который мешает следующему upgrade.helm uninstallне удаляет CRDs из директории crds/. И часто оставляет PVC сhelm.sh/resource-policy: keep.helm rollback— это forward-only ревизия. После rollback в history появляется новая запись (revision N+1) со state из target revision.--set image.tag=1.25→ float 1.25 (не string). Если важна точность строки —--set-stringили quote:--set image.tag="1.25".helm upgrade --install— идемпотентный flow для CI. Install if not exists, upgrade if exists.