atdtool merge-values 用于针对单个 chart 计算最终 .Values,并将结果输出为一个 YAML 文件。
适合在以下场景使用:
- 验证某个 chart 在多套 values 目录下的最终取值
- 检查
global.yaml、charts 同名 yaml、modules/*.yaml和--set的叠加结果 - 生成一个可落盘的最终
values.yaml供排障或审阅使用
命令形态:
CHART:单个 chart 目录,例如./charts/example-p, --values:一个或多个 values 路径,后面的路径优先级更高-s, --set:命令行覆盖项,优先级最高-o, --output:输出文件路径;如果给的是目录,会自动写成<目录>/values.yaml
服务级 yaml 文件名不是固定直接取 chart 目录名,而是按以下顺序解析:
- 先看 chart 默认值里的
type_name - 如果没有
type_name,再看func_name - 如果都没有,再退回 chart 目录名 /
Chart.yaml中的 chart 名
例如:
- chart 目录叫
engine values.yaml中type_name: example- 则会读取
values/<group>/example.yaml
如果 chart 目录叫 logic,但 values.yaml 中写了 type_name: example,那么读取的仍然是 example.yaml。
对于同一个 key,当前代码的实际优先级从高到低为:
--set- 后出现 values 路径中的 charts 同名 yaml
- 先出现 values 路径中的 charts 同名 yaml
- chart 自带
values.yaml - 后出现 values 路径中的
global.yaml - 先出现 values 路径中的
global.yaml - 后出现 values 路径中的已启用模块配置
- 先出现 values 路径中的已启用模块配置
要点:
global.yaml是“公共默认层”,不会覆盖 chart 自带values.yaml的同名 key- 模块配置是“按需补齐层”,只会补充更高优先级来源没有定义的 key
- map / object 是深度合并,而不是整段替换
模块文件放在 values/<group>/modules/*.yaml 下,例如:
values/default/modules/logging.yamlvalues/dev/modules/cache.yaml
模块文件会自动被挂到 .Values.<模块名> 下。
例如 modules/logging.yaml:
enabled: true
log_path: /data/log会出现在最终值里:
logging:
enabled: true
log_path: /data/log模块生效规则:
- 如果更高优先级来源里存在
<module>.enabled: false,模块不会注入 - 如果更高优先级来源里存在
<module>.enabled: true,模块会注入 - 如果更高优先级来源没有显式写
<module>.enabled,则以模块文件自身的enabled为准
atdtool merge-values ./charts/example \
-p ./values/default,./values/dev \
-o ./target/example.values.yamlatdtool merge-values ./charts/example \
-p ./values/default,./values/dev \
-s log_level=DEBUG \
-s logging.enabled=false \
-o ./target/example.values.yamlatdtool merge-values ./charts/example \
-p ./values/default \
-s http_client.timeout=15s \
-s logging.sources[0].name=access \
-o ./target/example.values.yaml- 指定
-o ./result.yaml:直接写入该文件 - 指定
-o ./target:写入./target/values.yaml - 不指定
-o:当前实现会直接覆盖 chart 目录下的values.yaml
因此在日常使用中,建议总是显式指定 -o,避免误覆盖 chart 默认值。
merge-values不会像template命令那样注入instance_id、bus_addr等运行时实例值。--set在本命令中是原样并入.Values,不会自动把global.xxx扁平化成顶层值。- 如果任一
--values路径不存在,命令会返回错误。