Kustomize configMapGenerator и secretGenerator
Published: 2026-04-18
configMapGenerator и secretGenerator создают ConfigMap и Secret из файлов, литералов или env-файлов. Главная особенность: по умолчанию к имени добавляется хеш содержимого — при его изменении автоматически запускается rolling update.
Основы configMapGenerator
yaml# kustomization.yaml
configMapGenerator:
- name: vector-config
namespace: observability
files:
- vector.yaml=configs/vector.yaml
options:
labels:
app.kubernetes.io/component: vector
Генерируется ConfigMap с именем vector-config-<hash>. Любой Deployment, ссылающийся на этот ConfigMap, автоматически перезапустится при изменении configs/vector.yaml — никаких ручных аннотаций.
Синтаксис vector.yaml=configs/vector.yaml: ключ внутри ConfigMap будет vector.yaml, данные берутся из configs/vector.yaml. Без = — имя файла используется и как ключ, и как путь.
Отключение хеш-суффикса
Когда имя ConfigMap жёстко прописано в values Helm-чарта, хеш-суффикс ломает ссылку. Отключить:
yamlconfigMapGenerator:
- name: grafana-dashboards
namespace: observability
options:
disableNameSuffixHash: true
files:
- dashboards/cluster-overview.json
- dashboards/apisix.json
- dashboards/nodes.json
При disableNameSuffixHash: true имя остаётся grafana-dashboards. Sidecar Grafana находит ConfigMap по метке и загружает дашборды динамически.
secretGenerator
Тот же API, но для Secret:
yamlsecretGenerator:
- name: vector-tls
namespace: observability
files:
- tls.crt=certs/vector-tls.crt
- tls.key=certs/vector-tls.key
type: kubernetes.io/tls
options:
disableNameSuffixHash: true
Для учётных данных из литералов:
yamlsecretGenerator:
- name: app-db-credentials
namespace: dev
literals:
- username=appuser
- password=changeme
Реальные секреты сюда не класть. Использовать SealedSecrets или ExternalSecrets.
Источник из env-файла
Для нескольких пар ключ=значение из .env-файла:
yamlconfigMapGenerator:
- name: app-config
namespace: dev
envs:
- configs/app.env
Содержимое configs/app.env:
LOG_LEVEL=info
METRICS_PORT=9090
FEATURE_FLAG_X=true
DB_HOST=postgres.dev.svc.cluster.local
Каждая строка — отдельный ключ в ConfigMap. Удобнее, чем длинный список literals:.
valuesFrom в HelmRelease
ConfigMap от Kustomize можно передавать как values в HelmRelease:
yaml# HelmRelease
spec:
valuesFrom:
- kind: ConfigMap
name: vector-helm-values
valuesKey: values.yaml
yaml# kustomization.yaml
configMapGenerator:
- name: vector-helm-values
namespace: observability
options:
disableNameSuffixHash: true
files:
- values.yaml=helm-values/vector-values.yaml
Удобно, когда values-файл большой или часто меняется — не нужно встраивать весь YAML прямо в HelmRelease.
patches + generators вместе
Патчи могут ссылаться на ConfigMap по оригинальному имени — Kustomize перепишет ссылки автоматически:
yamlpatches:
- patch: |
apiVersion: apps/v1
kind: Deployment
metadata:
name: vector
spec:
template:
spec:
volumes:
- name: config
configMap:
name: vector-config # переписывается в vector-config-<hash>
target:
kind: Deployment
name: vector
Kustomize переписывает ссылки на имена ConfigMap по всему выходному манифесту — в Deployments, StatefulSets, Pods.
Несколько генераторов
yamlconfigMapGenerator:
- name: prometheus-rules
namespace: monitoring
files:
- alerting-rules/k8s.yaml
- alerting-rules/apps.yaml
- alerting-rules/infra.yaml
options:
disableNameSuffixHash: true
annotations:
prometheus-operator: "true"
- name: grafana-provisioning
namespace: monitoring
files:
- provisioning/datasources.yaml
- provisioning/dashboards.yaml
options:
disableNameSuffixHash: true
Отладка
Проверить, что генерирует Kustomize до применения:
bashkubectl kustomize . | grep -A 20 "kind: ConfigMap"
Проверить сгенерированный хеш-суффикс:
bashkubectl get configmap -n observability | grep vector-config