Перейти к содержанию
Learning Platform
Глоссарий Troubleshooting
Урок 18.02 · 22 мин
Средний
helm installhelm upgradehelm rollbackhelm templatevaluesrelease lifecycle

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
INFO

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):

  1. values.yaml в Chart-е (defaults).
  2. -f файлы в порядке указания (последний overrides предыдущие).
  3. --set — flat key path с CLI.
  4. --set-file — значение из файла (для длинных строк, certs).
  5. --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.

WARNING

--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.
DANGER

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 это новая ревизия.

Lifecycle ревизий: install → upgrade → rollback
v1: installhelm install web ./chart. Создан Release Secret sh.helm.release.v1.web.v1. Status: deployed. Все resources применены к кластеру.
v2: upgradehelm upgrade web ./chart с image.tag=v2. Новый Secret sh.helm.release.v1.web.v2. v1 меняет статус на superseded. K8s resources обновлены — Deployment получил новый image, rolling update.
v3: upgrade (broken)helm upgrade web ./chart с image.tag=v3-broken. Под не стартует (CrashLoopBackOff). Без --atomic и --wait Helm считает upgrade успешным — статус deployed, но реальные Pods broken. Это типичная gotcha.
rollback v2helm rollback web 2. Helm копирует rendered manifests из v2 в новый Secret v4 и применяет. v3 становится superseded. Pods откатываются на image v2 через обычный Deployment rollout.
historyhelm history web показывает все ревизии: v1 superseded, v2 superseded, v3 superseded, v4 deployed (Rollback to 2). max-history по умолчанию 10, контролируется --history-max при install/upgrade.
--keep-historyhelm uninstall web --keep-history оставит все Secrets, но release status = uninstalled. Resources в кластере удалены. helm list --uninstalled показывает. Можно потом helm rollback web 4 — Helm восстановит resources.

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

Что происходит:

  1. Helm читает Release Secret последней ревизии.
  2. Через app.kubernetes.io/managed-by=Helm label и ownership tracking находит все K8s resources.
  3. Удаляет их через apiserver.
  4. Удаляет Release Secrets (если не --keep-history).
  5. CRDs из crds/ директории НЕ удаляются — по дизайну.
  6. PersistentVolumeClaims часто не удаляются — зависит от Chart-а (некоторые chart-ы используют annotation helm.sh/resource-policy: keep).
WARNING

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.

Проверка знанийKnowledge check
Ты сделал helm install web ./mychart --set replicaCount=10. Через неделю — helm upgrade web ./mychart --version 2.0. Что случится с replicaCount?
ОтветAnswer
replicaCount сбросится на значение из chart defaults (вероятно 1 или 3), потому что при смене chart версии Helm по умолчанию использует --reset-values поведение. Custom value из install потеряется. Решения: (1) Указать --reuse-values при upgrade: helm upgrade web ./mychart --version 2.0 --reuse-values. (2) Передать -f с явным values.yaml где replicaCount=10. (3) Правильный CI pattern — хранить values.yaml в git и всегда передавать -f при каждой operation. Production rule: НИКОГДА не делать install/upgrade без -f файла, --set только для CI-injected переменных типа image.tag.
Проверка знанийKnowledge check
Что делает helm rollback web 2, и как это отражается в helm history?
ОтветAnswer
Helm берёт rendered manifests из revision 2 (из Release Secret sh.helm.release.v1.web.v2), создаёт новую ревизию (например v5) с этим state, применяет manifests через apiserver. K8s обновляет resources как при обычном upgrade (rolling update Deployments). В helm history появляется новая запись revision 5 со статусом deployed и description 'Rollback to 2'. Сам revision 2 не 'возвращается активным' — Helm forward-only. История становится: v1 superseded, v2 superseded, v3 superseded, v4 superseded, v5 deployed (Rollback to 2).
Проверка знанийKnowledge check
В чём разница между helm install --dry-run и helm template?
ОтветAnswer
--dry-run отправляет manifests на apiserver с ?dryRun=All — apiserver применяет admission controllers, validation, defaulting и возвращает results, но НЕ персистит. Это даёт server-side validation: namespace exists, RBAC проходит, conflicts с существующими resources детектятся. helm template — чисто клиентский render: подставляет values в Go templates, выводит final YAML, никакой коммуникации с apiserver нет. helm template работает без kubeconfig, --dry-run требует cluster connection. helm template для CI и debug, --dry-run — для pre-apply validation в кластере.
Проверка знанийKnowledge check
Pod в Deployment-е после helm upgrade web ./chart падает в CrashLoopBackOff. helm list показывает release web в статусе deployed. Почему статус deployed если Pods broken? Как сделать так, чтобы upgrade считался failed?
ОтветAnswer
По умолчанию Helm считает upgrade успешным сразу после успешного apply manifests на apiserver. Реальный health Pod-ов не проверяется. Чтобы Helm ждал readiness и считал upgrade failed при CrashLoopBackOff — нужны флаги: --wait (ждать пока все resources в Ready) и --timeout 5m (как долго ждать). С --atomic Helm дополнительно делает auto-rollback на failure. CI pattern: helm upgrade --install web ./chart --atomic --wait --timeout 5m. Тогда CrashLoopBackOff приведёт к timeout, atomic rollback на предыдущую ревизию, и pipeline зафейлится.
Проверка знанийKnowledge check
Команда helm install web bitnami/nginx --set image.tag=1.25 — image.tag пришёл как float 1.25, теряется ноль на конце (например 1.20 может стать 1.2). Как правильно?
ОтветAnswer
Проблема: --set парсит value по auto-detected type. 1.25 выглядит как float — становится float. В YAML это рендерится как 1.25, но docker registry ожидает строку 1.25. Часто более серьёзно: --set image.tag=2 даст integer 2, а нужно строку. Решения: (1) --set-string image.tag=1.25 — принудительно string. (2) Quote через shell escape (confusing). (3) Использовать -f с values.yaml где image.tag в quotes — самый надёжный. Production-rule: image tags ВСЕГДА через -f values.yaml как quoted strings.

Закончили урок?

Отметьте его как пройденный, чтобы отслеживать свой прогресс

Войдите чтобы оценить урок

Прогресс модуля
0 из 5