Helm values для разных окружений: паттерн с флагом -f
Published: 2026-03-12
Флаг -f в Helm позволяет наслаивать файлы values: при совпадении ключей побеждает последний файл. На этом строится конфигурация под конкретное окружение без дублирования всего values.yaml для каждого из них.
Паттерн
charts/my-service/
Chart.yaml
values.yaml # дефолты (полная конфигурация, безопасная для prod)
values-dev.yaml # только переопределения для dev
values-test.yaml # только переопределения для test
values-prod.yaml # prod (минимум — большинство ключей совпадает с дефолтами)
Деплой:
bashhelm upgrade --install my-service ./charts/my-service \
-f charts/my-service/values.yaml \
-f charts/my-service/values-dev.yaml \
--namespace dev
values.yaml — база. values-dev.yaml переопределяет только то, что отличается. Файл окружения обычно 5–20 строк.
values.yaml: дефолты для прода
yamlreplicaCount: 3
image:
repository: registry.example.com/my-service
tag: "latest"
pullPolicy: Always
resources:
requests:
cpu: 500m
memory: 512Mi
limits:
cpu: 2000m
memory: 1Gi
autoscaling:
enabled: true
minReplicas: 3
maxReplicas: 10
targetCPUUtilizationPercentage: 70
ingress:
host: my-service.example.com
env:
LOG_LEVEL: "warn"
FEATURE_FLAG_NEW_UI: "false"
DB_POOL_SIZE: "10"
values-dev.yaml: минимальные переопределения
yamlreplicaCount: 1
resources:
requests:
cpu: 100m
memory: 128Mi
limits:
cpu: 500m
memory: 256Mi
autoscaling:
enabled: false
ingress:
host: my-service.dev.example.com
env:
LOG_LEVEL: "debug"
FEATURE_FLAG_NEW_UI: "true"
DB_POOL_SIZE: "2"
Указываются только ключи, отличающиеся от продакшна. Если в базу добавляется новый ключ, все окружения автоматически получают безопасный для прода дефолт.
FluxCD HelmRelease с values по окружениям
Самый чистый паттерн — инлайн-переопределения в HelmRelease:
yaml# clusters/dev/apps/my-service/helmrelease.yaml
apiVersion: helm.toolkit.fluxcd.io/v2
kind: HelmRelease
metadata:
name: my-service
namespace: dev
spec:
chart:
spec:
chart: ./charts/my-service
sourceRef:
kind: GitRepository
name: flux-system
values:
replicaCount: 1
ingress:
host: my-service.dev.example.com
env:
LOG_LEVEL: "debug"
Чарт предоставляет все дефолты, HelmRelease переопределяет только специфичные для окружения ключи. Все окружения используют один чарт.
Проверка результата слияния
bash# Рендер без деплоя
helm template my-service ./charts/my-service \
-f charts/my-service/values.yaml \
-f charts/my-service/values-dev.yaml \
| grep -A5 "resources:"
# Посмотреть итоговые values после слияния
helm upgrade --install my-service ./charts/my-service \
-f charts/my-service/values.yaml \
-f charts/my-service/values-dev.yaml \
--dry-run \
| grep -A20 "COMPUTED VALUES:"
Что не следует помещать в values-env.yaml
- Секреты (пароли, токены) — используйте SealedSecrets или ESO
- Теги образов — фиксируются в HelmRelease, управляются Flux image automation
- Topology spread constraints — обычно одинаковы для всех окружений
Ловушка --set
bash# НЕ ДЕЛАЙТЕ ТАК в CI
helm upgrade my-service ./charts/my-service \
--set image.tag="${CI_COMMIT_SHORT_SHA}" \
--set replicaCount=2
Значения --set не хранятся в Git. При helm rollback они теряются. Вся конфигурация должна быть в файлах values, закоммиченных в Git.
Подключение секретов через Helm values
yaml# values.yaml
env: {}
envFromSecret:
- secretRef:
name: my-service-secret
# В шаблоне deployment
envFrom:
{{- range .Values.envFromSecret }}
- secretRef:
name: {{ .secretRef.name }}
{{- end }}
Secret создаётся отдельно через ESO или SealedSecrets. Чарт ссылается на него по имени. Секреты не попадают в Git.
Продвижение по окружениям
1. Деплой в dev: helm upgrade --install ... -f values-dev.yaml
2. Тестирование в dev
3. Обновить тег образа (или Flux image automation)
4. Готово к prod: обновить тег в values-prod.yaml / HelmRelease prod
С FluxCD: обновить тег в prod HelmRelease, закоммитить, запушить — Flux сам выполнит reconciliation.