Вышел первый за шесть лет мажорный релиз Helm — v4. В статье разберём ключевые изменения: Server-Side Apply вместо 3-Way Merge, реализацию поддержки WASM-плагинов, замену движка ожидания готовности ресурсов и content-based-кеширование чартов. Посмотрим, какие проблемы по-прежнему остаются с Helm и предложим для них решение.
Server-Side Apply вместо 3-Way Merge
Server-Side Apply (SSA) — это механизм обновления ресурсов, добавленный в Kubernetes 1.14. Использование SSA вместо 3-Way Merge (3WM) позволяет избежать некорректных обновлений ресурсов, которые иногда происходят при использовании Helm.
Helm не умеет определять, какие ресурсы были обновлены в предыдущем релизе, а какие нет. Из-за этого 3WM может, например, не удалить исчезнувшее в чарте поле.
SSA решает подобные проблемы за счёт того, что Helm’у больше не нужно вычислять патчи для обновления ресурса. Он просто отправляет манифест целиком в Kubernetes API, где Kubernetes сам вычисляет и применяет патчи.
Для активации SSA используйте флаг --server-side=true:
helm upgrade --server-side=true ...
Флаг --force-conflicts позволит автоматически разрешать конфликты при SSA, всегда предпочитая отрендеренную версию манифеста. По умолчанию этот режим выключен, так что рекомендуем его включить.
Пользуясь случаем, бесстыдно отметим: в нашей утилите Nelm SSA реализован уже несколько лет и отлично работает. А встроенный nelm release plan, в отличие от helm-diff, умеет работать через SSA.
WASM-плагины
В Helm 4 реализована поддержка WASM-плагинов в дополнение к существующим плагинам Helm 3. Для пользователей от этого мало что изменится, а вот разработчики плагинов получат более мощный API.
Плагины могут быть трёх типов — cli, postrenderer и getter:
cli-плагины работают аналогично плагинам Helm 3. Запускается реализующая плагин команда, и ей передаются аргументы командной строки из Helm;
postrenderer-плагины запускаются сразу после шаблонизации манифестов. Принимают на вход отшаблонизированные манифесты и их же должны вернуть. Могут использоваться, например, для патчинга ресурсов перед их выкатом;
getter-плагины запускаются при загрузке чартов или сабчартов. Принимают на вход URI и настройки соединения, возвращают бинарные данные. Могут использоваться для реализации загрузки чартов через, например, Git или S3.
Нормальной документации по WASM-плагинам пока нет, но чуть больше деталей можно найти в HIP.
kstatus для ожидания готовности ресурсов
Helm 3 имел несколько простых проверок готовности для Deployment, StatufulSet, Service и ещё некоторых ресурсов. Эти проверки активировались флагом --wait, и релиз не завершался, пока ресурсы не придут в готовность.
Поскольку отслеживание ресурсов при выкате никогда не было фокусом Helm, замена их движка отслеживания на kstatus в новом релизе ожидаема. Для пользователей меняется только то, что ожидание готовности ресурсов станет чуть точнее.
Включить ожидание готовности через kstatus для всех ресурсов, а не только для хуков, можно флагом --wait=watcher:
helm upgrade --wait=watcher ...
Заметим, что в Nelm мы ещё и эвристически определяем готовность кастомных ресурсов, отображаем текущие статусы ресурсов, ошибки, логи и ивенты прямо при выкате, а также много чего другого.
Как это выглядит в Nelm

Content-based-кеширование чартов
В Helm 3 кеширование скачиваемых чартов происходило по их имени и версии. Однако этого было недостаточно для уникальной идентификации чартов, из-за чего Helm не доверял своему же кешу, и чарты постоянно перекачивались.
В Helm 4 чарты уникально идентифицируются по хеш-сумме их содержимого, что позволяет всегда брать чарты из кеша. OCI-чарты, традиционно, позитивно дискриминированы — для них новый кеш не работает.
Другие «важные» изменения
Добавлены функции шаблонов
mustToYamlиmustToJson.OCI-чарты можно устанавливать по их digest’у.
Postrenderer теперь работает и для хуков.
Helm SDK сделали немного удобнее в использовании.
В values.yaml теперь может быть несколько yaml’ов, разделённых
---.Новая
apiVersion: v3для Chart.yaml. При указании v3 пропадает поддержка requirements.yaml и requirements.lock. Пока всё.Улучшена валидация, добавлена пара никому не нужных флагов, пара нужных переименованы, пара случайных удалены.
В итоге
Бо́льшая часть изменений в Helm — это избавление от технического долга: замена 3-Way Merge на Server-Side Apply, замена самописного отслеживания на kstatus, рефакторинг postrenderer’ов и legacy-плагинов.
Для конечного пользователя значимо только избавление от проблем с 3-Way Merge. В остальном по-прежнему нет нормального управления CRD, для задания порядка выката или обновления immutable-ресурсов приходится выкатывать полчарта хуками, а многолетние баги, для обхода которых пишут отдельные плагины, мигрируют из версии в версию. К слову, всё перечисленное решено в Nelm.
Неплохую сводку по всем изменениям в Helm 4 можно найти в Major Changes Summary, а ещё более подробную — в полном changelog.