<.Chart.Name>: 无法评估字符串类型的字段图表

<.Chart.Name>: can't evaluate field Chart in type string

当我部署以下内容时出现此错误:

{{- if .Values.front.ingress.enabled -}}
{{- $fullName := include "marketplace.fullname" . -}}
{{- $ingressPaths := .Values.front.ingress.paths -}}
apiVersion: extensions/v1beta1
kind: Ingress
metadata:
  name: {{ $fullName }}-{{ .Values.environment }}-front
  labels:
    app.kubernetes.io/name: {{ include "marketplace.name" . }}-{{ .Values.front.name }}
    helm.sh/chart: {{ include "marketplace.chart" . }}
    app.kubernetes.io/instance: {{ .Release.Name }}-{{ .Values.front.name }}
    app.kubernetes.io/managed-by: {{ .Release.Service }}
  {{- with .Values.front.ingress.annotations }}
  annotations:
    {{- toYaml . | nindent 4 }}
  {{- end }}
spec:
{{- if .Values.front.ingress.tls }}
  tls:
  {{- range .Values.front.ingress.tls }}
    - hosts:
      {{- range .hosts }}
        - {{ . | quote }}
      {{- end }}
      secretName: {{ .secretName }}
  {{- end }}
{{- end }}
  rules:
  {{- range .Values.front.ingress.hosts }}
    - host: {{ . | quote }}
      http:
        paths:
    {{- range $ingressPaths }}
          - path: /
            backend:
              serviceName: {{ include "marketplace.name" . }}-{{ $.Values.front.name }}
              servicePort: 3000
    {{- end }}
  {{- end }}
{{- end }}

错误:

  Error: UPGRADE FAILED: render error in "marketplace/templates/front-ingress.yaml": template: marketplace/templates/front-ingress.yaml:36:30: executing "marketplace/templates/front-ingress.yaml" at <include "marketplace...>: error calling include: template: marketplace/templates/_helpers.tpl:6:18: executing "marketplace.name" at <.Chart.Name>: can't evaluate field Chart in type string

marketplace.name 定义在 _helpers.tpl:

{{- define "marketplace.name" -}}
{{- default .Chart.Name .Values.nameOverride | trunc 63 | trimSuffix "-" -}}
{{- end -}}

.Chart.Name是一个内部变量,解释了优先顺序here,但即使设置nameOverride,错误也是一样的。

奇怪的是,如果我删除此模板,.Chart.Name 在任何其他模板中都可以正常工作,所以我认为问题与使用的 range 的范围有关。

使用的值:

front:
  ingress:
    enabled: true
    annotations:
      kubernetes.io/ingress.class: nginx-int
      nginx.ingress.kubernetes.io/rewrite-target: /
      nginx.ingress.kubernetes.io/force-ssl-redirect: "false"
    paths:
      - /
    hosts:
      - myhost.mydomain.cloud
    tls: []

请参阅related issue

基于this workaround,可以将.存储在变量中,因为在range循环内部,.指的是paths:的实际值

您可能还想将 - path: / 替换为 - path: {{ . }}

{{- if .Values.front.ingress.enabled -}}
{{- $fullName := include "bchart.fullname" . -}}
{{- $ingressPaths := .Values.front.ingress.paths -}}
{{- $dot := . }}
apiVersion: extensions/v1beta1
kind: Ingress
metadata:
...
...
    {{- range $ingressPaths }}
          - path: {{ . }}
            backend:
              serviceName: {{ include "bchart.name" $dot }}-{{ $.Values.front.name }}
              servicePort: 3000
    {{- end }}