如何在Helm的values.yaml中解析.Release.Namespace变量?
问题解决:Helm values.yaml中模板表达式未解析的处理方法
问题原因
Helm只会自动渲染templates目录下的文件,values.yaml中的模板语法(如{{ .Release.Namespace }})不会被解析,会被当作普通字符串直接传入模板。这就是为什么dry-run结果里输出的是{{ .Release.Namespace }}而非实际命名空间。
解决方法
方法一:在模板中处理默认值(推荐)
不在values.yaml中写模板表达式,而是在模板文件里为secretNamespace设置默认值。当用户未自定义该字段时,自动使用Release.Namespace。
修改/templates/prep.yaml的逻辑:
... containers: - name: prep command: - /bin/bash - -exuc - | DEBUG A: {{ $.Release.Namespace }} {{- $namespace := $.Release.Namespace }} DEBUG B: {{ $namespace }} {{- with .Values.ticker }} {{- # 若secretNamespace未设置,默认使用Release.Namespace }} {{- $secretNs := default $namespace .secretNamespace }} {{- if not (eq $secretNs $namespace) }} DEBUG C: {{ $secretNs }} kubectl --namespace "{{ $secretNs }}" create secret ... {{- end }} {{- end }} ...
对应的values.yaml可以留空或不设置该字段:
ticker: secretNamespace: "" # 留空则自动使用Release.Namespace,用户可自定义为其他值
方法二:用tpl函数解析values中的模板表达式
如果必须在values.yaml中保留模板语法,可以在模板文件中使用Helm的tpl函数,对secretNamespace的值进行二次渲染。
修改/templates/prep.yaml:
... containers: - name: prep command: - /bin/bash - -exuc - | DEBUG A: {{ $.Release.Namespace }} {{- $namespace := $.Release.Namespace }} DEBUG B: {{ $namespace }} {{- with .Values.ticker }} {{- # 解析secretNamespace中的模板表达式 }} {{- $secretNs := tpl .secretNamespace $ }} {{- if not (eq $secretNs $namespace) }} DEBUG C: {{ $secretNs }} kubectl --namespace "{{ $secretNs }}" create secret ... {{- end }} {{- end }} ...
此时values.yaml可以保留模板写法:
ticker: secretNamespace: "{{ .Release.Namespace }}"
注意:
tpl函数会执行传入的模板字符串,若values由外部用户提供,需注意安全风险。
内容的提问来源于stack exchange,提问作者Bas
相关产品推荐
相关产品推荐

