You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Kustomize生成ConfigMap后,Deployment中configMapRef未替换带后缀名称

问题:Kustomize ConfigMapGenerator生成的带后缀名称未在Deployment引用中自动替换

场景复现

你的项目结构:

.
├── app
│   ├── base
│   │   └── kustomization.yaml
│   │   └── my-configmap.yaml
│   │   └── my-deploy.yaml  
│   │   └── my-svc.yaml  
│   ├── overlay
│       └── kustomization.yaml

base目录下的kustomization.yaml通过configMapGenerator生成名为db的ConfigMap:

apiVersion: kustomize.config.k8s.io/v1beta1
kind: Kustomization
resources:
  - my-configmap.yml
  - my-deploy.yml
  - my-svc.yml
configMapGenerator:
  - name: db
    literals:
      - SQLITE_DB_LOCATION=/tmp/db/my.db

Deployment中通过envFrom.configMapRef.name引用该ConfigMap:

apiVersion: apps/v1
kind: Deployment
metadata:
  name: my-deploy
  namespace: my-app
  labels:
    app: my-app
spec:
  replicas: 2
  selector:
    matchLabels:
      app: my-app
  template:
    metadata:
      labels:
        app: my-app
    spec:
      containers:
      - name: my-app
        image: foo123/my-app:latest
        imagePullPolicy: IfNotPresent
        ports:
        - containerPort: 9000
        envFrom:
        - configMapRef:
            name: my-configmap
        - configMapRef:
            name: db   # 此处引用生成的ConfigMap

执行kustomize build . | cat后,生成的ConfigMap名称为db-mmm78m6dgk,但Deployment中的引用仍为db,未自动替换。

原因

Kustomize的configMapGenerator默认会为生成的资源添加哈希后缀,用于内容变更时触发滚动更新,但默认不会自动扫描并替换所有资源中的引用字符串。只有当你通过nameReference或vars明确配置了关联规则时,Kustomize才会将引用替换为生成的带后缀的资源名称。

Kustomize内置了部分常用资源引用的自动替换规则,但Deployment.spec.template.spec.containers.envFrom.configMapRef.name不在默认规则范围内,所以需要手动配置。

解决方案

方案1:使用nameReference配置(推荐)

在base目录的kustomization.yaml中添加nameReference规则,指定Deployment的envFrom.configMapRef.name字段需要关联到ConfigMap的生成名称:

apiVersion: kustomize.config.k8s.io/v1beta1
kind: Kustomization
resources:
  - my-configmap.yml
  - my-deploy.yml
  - my-svc.yml
configMapGenerator:
  - name: db
    literals:
      - SQLITE_DB_LOCATION=/tmp/db/my.db

# 添加nameReference规则,让Kustomize自动替换引用
nameReference:
- kind: ConfigMap
  version: v1
  fieldSpecs:
  - path: spec/template/spec/containers/envFrom/configMapRef/name
    kind: Deployment

方案2:使用vars变量替换

通过定义变量引用生成的ConfigMap名称,再在Deployment中使用变量占位符:

  1. 修改base目录的kustomization.yaml,添加vars配置:
apiVersion: kustomize.config.k8s.io/v1beta1
kind: Kustomization
resources:
  - my-configmap.yml
  - my-deploy.yml
  - my-svc.yml
configMapGenerator:
  - name: db
    literals:
      - SQLITE_DB_LOCATION=/tmp/db/my.db

# 定义变量引用生成的ConfigMap名称
vars:
- name: DB_CONFIGMAP_NAME
  objref:
    kind: ConfigMap
    name: db
    apiVersion: v1
  fieldref:
    fieldpath: metadata.name
  1. 修改Deployment中的引用为变量占位符:
envFrom:
- configMapRef:
    name: my-configmap
- configMapRef:
    name: $(DB_CONFIGMAP_NAME)

重新执行kustomize build,Deployment中的引用会被自动替换为带后缀的ConfigMap名称。

内容的提问来源于stack exchange,提问作者user842225

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.05 00:12:40