Хелм и Helmfile отличные инструменты для автоматизации развертывания Kubernetes. Однако у них есть некоторые тонкости, которые иногда трудно понимать и могут привести к катастрофическим проблемам. Одним из них является разница между Helmfile Sync.
и Helmfile Применить
, вопрос поднял много раз, например, в Stackoverflow Отказ
Бег хелффиль -h
Объяснение этих двух команд:
Синхронизация
→ Синхронизация всех ресурсов из файла состояния (REPOS, релизы и диаграммы DEPS) Применить
→ Применить все ресурсы из состояния файла только тогда, когда есть изменения
Но что это делает Среднее точно ? Каковы различия и подводные камни? Давайте погрузимся вместе, начиная с основы Helm 3 до Helmfile.
Примечание : Если вы знакомы с тем, как Helm 3 обновляют работу, вы можете пропустить непосредственно к последнему разделу.
Штаты Хелма
Первое, что нужно понять, это как шлем магазинов Штаты Отказ
Хелм генерирует Kubernetes, проявляется, чтобы применить к кластеру Kubernetes by «компиляция» шаблонов диаграммы против некоторых значений, которые могут прийти от графика Значения.yaml
или переопределение значений (определено в Helmfile, передается с использованием --et
опция CLI и т. Д.). Все эти информации вместе (график, ценности, опции) — это то, что мы позвоним Государство Отказ
Всякий раз, когда вы устанавливаете релиз, шлем хранит это состояние в секрете под названием (The V1
Suffix, являющийся Revision ):
sh.helm.release.v1.{RELEASE_NAME}.v1
Этот секрет просто сжатый, базовый, закодированный JSON, хранящийся в одном клавише — Выпуск
— Что содержит все необходимо реконструировать именно элемент HELM, и повторно применить его с помощью точно те же значения для восстановления выпуска.
Это может быть проверено, используя следующую команду (см. этот гид ):
kubectl get secret sh.helm.release.v1..v \ -o jsonpath='{.data.release}' | base64 -d | base64 -d | gzip -d
Содержание секрета Release Helm Если вы декодируете этот секрет, вы увидите JSON, которая содержит: Имя, пространство имен и версия выпуска Список всех файлов диаграмм (имя + Base64 Содержание всех файлов, исключая || Шаблоны/* ||, || Chart.yaml. || и || Значения.yaml || Несомненно Метаданные (содержание || Chart.yaml ||) Значения (содержание || statems.yaml ||) Шаблоны файлов (имя + base64 содержимое) config (переопределение значения через cmd или helmfile) Значения схемы (содержание || stase.schema.json ||) крючки Информация → Текущее состояние выпуска в Кубейнетах (например, «|| Установить полный ||»), Даты первого/последнего развертывания и т. Д. Фактические кабинеты Kubernetes (выход всех визуализированных шаблонов, на этот раз в простом тексте)
Когда вы обновляете релиз, новое состояние хранится в новом секрете, при этом версия увеличивается на новый ревизию:
sh.helm.release.v1.{RELEASE_NAME}.v{REVISION}
Как работает Helm 3 Upgrade/Rollback
Теперь давайте понять, как Helm решает, что делать во время модернизации.
⚠️ Каждый раз, когда вы запускаете Helm Обновление
или Helm Rollback
новая редакция (и секрет) всегда создается, независимо от того, есть ли изменения или нет .
Хелм 2 и двустороннее объединение
Вернуться в Хелм 2 Процесс обновления был простым и простым: Helm реконструировал Старое государство Декодируя секрет выпуска Хелма нынешней ревизии и сравнил его с Желаемое состояние создать разные патчи, чтобы применить. Это известно как Двухстороннее слияние :
old state → desired state
Желаемое состояние Может быть реконструирован из секрета релиз HELM (откат) или из новой версии таблицы + значения (обновление).
Важный момент в том, что Хелм 2 не взял живое состояние в учетную запись То есть то, что эффективно присутствует в кластере. Другими словами, если вы изменены вручную вручную (добавьте значение на конфигурацию Configmap или контейнер для Sidecar в развертывании), это изменение не было видно вообще Helm, а также можно оставить как есть, исчезнет или перезаписать В зависимости от руля старых/желаемых состояний.
Helm 3 и трехстороннее стратегическое слияние
Helm 3 Введен новый способ вычислительных исправлений, необходимых для обновлений и откатов, известных как трехстороннее стратегическое слияние . Статья Трехстороннее слияние: взгляд под капотом , дает хорошее объяснение того, что трехстороннее объединение средств (сильно используется в Git), а раздел Helm Doc Улучшена стратегия обновления: 3 пути Стратегические патчи слияния Сосредоточивается больше на том, что это значит в руле.
Но просто поставить, Helm 3 теперь берет живое состояние в учетную запись :
(old state → desired state) → (live state → desired state)
Правила — это значение +):
+
(Добавить) → Новые поля в Желаемое состояние нет в старое состояние добавляются (перезаписи любые живое государство )⌫
(Удалить) → Поля, существующие в Старое государство которые нет в Желаемое состояние удалены (даже если их значение изменилось в Live State )±
(перезаписать) → Поля в живое состояние которые также присутствуют в Желаемое состояние но разные значения обновлены (независимо от старое государство )∅
(игнорировать) → остаток остается без изменений (например, новые поля в стране оставаться)
Более того, патчи делают слияние Операции, означающие карты в глубоком объединении (VS полностью заменены). Это огромное улучшение от Helm 2. Среди прочего, это означает, что в Helm 3:
- Можно добавить контейнер для Sidecar в развертывание вручную или новую запись данных в конфигурации. Если им не удалось управлять рулем (без полей в сгенерированных проявлениях об этом), они останутся без изменений после обновления/отката;
- Если вы изменяете поля, управляемые Helm вручную, выполнение отката, эффективно сбросит поля к значениям HELM.
Простой пример Допустим, вы устанавливаете развертывание с помощью руля со следующими метками (манифест разделите для читабельности): Введите полноэкранный режим Выйдите из полноэкранного режима Теперь вы измените этикетки вручную на: Введите полноэкранный режим Выйдите из полноэкранного режима И, наконец, сделайте обновление HELM, с новыми значениями: Введите полноэкранный режим Выйдите из полноэкранного режима Результат будет: Введите полноэкранный режим Выйдите из полноэкранного режима
Helmfile: Sync VS подать заявление
Теперь, когда мы понимаем, как усилия Helm работают, давайте погрузимся в Helmfile Sync против применения.
Helmfile Sync
Команда будет Беги Helm Обновление
На всех выпусках Отказ Это означает, что все выпуски будут иметь их пересмотр на единицу. Тем не менее, поскольку Helm имеет трехстороннее стратегическое слияние, если между живым и желаемым состоянием нет изменений, ни один патч не будет применен: существует только новый секрет релиза Helm.
Helmfile Применить
Команда будет Беги Helm Upgrade
только когда есть изменения . Тем не менее, Чтобы обнаружить изменения Helmfile использует Helm-diff плагин , который вычисляет только разницу между Старый против Желаемое состояние ; Это не смотрит на живое состояние (похоже на Helm 2). Если что-то изменилось за пределами Helm, Helm-Diff вернется «Нет изменения» И выпуск не будет модернизирован.
Другими словами, Применить
Имеет преимущество не создавать бесполезные новые ревизии, но не гарантирует согласованность живое состояние , поскольку ручные изменения могут пойти незамеченными. Синхронизация
Точно наоборот: он всегда создает новые ревизии для все Выпускает, но обнаружит и отменит любую ручное изменение, которое произошло на управленных полам.
Синхронизация
или Применить
Таким образом, вплоть до компромисса, что облегчает, если вы решите никогда не менять ничего вручную. Если вы придерживаетесь этой лучшей практикой, Применить
всегда так, чтобы пойти.
Написано с ❤ по дерьма
Оригинал: «https://dev.to/derlin/helmfile-difference-between-sync-and-apply-helm-3-28o1»