Вышел первый за шесть лет мажорный релиз 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.

Комментарии (0)