Helm:对于 tls,无法使用非 table 覆盖 table

Helm: Cannot overwrite table with non table for tls

这很可能真的很简单,但我现在 2 个小时都弄不明白。我有以下要通过父图表参数化的 Consul Ingress:

spec:
  rules:
  {{- range .Values.uiIngress.hosts }}
    - host: {{ . }}
      http:
        paths:
          - backend:
              serviceName: {{ $serviceName }}
              servicePort: {{ $servicePort }}
  {{- end -}}
  {{- if .Values.uiIngress.tls }}
  tls:
{{ toYaml .Values.uiIngress.tls | indent 4 }}
  {{- end -}}
{{- end }}

我要参数化上面的spec.tls

在 Consul 的 values.yaml 文件中,我们有以下模板:

uiIngress:
  enabled: false
  annotations: {}
  hosts: []
  tls: {}

我最接近参数化的是:

  uiIngress:
    tls:
    - hosts:
      - "some.domain.com"
    secretName: "ssl-default"

当我这样做时,我得到了这个错误:

warning: cannot overwrite table with non table for tls (map[])

有人可以帮忙吗,我试过一百万种东西。

检查您的 helm 版本。我认为旧版本中存在一些问题。这个不错:

$ helm version
Client: &version.Version{SemVer:"v2.9.1", GitCommit:"20adb27c7c5868466912eebdf6664e7390ebe710", GitTreeState:"clean"}
Server: &version.Version{SemVer:"v2.9.1", GitCommit:"20adb27c7c5868466912eebdf6664e7390ebe710", GitTreeState:"clean"}

我完全按照您提到的步骤进行了操作:

  1. 添加了 consul 作为子图(在 charts/consul 中)
  2. 在父图表中创建 values.yaml 具有:

    consul:
      uiIngress:
        tls:
        - hosts:
          - "some.domain.com"
        secretName: "ssl-default"
    
  3. Helm 安装父图表

如果您在 values.yaml 文件中为 Consul 定义的此图表的默认配置值具有以下结构:

uiIngress:
  enabled: false
  annotations: {}
  hosts: []
  tls: {}

当您执行 helm 命令时,您发送的值如下:

  uiIngress:
    tls:
    - hosts:
      - "some.domain.com"
    secretName: "ssl-default"

错误 warning: cannot overwrite table with non table for tls (map[]) 的发生是因为 tlsvalues.yaml 中被定义为字典 {} 并且您正尝试使用输入 list [](- hosts:) 到它。 要修复警告,您可以将提供的 values.yaml 格式更改为:

uiIngress:
  enabled: false
  annotations: {}
  tls: []
    hosts: []