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

如何在Helm模板中从values.yaml获取父元素名称?K8s现有Secret引用模板错误修复

问题分析与解决方案

你的问题核心很明确:在遍历Secret配置时,模板没有正确获取Secret的名称(也就是values里的secret-location、different-secret这些键),反而把Secret对应的环境变量映射整个当成了Secret名称,所以才会输出map[xxx:xxx]这种奇怪的字符串。

错误根源

看你原模板里的这段代码:

{{- range $name := .Values.env.secret }}
{{- range $key, $val := $name }}
- name: {{ $key }}
  valueFrom:
    secretKeyRef:
      name: {{ $name }}  <!-- 这里的$name是环境变量映射,不是Secret名称! -->
      key: {{ $val }}
{{- end }}
{{- end }}

在Go模板中,遍历map类型的数据时,如果只写range $val := $map,$val只会拿到map的值(这里就是每个Secret下的环境变量键值对),而丢失了map的键(也就是Secret的名称)。

修正后的模板

只需要把遍历.Values.env.secret的语句改成同时捕获key和value的形式,就能拿到正确的Secret名称了:

{{/* Add environment variables */}}
{{- define "helpers.list-env-variables" }}
{{- range $key, $val := .Values.env.normal }}
- name: {{ $key }}
  value: {{ $val }}
{{- end }}
{{- range $secretName, $envVars := .Values.env.secret }}  <!-- 这里改成$secretName(Secret名称)和$envVars(变量映射) -->
{{- range $envKey, $secretKey := $envVars }}
- name: {{ $envKey }}
  valueFrom:
    secretKeyRef:
      name: {{ $secretName }}  <!-- 这里用$secretName就是正确的Secret名称了 -->
      key: {{ $secretKey }}
{{- end }}
{{- end }}
{{- end }}

验证输出

用修正后的模板,生成的deployment env部分会变成你预期的样子:

env:
- name: ENV_VAR_1
  value: value
- name: ENV_VAR_2
  value: otherValue
- name: ENV_VAR_USERNAME
  valueFrom:
    secretKeyRef:
      name: secret-location
      key: username
- name: ENV_VAR_PASSWORD
  valueFrom:
    secretKeyRef:
      name: secret-location
      key: password
- name: ENV_CONN_STRING
  valueFrom:
    secretKeyRef:
      name: different-secret
      key: my_conn_string

可选:调整values.yaml结构(非必须)

如果你觉得原values结构不够直观,也可以改成数组形式,每个元素明确包含Secret名称和变量映射,这样模板逻辑更清晰:

env:
  normal:
    ENV_VAR_1: value
    ENV_VAR_2: otherValue
  secret:
    - name: secret-location
      vars:
        ENV_VAR_USERNAME: username
        ENV_VAR_PASSWORD: password
    - name: different-secret
      vars:
        ENV_CONN_STRING: my_conn_string

对应的模板也要改成遍历数组的形式:

{{/* Add environment variables */}}
{{- define "helpers.list-env-variables" }}
{{- range $key, $val := .Values.env.normal }}
- name: {{ $key }}
  value: {{ $val }}
{{- end }}
{{- range $secret := .Values.env.secret }}
{{- range $envKey, $secretKey := $secret.vars }}
- name: {{ $envKey }}
  valueFrom:
    secretKeyRef:
      name: {{ $secret.name }}
      key: {{ $secretKey }}
{{- end }}
{{- end }}
{{- end }}

不过原values结构已经很合理,更推荐第一种修复方案,不需要改动配置文件。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.04.30 19:12:37