Helm — Примеры

Пример 1 — Значение, которое как будто игнорируется

Релиз продвигают в продакшен, передавая сначала файл значений среды, а затем собственный файл значений чарта. Deployment поднимается с одной репликой, хотя продакшену нужны четыре. Файлы и команда приведены ниже. Исправьте команду и покажите доказательство, которое разрешает вопрос об объединении.

# values.yaml            — значения по умолчанию чарта, применяются первыми
replicaCount: 1
# values.production.yaml — переопределения среды
replicaCount: 4
# использованная команда: install ./chart -f values.production.yaml -f values.yaml

Решение

$ helm template ./chart -f values.production.yaml
#   replicas: 4
# values.yaml чарта уже нижний слой, поэтому повторная передача переопределяет продакшен;
# среди файлов -f побеждает последний, а переопределения из командной строки сильнее всех

Чарт — это параметризованный набор манифестов, а файл среды — запись о том, что различается, поэтому у объединения есть один задуманный победитель, и команда его перевернула. Рендеринг без кластера печатает объединённый результат — единственный надёжный способ разобраться с приоритетом. Обычная ошибка — править шаблоны или добавлять ещё одно переопределение вместо того, чтобы напечатать, что на самом деле дало объединение.

Пример 2 — Обновление, остановившееся на середине

Обновление выполнило хук миграции базы данных, а затем упало, когда новая версия не захотела запускаться. Следующее обновление ведёт себя неожиданно, и кто-то предлагает установить чарт заново под другим именем релиза. Прочитайте историю и восстановитесь, не потеряв запись.

$ helm history shop
REVISION  STATUS    DESCRIPTION
6         deployed  Upgrade complete
7         failed    Upgrade complete

$ helm upgrade shop ./chart
Error: the release is in a failed state

Решение

$ helm rollback shop 6
Rollback to revision 6 complete

$ helm upgrade shop ./chart -f values.production.yaml
Upgrade complete

$ helm history shop
6   superseded
7   failed
8   deployed

Хуки ставят миграцию перед новой версией, и обновление, упавшее между ними, оставляет релиз, которому нужно осознанное восстановление. Откат заново отправляет отрендеренные манифесты предыдущей ревизии, поэтому кластер возвращается к состоянию, которое описывает история, а запись сохраняет и сбой, и восстановление. Установка под новым именем спрятала бы неудачный релиз и оставила бы его объекты на месте. Обычная ошибка — выполнить следующую команду поверх неудачного релиза, а потом отлаживать непонятный результат.