ingress.yaml 模板在渲染中返回错误 --> 评估接口 {}.service 的 nil 指针

RAM*_*PTA 23 kubernetes-helm

我正在安装一个具有 ingress.yaml 模板的舵图。

我收到此错误:

错误:在“chartmuseum/templates/ingress.yaml”中呈现错误:模板:chartmuseum/templates/ingress.yaml:35:22:在 <.Values.service.servicename> 处执行“chartmuseum/templates/ingress.yaml”:nil指针求值接口 {}.service

我无法找到问题所在。同一套 if else 结构在同一个 helm chart 的 service.yaml 中完全可以正常工作。

- path: {{ default "/" .path | quote }}
        backend:
        {{- if .Values.service.servicename }}
          serviceName: {{ .Values.service.servicename }}
        {{- else }}
          serviceName: {{ include "chartmuseum.fullname" . }}
        {{- end }}
Run Code Online (Sandbox Code Playgroud)

在这一行出现错误 --> serviceName: {{ .Values.service.servicename }}

在 service.yaml 中有效的代码是

metadata:
{{- if .Values.service.servicename }}
  name: {{ .Values.service.servicename }}
{{- else }}
  name: {{ include "chartmuseum.fullname" . }}
{{- end }}
Run Code Online (Sandbox Code Playgroud)

预期结果:如果 values.yaml 文件中的 values 中有一个 servcice.servicename ,则入口应该从那里为 key serviceName 选择值。否则它应该包括“chartmuseum.fullname”。

相同的结构适用于 service.yaml。

以下是我正在使用的原始舵图的网址。

https://github.com/helm/charts/tree/master/stable/chartmuseum

我只是修改了 ingress.yaml 以在第 31 行附近添加 if else 块。 Ingress.yaml https://github.com/helm/charts/blob/master/stable/chartmuseum/templates/ingress.yaml

Values.yaml 文件无关紧要。我有以下值

service:
  servicename: helm-charts-test
Run Code Online (Sandbox Code Playgroud)

但即使没有这个值, if else 块也有望工作。

yan*_*ver 46

你看到的是 Go 模板中的一个奇怪的警告。您的条件逻辑正在范围循环内进行评估。这意味着.您使用的访问Values不是您期望的访问,因为它被每个范围迭代评估覆盖。您可以使用$, 它引用全局范围以按Values预期访问。

对于您的场景,它将类似于:

- path: {{ default "/" .path | quote }}
        backend:
        {{- if $.Values.service.servicename }}
          serviceName: {{ $.Values.service.servicename }}
        {{- else }}
          serviceName: {{ include "chartmuseum.fullname" $ }}
        {{- end }}
Run Code Online (Sandbox Code Playgroud)

请参阅此处了解更多详情。


krz*_*rzk 12

我按照@Torrey 的回答并替换了

targetPort: {{ .Values.non_existing.port | default 1234 }}
Run Code Online (Sandbox Code Playgroud)

targetPort: {{ (.Values.non_existing).port | default 1234 }}
Run Code Online (Sandbox Code Playgroud)

它起作用了