Helm模板_helpers.tpl中函数报nil pointer错误原因咨询
我在Helm Chart的_helpers.tpl文件中定义了如下两个模板函数:
{{- define "hqxtest.kubeVersion" -}} {{- .Capabilities.KubeVersion.Version -}} {{- end }} {{- define "hqxtest.ingress.apiVersion" -}} {{- if ge .Capabilities.KubeVersion.Version "v1.19.0" }} {{ print "networking.k8s.io/v1" }} {{- else }} {{ print "networking.k8s.io/v1beta1" }} {{- end }} {{- end }}
使用Helm时出现错误:
"executing "hqxtest.ingress.apiVersion" at <.Capabilities.KubeVersion.Version>: nil pointer evaluating interface {}.KubeVersion"
但在ConfigMap中直接使用相同判断逻辑:
apiVersion: v1 kind: ConfigMap metadata: name: hqx-test-configmap data: {{- if ge .Capabilities.KubeVersion.Version "v1.19" }} val: {{ printf "networking.k8s.io/v1" }} {{- else }} val: {{ printf "networking.k8s.io/v1beta1" }} {{- end }}
却能正常渲染出结果:
apiVersion: v1 kind: ConfigMap metadata: name: hqx-test-configmap data: val: networking.k8s.io/v1beta1
想咨询为何_helpers.tpl中定义的hqxtest.ingress.apiVersion函数会触发上述nil pointer错误?
问题核心是调用模板时没有传递上下文对象(.)。
Helm模板里的.代表当前上下文,包含Capabilities、Values等核心数据集合。在ConfigMap的YAML中直接写判断逻辑时,代码本身处于根上下文范围内,.能正常访问到Capabilities数据,因此不会报错。
但你定义的模板函数在调用时,如果没有显式传递.,模板内部的.就会变成空的nil对象,自然找不到Capabilities.KubeVersion.Version路径,从而触发空指针错误。
解决方法很直接:调用模板时必须把当前上下文传进去,正确写法是:
{{ include "hqxtest.ingress.apiVersion" . }}
而非仅写{{ include "hqxtest.ingress.apiVersion" }}。同理,hqxtest.kubeVersion模板的正确调用方式也是{{ include "hqxtest.kubeVersion" . }}。
内容的提问来源于stack exchange,提问作者Qingxiang Huang

