Kustomize生成ConfigMap后,Deployment中configMapRef未替换带后缀名称
场景复现
你的项目结构:
. ├── 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中使用变量占位符:
- 修改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
- 修改Deployment中的引用为变量占位符:
envFrom: - configMapRef: name: my-configmap - configMapRef: name: $(DB_CONFIGMAP_NAME)
重新执行kustomize build,Deployment中的引用会被自动替换为带后缀的ConfigMap名称。
内容的提问来源于stack exchange,提问作者user842225

