Helm

Что это такое

Helm упаковывает набор манифестов Kubernetes в чарт: версионированный пакет с шаблонами и файлом значений. Установка чарта рендерит шаблоны с этими значениями и отправляет результат в кластер, а запись о релизе связывает установленные объекты с версией чарта, которая их создала. Это менеджер пакетов для платформы, в которой самого понятия пакета нет.

Почему это важно

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

Ключевые идеи

Чарт — это параметризованный набор манифестов

Шаблоны — это манифесты с подстановками, а значения — файл, который их заполняет. Единица переиспользования — чарт, а единица различия между средами — один файл значений на среду. Держать это различие маленьким и читаемым — то, что делает продвижение по средам проверяемым изменением.

chart/  templates/deployment.yaml   values.yaml             (значения по умолчанию)
        templates/service.yaml      values.production.yaml  (переопределения)

Релиз — это установленный экземпляр с историей

Установка чарта создаёт релиз: именованный экземпляр с историей ревизий. Обновление порождает новую ревизию, а откат возвращает к предыдущей, заново отправляя её отрендеренные манифесты. История — это ответ на вопрос «что на самом деле развёрнуто», который иначе на удивление трудно получить по всему кластеру.

Значения объединяются, и порядок объединения полон сюрпризов

Сначала значения по умолчанию из чарта, затем из родительского чарта, затем из файлов пользователя и переопределений в командной строке. Поскольку объединение местами поверхностное, а приоритет легко забыть, значение, которое как будто игнорируется, обычно переопределено где-то раньше в цепочке. Вывести отрендеренные манифесты — способ это выяснить.

helm template ./chart -f values.production.yaml   -> отрендеренный манифест, кластер не нужен

У хуков и обновлений есть порядок

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

Чарт должен быть маленьким и скучным

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

Практика

Упакуйте один сервис в чарт

Возьмите манифесты deployment и service сервиса и превратите их в чарт с файлом значений для тега образа, числа реплик и запросов ресурсов.

Готово, когда: helm template рендерит корректные манифесты для двух разных сред из одного чарта, и различается только файл значений.

Откатите релиз

Установите чарт, обновите его с изменённым значением и откатитесь к предыдущей ревизии.

Готово, когда: объекты в кластере снова соответствуют предыдущей ревизии, и вы можете показать запись в истории релиза, которая зафиксировала изменение.

Частые ошибки

  • Оставлять различия сред разбросанными по шаблонам — файл значений перестаёт быть записью о том, что различается; исправить: держите каждое различие в файле значений.
  • Никогда не рендерить перед установкой — объединённый результат обнаруживается только в кластере; исправить: сначала проверьте отрендеренные манифесты.
  • Позволять чарту обрастать условиями под несколько приложений — он становится нетестируемым языком конфигурации; исправить: разделите чарты или вынесите изменчивость в приложение.
  • Игнорировать состояние релиза после неудачного обновления — следующая операция ведёт себя неожиданно; исправить: осознанно разрешите неудачный релиз, прежде чем продолжать.
  • Использовать значения по умолчанию в продакшене без проверки — число реплик и запросы ресурсов, годившиеся для демо, применяются как есть; исправить: задавайте значимые значения явно для каждой среды.

Что читать дальше

  • Kubernetes (06-cloud-devops/14-kubernetes) — объекты, которые рендерят эти шаблоны, поэтому читайте первым.
  • OpenShift (06-cloud-devops/20-openshift) — дистрибутив, который опирается на эту упаковку в большей части своей экосистемы.
  • CI/CD (06-cloud-devops/08-ci-cd) — как чарт тестируется и выпускается в составе конвейера.