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

如何通过Kustomize将部分YAML配置合并到Base的ConfigMap中?

解决Kustomize环境ConfigMap YAML内容合并问题

问题原因

当前使用configMapGenerator的behavior: merge是合并ConfigMap对象的data条目,而非合并单个条目内的YAML内容。当你在环境层指定同名的config.yml文件时,会直接覆盖base层的该文件内容,而非合并YAML结构。

解决方案

以下提供几种无需复制完整YAML到环境目录的实现方式:

方法1:用yq预先合并配置文件(推荐)

这是最简单直接的方式,借助yq工具实现YAML内容的深度合并:

  1. 在./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
  1. 给脚本添加执行权限:
chmod +x ./env/test/merge-config.sh
  1. 修改./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
  1. 执行流程:
# 先生成合并后的配置
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的文件合并能力:

  1. 在./base目录下拆分配置:
    • application.yml:
      application:
          web-server:
            init-timeout: 2m
            shutdown-timeout: 1m
            sites-сonfig: ./app/sites/prod
      
    • kerberos-base.yml:
      kerberos:
        principal: APP_USER@DOMAIN.LOCAL
        keytab: /kerberos/keytab/test.keytab
      
  2. 修改./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
  1. 在./env/test目录下创建kerberos-test.yml:
kerberos:
  principal: TEST_USER@DOMAIN.LOCAL
  keytab: /kerberos/keytab/test_user.keytab
  1. 修改./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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.11 14:35:20