Helm values: override без форка чарта
Как правильно переопределять values в Helm: values.yaml, --set, --set-file, --values. Иерархия приоритетов. Как не потер
Всем привет. Если вы управляете Helm-релизами в продакшене, то наверняка сталкивались с ситуацией, когда нужно подменить пару значений в чарте, но создавать и поддерживать собственный форк — непозволительная роскошь. Сегодня разберем, как правильно и надежно переопределять values, чтобы ваши конфигурации были управляемыми, воспроизводимыми и не терялись после helm upgrade.
Иерархия приоритетов: что побеждает
Первое правило — понимать порядок применения значений. Helm применяет их в следующем порядке (от низшего к высшему приоритету):
- Значения из
values.yaml, встроенного в чарт. - Файл
values.yaml, указанный при установке (-fили--values). - Файлы, переданные через
--values(могут быть несколько, последний переопределяет предыдущие). - Аргументы
--setи--set-fileиз командной строки. - Файл
values.yamlиз зависимого чарта (subchart), который переопределяет родительский.
Проще запомнить так: чем ближе к команде helm install/upgrade, тем выше приоритет. --set всегда бьет всё.
Практические методы переопределения
1. Файлы values.yaml — основа основ
Создайте свой файл values-prod.yaml для каждого окружения. Это главный источник истины для конфигурации. Храните его в Git.
# values-prod.yaml
replicaCount: 5
image:
tag: "v1.2.3-prod"
resources:
limits:
memory: 512Mi
Установка: helm install myapp -f values-prod.yaml ./chart
2. Аргумент –set — для быстрых экспериментов Идеален для отладки, но опасен для продакшена, так как легко теряется.
helm upgrade myapp ./chart --set replicaCount=3,image.tag=latest
3. –set-file — для многострочных значений Полезно для вставки сертификатов, конфигов или скриптов без экранирования.
echo "some complex script" > init.sql
helm upgrade myapp ./chart --set-file initScript=init.sql
4. Каскадирование файлов для слоистой конфигурации Можно разделить конфигурацию на базовую и окружение-специфичную.
# base.yaml - общие настройки
# prod.yaml - только отличия для прода
helm install myapp -f base.yaml -f prod.yaml ./chart
Как не потерять overrides при helm upgrade
Самая частая ошибка — запустить helm upgrade без повторного указания кастомных values. Helm не запоминает, какие файлы или --set использовались при install. Решение — всегда использовать -f с вашим файлом values или хранить конфигурацию в CI/CD-пайплайне. Никогда не полагайтесь на --set в ручных операциях.
Управление секретами: выносим за скобки
Никогда не храните секреты в values.yaml, даже зашифрованные. Используйте специализированные инструменты.
Вариант A: Sealed Secrets Создаете запечатанный секрет локально, в Git кладете только его. Чарт работает с обычным Secret, который создается оператором.
# Шаблон в чарте (templates/secret.yaml)
apiVersion: v1
kind: Secret
metadata:
name: {{ .Release.Name }}-db-creds
data:
password: {{ .Values.dbPassword | b64enc }}
А в вашем values-prod.yaml ссылаетесь на него через externalSecret или вообще оставляете пустым, если оператор сам внедряет секрет.
Вариант B: External Secrets Operator Золотой стандарт. В values указываете только ссылку на секрет из внешнего хранилища (AWS Secrets Manager, Vault). Сам чарт не содержит никаких чувствительных данных.
# values-prod.yaml
database:
passwordSecretRef:
name: "prod-db-password"
key: "password"
Типичные грабли
- Смешивание методов без понимания приоритетов. Получается неконсистентная конфигурация, которая ведет себя по-разному в CI и локально.
- Использование
--setдля установки сложных объектов. Легко ошибиться в синтаксисе. Лучше добавить значение в файлvalues.yaml. - Попытка переопределить значения subchart напрямую из родительского
--set. Нужно использовать полный путь с префиксом имени subchart:--set subchartName.key=value. - Игнорирование
--reuse-valuesпри upgrade. Если вы делаетеhelm upgrade --set newKey=value, все предыдущие--setсбросятся. Используйте--reuse-values, чтобы сохранить их, а затем применить новые.
Итог: ваша конфигурация должна быть идемпотентной. Запуск одного и того же helm upgrade -f values-env.yaml должен давать одинаковый результат всегда. Дисциплинированное использование файлов values, отказ от --set в продакшене и правильная работа с секретами через внешние системы — залог спокойной жизни.