Helmテンプレートはvalues.yaml構造と互換性がありません

Aug 16 2020

私は次のingress.yamlを持っています:

spec:
{{- if .Values.ingress.tls }}
  tls:
  {{- range .Values.ingress.tls }}
    - hosts:
      {{- range .hosts }}
        - {{ . | quote }}
      {{- end }}
      secretName: {{ .secretName }}
  {{- end }}
{{- end }}
  rules:
  {{- range .Values.ingress.hosts }}
    - host: {{ .host }}                 // row 31
      http:
        paths:
        {{- range .paths }}
          - path: {{ . | quote }}
            backend:
              serviceName: {{ $fullName }} servicePort: {{ $svcPort }}
        {{- end }}
  {{- end }}
{{- end }}

そして、このテンプレートをフィードするための次の値:

  hosts:
    host: "app.example.com"
    paths:
      - "/api"
      - "/oauth"

  tls:
    - secretName: "example-tls"
      hosts:
        - "*.app.example.com"
        - "dev.example.com"

「helminstall」を実行すると、次の場合に失敗します。

エラー:アップグレードに失敗しました:テンプレート:templates / ingress.yaml:31:15:<。host>で「templates / ingress.yaml」を実行しています:タイプインターフェイス{}でフィールドホストを評価できません

したがって、私にとっては、ホストは辞書ではなくリストでなければならないように見えます(範囲命令のため)。だから私はそれを変換します:

  hosts:
    - host: "app.example.com"
      paths:
        - "/api"
        - "/oauth"

しかし、この場合、私は次のようになります。

警告:ホストの宛先はテーブルです。テーブル以外の値を無視する[map [host:app.example.comパス:[/ api / oauth]]]

さらに、上記と同じエラー。

それを機能させる方法は?

更新1

値:

ingress:
  enabled: true

  rules:
    - host: c1.app.example.com
      paths:
        - /api
        - /oauth
    - host: c2.app.example.com
      paths:
        - /api
        - /oauth
  tls:
    - secretName: "example-tls"
      hosts:
        - "*.app.example.com"
        - "dev.example.com"

テンプレート:

{{- if .Values.ingress.tls }}
  tls:
  {{- range .Values.ingress.tls }}
    - hosts:
      {{- range .hosts }}
        - {{ . | quote }}
      {{- end }}
      secretName: {{ .secretName }}
  {{- end }}
{{- end }}
  rules:
  {{- range .Values.ingress.rules }}
    - host: {{ .host | quote }}
      http:
        paths:
        {{- range .paths }}
          - path: {{ . | quote }}
            backend:
              serviceName: {{ $fullName }} servicePort: {{ $svcPort }}
        {{- end }}
  {{- end }}
{{- end }}

更新2

問題はコードではなくコマンドラインにあることを理解しました。配列の代わりに文字列を入力しました。

ヘルムテンプレート...-- set ingress.hosts.host = c1.app.example.com..。

複数の値を提供する方法を理解し、ここで更新しようと思います。

更新3

値からデータを消去しました:

ingress:
  enabled: false

  rules:
    - host:

  tls:
    - secretName:
      hosts: []

回答

1 seshadri_c Aug 16 2020 at 15:36

テンプレートはを探してい.Values.ingress.hostsますが、表示された値にはingressプレフィックスがありません。また、range演算子が使用されているため、辞書のリストが必要です。

また、を実行する前に、YAML定義が正しくレンダリングされていることを確認するためだけにhelm install実行するとよいでしょうhelm template

以下の内容を考慮してくださいvalues.yaml

--- 
ingress: 
  hosts: 
    - 
      host: app1.example.com
      paths: 
        - /api
        - /oauth
    - 
      host: app2.example.com
      paths: 
        - /api1
        - /authz
  tls:
    - hosts:
      - "*.app.example.com"
      - "dev.example.com"
      secretName: "example-tls"

helm templateコマンドを実行すると、次のようになります(serviceNamehaproxyとして定義しservicePort、説明のために8080として定義しました)。

spec:
  tls:
    - hosts:
        - "*.app.example.com"
        - "dev.example.com"
      secretName: example-tls
  rules:
    - host: app1.example.com                 // row 31
      http:
        paths:
          - path: "/api"
            backend:
              serviceName: haproxy
              servicePort: 8080
          - path: "/oauth"
            backend:
              serviceName: haproxy
              servicePort: 8080
    - host: app2.example.com                 // row 31
      # similar output for app2.example.com

1 MichaelA. Aug 27 2020 at 00:13

私自身の質問に答えます。

問題は、paramsオーバーライド用に提供した入力テンプレート構造とコマンドライン引数の不一致にありました。

これは、コマンドライン引数の適切な適合です。

helm upgrade <some other options here>
--values ./values.yaml
--set ingress.enabled=True
--set ingress.tls[0].hosts[0]=app.example.com
--set ingress.tls[0].secretName=example-tls
--set ingress.rules[0].host=app.example.com

それはvalues.yamlにデータを入力します

ingress:
  enabled: false

  rules:
    - host:

  tls:
    - secretName:
      hosts: []

入力テンプレートの場合

spec:
{{- if .Values.ingress.tls }}
  tls:
  {{- range .Values.ingress.tls }}
    - secretName: {{ .secretName }}
      hosts:
      {{- range .hosts }}
        - {{ . | quote }}
      {{- end }}
  {{- end }}
{{- end }}
  rules:
  {{- range .Values.ingress.rules }}
    - host: {{ .host | quote }}
      http:
        paths:
        - path: /api
          backend:
            serviceName: {{ $fullName }} servicePort: {{ $svcPort }}
  {{- end }}
{{- end }}