如何在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
相关产品推荐
相关产品推荐

