Короткий ответ
Общую конфигурацию нужно вынести в базовый шаблон (Helm base `values.yaml` или Kustomize `base/`), а в окружение-специфичных файлах (`values-prod.yaml`, `overlays/prod/`) оставлять только реальные различия (реплики, ресурсы, URL внешних зависимостий), применяя патчи поверх общей базы — это снижает дублирование и делает различия между окружениями явными и легко просматриваемыми в diff.
Как это работает подробнее
Helm позволяет накладывать несколько `-f values.yaml -f values-prod.yaml` файлов, где последующий переопределяет предыдущий только для указанных ключей; Kustomize явно строит overlay как набор патчей к базовым манифестам. В обоих случаях инженер видит не полное дублирование всей конфигурации на каждое окружение, а только дельту.
Пример кода
example1.yaml
# values.yaml (база)
replicaCount: 2
resources:
requests: {cpu: 100m, memory: 128Mi}
# values-prod.yaml (только дельта)
replicaCount: 6
resources:
requests: {cpu: 500m, memory: 512Mi}Пример кода
example2.sh
helm upgrade myapp ./chart -f values.yaml -f values-prod.yamlЧто использовать на практике
- На практике. такой подход значительно снижает риск дрифта, при котором «забыли применить одно и то же изменение во всех трёх местах», потому что общая часть меняется один раз в base. Важно установить, какие поля обязаны совпадать между окружениями (образ приложения, версия API) и какие — намеренно различаются (количество реплик, лимиты ресурсов, feature flags), и явно документировать это соглашение в команде.
- Пример. Ожидаемое поведение: итоговая конфигурация для prod содержит `replicaCount: 6` и увеличенные ресурсы, при этом остальные параметры (health check path, порты) берутся из общей базы и автоматически одинаковы во всех окружениях.
Подводные камни
- Частые ошибки. копируют полный values-файл для каждого окружения и правят в нём 1-2 строки, из-за чего общие изменения (например, новый порт health check) нужно вносить в N местах и легко забыть одно из них; смешивают в overlay изменения конфигурации с изменениями версии образа, из-за чего непонятно, что в diff относится к релизу, а что к инфраструктурной настройке.