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.