В чем разница между app version и chart version в Helm?
Комментарии (1)
Ответ сгенерирован нейросетью и может содержать ошибки
Разница между App Version и Chart Version в Helm
В Helm, Chart Version и App Version — это два отдельных, но взаимосвязанных понятия, которые играют разные роли в управлении жизненным циклом приложений. Понимание их различий критически важно для корректного управления зависимостями, версионированием и развертываниями в Kubernetes.
Chart Version (Версия Чарта)
Chart Version — это версия самого Helm-чарта, то есть версия упаковки или шаблона развертывания. Она указывается в файле Chart.yaml в поле version. Эта версия следует семантическому версионированию (SemVer) и увеличивается при любых изменениях в самом чарте: шаблонах (templates/), значениях по умолчанию (values.yaml), зависимостях, документации и т.д.
- Назначение: Управление изменениями в конфигурации развертывания.
- Изменяется при: Обновлении шаблонов Kubernetes манифестов, добавлении новых фич чарта, изменении структуры
values.yaml, обновлении зависимостей (Chart.yaml), исправлении ошибок в логике шаблонов. - Пример в
Chart.yaml:apiVersion: v2 name: my-awesome-app description: A Helm chart for Kubernetes type: application version: 1.5.3 # <-- Chart Version appVersion: 2.8.1 # <-- App Version
App Version (Версия Приложения)
App Version — это версия самого приложения (контейнеризированного образа), которое разворачивается с помощью этого чарта. Она указывается в том же файле Chart.yaml в поле appVersion. Эта версия обычно соответствует тегу Docker-образа (image.tag), который будет использован в развертывании.
- Назначение: Информационное указание на версию развертываемого ПО.
- Изменяется при: Выпуске новой версии вашего приложения (например, обновлении с
myapp:v2.7.0наmyapp:v2.8.0). Важно отметить, что изменениеappVersionне обязательно должно сопровождаться изменениемversionчарта, и наоборот. - Связь с values.yaml: Поле
appVersionчасто используется как удобная ссылка, но реально используемый тег образа определяется вvalues.yaml(например,image.tag: "{{ .Chart.AppVersion }}"или явно заданное значение).
Ключевые различия в таблице
| Аспект | Chart Version | App Version |
|---|---|---|
| Что версионирует | Шаблоны, конфигурации и инфраструктурный код чарта. | Само приложение (Docker-образ), которое запускается внутри. |
| Где указывается | Поле version в Chart.yaml. | Поле appVersion в Chart.yaml. |
| Следует SemVer | Да, строго. Патч (1.0.0 -> 1.0.1), минор (1.0.0 -> 1.1.0), мажор (1.0.0 -> 2.0.0). | Не обязательно, но часто рекомендуется. Может быть любой строкой (v1.2, latest, sha-abc123). |
| Когда менять | При изменении логики чарта (шаблонов, values, зависимостей). | При готовности к развертыванию новой сборки приложения. |
| Влияние на Helm | Определяет, является ли обновление совместимым (минорная/патч-версия) или ломким (мажорная версия). Влияет на команды helm upgrade, helm rollback. | Само по себе не влияет на логику Helm. Это метаданные. |
Практический пример и важные нюансы
Представьте, что вы обновили библиотеку Helm-чартов для своего веб-приложения.
- Ситуация A: Вы выпустили новый функционал приложения (
frontend:v3.0.0).
* Вы обновляете `appVersion: "3.0.0"` в `Chart.yaml`.
* **Chart Version может остаться прежней**, если конфигурация чарта не менялась.
- Ситуация B: Вам нужно добавить поддержку
ConfigMapв чарт для существующей версии приложения (frontend:v2.8.1).
* `appVersion` остается `"2.8.1"`.
* **Chart Version должен быть увеличен** (например, с `1.5.2` до `1.6.0`), так как логика чарта изменилась.
Критически важно: Helm при выполнении helm install или helm upgrade смотрит именно на Chart Version. Если вы увеличили только appVersion в Chart.yaml, но не увеличили version, Helm не выполнит обновление, так как сочтет, что чарт не изменился. Для триггера обновления развертывания необходимо либо изменить version чарта, либо использовать флаг --force.
Рекомендуемая практика:
- Всегда увеличивайте Chart Version при любом изменении в файлах чарта.
- Используйте
appVersionкак информативный указатель, а реальный тег образа управляйте черезvalues.yaml(или подставляйте через{{ .Chart.AppVersion }}). - В CI/CD пайплайне автоматизируйте инкремент
versionчарта при мерже в основную ветку, аappVersionсвязывайте с тегом Git или сборки Docker-образа.
Таким образом, Chart Version — это "версия рецепта", а App Version — "версия ингредиента". Можно поменять ингредиент (обновить образ), оставив рецепт старым, и наоборот — улучшить рецепт, используя те же ингредиенты. Helm как шеф-повар следит за изменениями именно в рецепте (чарте).