私はこの種のテンプレートファイルを舵取りしています:
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}}
# 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}}
エラーなしで動作します。
何かアドバイス?
このソリューションについては、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を確認できます。
解決しました。 #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 }}