web-dev-qa-db-ja.com

正しいコンテキストでサブチャートからヘルム「ヘルパー」テンプレートを呼び出すにはどうすればよいですか?

Helm チャートは、サービスの正規化された名前を作成するために使用される_helpers.tplのヘルパーテンプレートを定義します。サービス(DNS)名のテンプレートの標準形式は次のとおりです。

{{- define "postgresql.fullname" -}}
{{- $name := default .Chart.Name .Values.nameOverride -}}
{{- printf "%s-%s" .Release.Name $name | trunc 63 | trimSuffix "-" -}}
{{- end -}}

Postgresqlをサブチャートとして使用する場合、それを参照するためにDNSベースのサービスディスカバリをどのように使用するべきですか?一般的なパターンは、サブチャートヘルパーを親チャートにコピーすることです。

{{- define "keycloak.postgresql.fullname" -}}
{{- $name := default "postgresql" .Values.postgresql.nameOverride -}}
{{- printf "%s-%s" .Release.Name $name | trunc 63 | trimSuffix "-" -}}
{{- end -}}

これは明らかな理由による完全な狂気です!!!

確かに、サブチャートヘルパーを使用するより良い方法がありますか?コンテキストオブジェクトを作成できれば、次のようにそれを呼び出すことができます。

value: {{ template "postgresql.fullname" ({Chart: {Name: 'not-used'}, Release: {Name: .Release.Name}, Values: { nameOverride: .Values.postgresql.nameOverride}}) }}

残念ながら、実際にそのようなコンテキストを動的に作成する方法はわかりません。ヘルパー関数が新しいプロパティを参照するように変更された場合でも、これは機能しなくなりますが、当然のことです。

あるいは、サブチャートからサービス名を利用可能にする別の方法?

13
moreginger

私は問題を書きました helm/helm#4535 は現状を要約し、このケースを解決するHelmの拡張を提案します。

暫定的な解決策を探している人のために、「ersatz」サブチャートのスコープ内の特定のテンプレートを呼び出すメタテンプレートを記述しました(詳細については 私のフォローアップコメント を参照)。ドットオブジェクトを合成することで機能します。完全ではありませんが(すべてのフィールドが合成されるわけではありません)、次のように機能します。

{{- define "call-nested" }}
{{- $dot := index . 0 }}
{{- $subchart := index . 1 }}
{{- $template := index . 2 }}
{{- include $template (dict "Chart" (dict "Name" $subchart) "Values" (index $dot.Values $subchart) "Release" $dot.Release "Capabilities" $dot.Capabilities) }}
{{- end }}

使用法(redis.fullnameredisサブチャートのテンプレート):

{{ include "call-nested" (list . "redis" "redis.fullname") }}
5
intelfx

まあこれはどういうわけか非常に簡単ではないものです。

ここで起こっていることは、ヘルムが従うプラクティスとテンプレートで可能なことです。

1つの方法は「チャートはそのまま使用できる」ことです。そのため、サブチャートであろうとスタンドアロンであろうと、機能するはずです。これは、デプロイするリソースと参照されるリソースの名前空間を適切に設定するために必要な設定に影響を与えます。

私は非常に類似した問題を抱えていました kubernetesのヘルムのサブチャートのテンプレートで定義された値を参照する方法?

これに対する私の「解決策」は、自分の_helpers.tplでpostgres.fullnameを再定義することです。

{{- define "postgresql.fullname" -}}
{{- $name := printf "%s-%s" .Values.global.appId .Values.global.fkNameId -}}
{{- printf "%s-%s" $name "postgresql" | trunc 63 | trimSuffix "-" -}}
{{- end -}}

リリース名はティラーのインストールごとに一意である必要があり、クラスターにはティラーが1つあるため、リリース名を参照の一部として使用したり、独自の命名規則を使用したりするのとは少し異なりました。

テンプレートの定義はグローバルです。したがって、postgresチャートをデフォルトにするリリース名のプレフィックスが適切であれば、これらを使用できます。

{{- define "postgresql.fullname" -}}
{{- $name := printf "%s-%s" .Values.global.appId .Values.global.fkNameId -}}
{{- printf "%s-%s" $name "postgresql" | trunc 63 | trimSuffix "-" -}}
{{- end -}}

サービス名と重複しないリリース名( "webshop-service-webshop-service")を思い付くことができなかったため、ティラーインスタンスごとではなくネームスペースごとに必要になるため、使用しない傾向があります。

サブチャートから名前を定義したら、サービスでそれを参照します。私が参照しているチャートとそれが命名に使用しているものを知っているので、私はそれで大丈夫です。しかし、そのとおりです。サブチャートをアップグレードする場合、名前が同じかどうかを確認する必要があります。しかし、「フルネーム」はかなり一般的であるため、私は良いと思います。とにかくいくつかのテストは失敗します。

しかし、美しい「解決策」ではありません。

答えではありません-私にとっては十分です:)

1
wemu

私はHelmでとても環境に優しいので、悪い練習をしているかもしれません(そうは思いませんが)。私が理解していることから、名前付きテンプレートはすべての親およびサブチャートでグローバルに使用できます。ただし、これは値には当てはまりません。親の値にはサブチャートからアクセスできませんが、サブチャートの値には親からアクセスできます。

https://docs.helm.sh/chart_template_guide/#declaring-and-using-templates-with-define-and-template から引用...

「テンプレートに名前を付けるときに注意すべき重要な詳細が1つあります。テンプレート名はグローバルです。同じ名前の2つのテンプレートを宣言した場合、最後にロードされた方が使用されます。サブチャートのテンプレートはtopとともにコンパイルされるためレベルのテンプレートの場合、テンプレートにグラフ固有の名前を付けるように注意してください。」

参照:
https://docs.helm.sh/chart_template_guide/#named-templateshttps://docs.helm.sh/chart_template_guide/#subcharts-and-global -値

0
Henry Dobson