web-dev-qa-db-ja.com

ネストされた値をヘルムテンプレートに含める方法

私はこの種のテンプレートファイルを舵取りしています:

apiVersion:networking.istio.io/v1alpha3

kind: VirtualService
metadata:
  name: {{.Values.app.name}}-global-route
  namespace: {{.Release.Namespace}}
spec:
  hosts:
  - "{{.Values.app.name}}-global.{{.Release.Namespace}}.svc.cluster.local"
  gateways:
  - {{.Values.app.name}}-gateway
  - mesh
  http:
  # 1st priority, to route specific end-user to canary service
  - route:
    - destination:
        Host: "{{.Values.app.name}}-global.{{.Release.Namespace}}.svc.cluster.local"
        subset: canary
    match: {{.Values.infra.trafficRoute.canaryCondition}}

そして、以下のようにvalues.yamlを公開したいと思います。

# default values supplied for templates/* files
app:
  name: Java-maven-app

infra:
  trafficRoute:
    canaryCondition:
    - headers:
        end-user:
          exact: apratama
        key:
          exact: agung

したがって、基本的に私が達成したいのは、エンドユーザー(私のヘルムチャートを使用する人)にカナリアの状態をカスタマイズさせることです。条件自体は、istioのmatchデータ構造(ネストされた複雑な値にすることができます)によって異なります。上記のhelm upgrade --installコマンドで試しましたが、どういうわけか次のエラーが発生しました。

Error: UPGRADE FAILED: YAML parse error on Java-maven-app-infra/templates/global-service.yaml: error converting YAML to JSON: yaml: line 17: found unexpected ':'
make: *** [deploy-infra] Error 1

ただし、この行をコメントアウトすると、次のようになります。

match: {{.Values.infra.trafficRoute.canaryCondition}}

エラーなしで動作します。

何かアドバイス?

4
Agung Pratama

このソリューションについては、k8sSlackで前述しました。あなたがあなた自身の答えを投稿していることに気づきましたが、他の誰かが同じ問題に遭遇した場合に備えて、少し拡張したほうがいいと思いました。

問題は、HelmチャートテンプレートがYAMLテンプレートの代わりにテキストテンプレートを実行することです。したがって、挿入されたYAMLサブツリー(canaryCondition)は自動的にYAMLに変換されず、matchキーの下にエレガントに配置されますが、代わりに文字列に変換され、テンプレートディレクティブがある場所に直接挿入されます。文字列や整数などの単純な値の場合、これはほとんどの場合正常に機能しますが、配列やマップなどのより複雑な値は別の方法で処理する必要があります。

テンプレートにYAMLサブツリーを挿入するには、最初にtoYaml関数を使用してサブツリーをYAMLに変換してから、indent関数で正しいインデントレベルが使用されていることを確認する必要があります。 。

{{ toYaml .Values.infra.trafficRoute.canaryCondition | indent 4 }}

テンプレートにYAMLサブツリーを挿入する方法の別の例については、 NGINXテンプレートの例 を参照してください。

Helmチャートテンプレートのデバッグを開始するには、helm templateコマンドを使用して、Helmチャートが生成するYAMLを確認できます。

3
Jaakko Pallari

解決しました。 #helm-users slackチャネル(kubernetes.slack.com)で何人かの人とチャットしたので、テンプレートに提供される値は文字列値です。したがって、それをyamlオブジェクトに変換し、適切にインデントする必要があります。これを少し変更して解決しました

  # 1st priority, to route specific end-user to canary service
  - route:
    - destination:
        Host: "{{.Values.app.name}}-global.{{.Release.Namespace}}.svc.cluster.local"
        subset: canary
    match: 
{{ toYaml .Values.infra.trafficRoute.canaryCondition | indent 4 }}
0
Agung Pratama