在Kubernetes Helm模板中如何通过变量从Map获取值?
问题:Helm模板中动态引用Values里的Map键值对
场景
在values.yaml中定义了如下Map结构:
Schedule: app1: node01 app2: node07 app3: node13
需要在template/app.yaml中遍历生成对应应用的Pod调度节点配置,但原写法运行报错。
错误写法及报错信息
原模板代码:
{{- $tuplei := untilStep 1 4 1 -}} {{- range $keyi, $vali := $tuplei }} --- spec: template: spec: nodeName: {{ $.Values.Schedule.node$vali }}
执行Helm命令时触发解析错误:
Error: parse error at (xxx/templates/app.yaml:51): bad character U+0024 '$'
helm.go:94: [debug] parse error at (xxx/templates/app.yaml:51): bad character U+0024 '$'
用户尝试过以下写法,同样无法生效:
#{{- $ScheduleName := printf "app%d" $vali }} #nodeName: get $.Values.Schedule "$ScheduleName" #can't work, too.
正确实现方式
使用printf构造Map的键名,再通过Helm模板的index函数动态取值即可解决问题,修正后的模板代码如下:
{{- $tuplei := untilStep 1 4 1 -}} {{- range $keyi, $vali := $tuplei }} --- spec: template: spec: {{- $appKey := printf "app%d" $vali }} nodeName: {{ index $.Values.Schedule $appKey }} {{- end }}
说明
- 先通过
printf "app%d" $vali生成对应的键名(如app1、app2) - 使用
index函数从$.Values.Schedule这个Map中,根据生成的键名取出对应的节点值 - 原错误写法的问题在于:Helm模板不支持在对象属性标识符中直接拼接变量;尝试的
get函数写法不符合Helm模板语法,正确的动态取值函数是index
内容的提问来源于stack exchange,提问作者HelpMePlease
相关产品推荐
相关产品推荐

