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

在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 }}

说明

  1. 先通过printf "app%d" $vali生成对应的键名(如app1、app2)
  2. 使用index函数从$.Values.Schedule这个Map中,根据生成的键名取出对应的节点值
  3. 原错误写法的问题在于:Helm模板不支持在对象属性标识符中直接拼接变量;尝试的get函数写法不符合Helm模板语法,正确的动态取值函数是index

内容的提问来源于stack exchange,提问作者HelpMePlease

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.14 02:01:12