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