如何通过Kustomize将部分YAML配置合并到Base的ConfigMap中?
解决Kustomize环境ConfigMap YAML内容合并问题
问题原因
当前使用configMapGenerator的behavior: merge是合并ConfigMap对象的data条目,而非合并单个条目内的YAML内容。当你在环境层指定同名的config.yml文件时,会直接覆盖base层的该文件内容,而非合并YAML结构。
解决方案
以下提供几种无需复制完整YAML到环境目录的实现方式:
方法1:用yq预先合并配置文件(推荐)
这是最简单直接的方式,借助yq工具实现YAML内容的深度合并:
- 在
./env/test目录下创建合并脚本merge-config.sh:
#!/bin/bash # 合并base和test环境的配置,生成merged-config.yml yq eval-all '. as $item ireduce ({}; . * $item)' ../../base/config.yml ./config.yml > merged-config.yml
- 给脚本添加执行权限:
chmod +x ./env/test/merge-config.sh
- 修改
./env/test/kustomization.yaml,使用合并后的文件生成ConfigMap:
apiVersion: kustomize.config.k8s.io/v1beta1 kind: Kustomization resources: - ../../base patches: - replica_count.yml configMapGenerator: - name: config-app behavior: replace files: - merged-config.yml options: disableNameSuffixHash: true
- 执行流程:
# 先生成合并后的配置 cd ./env/test && ./merge-config.sh # 再执行Kustomize构建和部署 kustomize build ./env/test | kubectl apply --prune -f -
方法2:用Kustomize JSON Patch结合yq(无脚本)
通过patchesJson6902直接修改base生成的ConfigMap的data.config.yml字段,利用yq生成合并后的YAML字符串:
修改./env/test/kustomization.yaml,移除原有configMapGenerator部分,添加如下内容:
apiVersion: kustomize.config.k8s.io/v1beta1 kind: Kustomization resources: - ../../base patches: - replica_count.yml patchesJson6902: - target: group: "" version: v1 kind: ConfigMap name: config-app patch: |- - op: replace path: /data/config.yml value: | $(yq eval-all '. as $item ireduce ({}; . * $item)' ../../base/config.yml ./config.yml)
执行时需要通过envsubst处理命令替换:
cd ./env/test && export MERGED_CONFIG=$(yq eval-all '. as $item ireduce ({}; . * $item)' ../../base/config.yml ./config.yml) && kustomize build | envsubst | kubectl apply --prune -f -
方法3:拆分base配置为多文件(原生Kustomize支持)
如果允许拆分base的配置文件,可以利用Kustomize的文件合并能力:
- 在
./base目录下拆分配置:application.yml:application: web-server: init-timeout: 2m shutdown-timeout: 1m sites-сonfig: ./app/sites/prodkerberos-base.yml:kerberos: principal: APP_USER@DOMAIN.LOCAL keytab: /kerberos/keytab/test.keytab
- 修改
./base/kustomization.yaml,用literals合并成单个config.yml条目:
apiVersion: kustomize.config.k8s.io/v1beta1 kind: Kustomization resources: - deployment.yaml configMapGenerator: - name: config-app literals: - config.yml=$(cat application.yml kerberos-base.yml | yq eval-all '. as $item ireduce ({}; . * $item)') options: disableNameSuffixHash: true
- 在
./env/test目录下创建kerberos-test.yml:
kerberos: principal: TEST_USER@DOMAIN.LOCAL keytab: /kerberos/keytab/test_user.keytab
- 修改
./env/test/kustomization.yaml,替换合并用的kerberos文件:
apiVersion: kustomize.config.k8s.io/v1beta1 kind: Kustomization resources: - ../../base patches: - replica_count.yml configMapGenerator: - name: config-app behavior: replace literals: - config.yml=$(cat ../../base/application.yml ./kerberos-test.yml | yq eval-all '. as $item ireduce ({}; . * $item)') options: disableNameSuffixHash: true
内容的提问来源于stack exchange,提问作者Darkwind
相关产品推荐
相关产品推荐

