Helm技术问题:如何在helpers模板中按站点与命名空间提取嵌套值
解决Helm模板中根据站点和命名空间提取配置值的问题
你的配置文件(values.yaml)
edir: foo: stg: A prd: B dev: C bar: stg: E prd: F dev: G _default: dev: Z
需求说明
- foo、bar为应用站点标识,对应配置项
.Values.site - stg、prd、dev为Kubernetes命名空间,对应
Release.Namespace - 需要根据当前站点和命名空间提取对应值,当目标配置不存在时,默认使用
.Values.edir._default.dev的值Z
之前写法无效的原因
pluck函数参数顺序错误:pluck的用法是pluck KEY... OBJECT,你把查询对象放在最后,且键的遍历顺序逻辑不对,导致无法正确定位值。dig函数缺少根对象参数:dig的用法是dig PATH... DEFAULT ROOT,你未传入根对象.Values作为查询起点,导致路径遍历失败。
正确实现方式
方式1:使用index函数嵌套(推荐,直观易懂)
{{ index .Values.edir .Values.site .Release.Namespace | default .Values.edir._default.dev }}
- 先通过
index .Values.edir .Values.site定位到当前站点(foo/bar)的配置对象 - 再通过
.Release.Namespace提取对应命名空间的值 - 若提取结果为空,
default会返回兜底的默认值
方式2:修正pluck函数写法
{{ pluck .Release.Namespace (index .Values.edir .Values.site) | first | default .Values.edir._default.dev }}
- 先用
index定位到站点配置对象,再用pluck提取命名空间对应的键值 first用于取出pluck返回切片中的第一个元素(pluck返回值为切片类型)- 最后用
default处理空值情况
方式3:修正dig函数写法
{{ dig "edir" .Values.site .Release.Namespace .Values.edir._default.dev .Values }}
- 按路径顺序遍历:
.Values.edir -> .Values.site -> .Release.Namespace - 若路径上任意节点不存在,直接返回默认值
- 必须传入根对象
.Values作为查询的起点
内容的提问来源于stack exchange,提问作者user1452759
相关产品推荐
相关产品推荐

