テンプレート関数とパイプライン

これまで、テンプレートに情報を配置する方法を見てきました。しかし、その情報は変更されずにテンプレートに配置されます。時には、私たちにとってより使いやすくするために、提供されたデータを変換したい場合があります。

ベストプラクティスから始めましょう。.Valuesオブジェクトから文字列をテンプレートに挿入する場合は、これらの文字列を引用符で囲む必要があります。テンプレートディレクティブでquote関数を呼び出すことで、それを行うことができます。

apiVersion: v1
kind: ConfigMap
metadata:
  name: {{ .Release.Name }}-configmap
data:
  myvalue: "Hello World"
  drink: {{ quote .Values.favorite.drink }}
  food: {{ quote .Values.favorite.food }}

テンプレート関数は、functionName arg1 arg2...という構文に従います。上記のコードスニペットでは、quote .Values.favorite.drinkquote関数を呼び出し、単一の引数を渡しています。

Helmには60以上の関数があります。それらのいくつかはGoテンプレート言語自体によって定義されています。その他の大部分はSprigテンプレートライブラリの一部です。例を通して、多くの関数を見ていきます。

「Helmテンプレート言語」をHelm固有のものとして説明していますが、実際にはGoテンプレート言語、追加の関数、およびテンプレートに特定のオブジェクトを公開するためのさまざまなラッパーの組み合わせです。Goテンプレートに関する多くのリソースは、テンプレートについて学ぶ際に役立つ可能性があります。

パイプライン

テンプレート言語の強力な機能の1つは、パイプラインの概念です。UNIXの概念を取り入れ、パイプラインは一連のテンプレートコマンドをチェーンして、一連の変換をコンパクトに表現するためのツールです。つまり、パイプラインは、いくつかのことを順次効率的に行うための方法です。上記の例をパイプラインを使用して書き直してみましょう。

apiVersion: v1
kind: ConfigMap
metadata:
  name: {{ .Release.Name }}-configmap
data:
  myvalue: "Hello World"
  drink: {{ .Values.favorite.drink | quote }}
  food: {{ .Values.favorite.food | quote }}

この例では、quote ARGUMENTを呼び出す代わりに、順序を反転しました。パイプライン(|)を使用して引数を関数に「送信」しました:.Values.favorite.drink | quote。パイプラインを使用すると、複数の関数をチェーンできます。

apiVersion: v1
kind: ConfigMap
metadata:
  name: {{ .Release.Name }}-configmap
data:
  myvalue: "Hello World"
  drink: {{ .Values.favorite.drink | quote }}
  food: {{ .Values.favorite.food | upper | quote }}

順序を反転させることは、テンプレートでは一般的な慣習です。.val | quotequote .valよりも頻繁に見られます。どちらの方法でも問題ありません。

評価されると、そのテンプレートはこれを出力します。

# Source: mychart/templates/configmap.yaml
apiVersion: v1
kind: ConfigMap
metadata:
  name: trendsetting-p-configmap
data:
  myvalue: "Hello World"
  drink: "coffee"
  food: "PIZZA"

元のpizza"PIZZA"に変換されていることに注意してください。

このように引数をパイプライン処理する場合、最初の評価(.Values.favorite.drink)の結果は、関数の最後の引数として送信されます。2つの引数を取る関数を使用して上記の飲み物の例を変更することができます:repeat COUNT STRING

apiVersion: v1
kind: ConfigMap
metadata:
  name: {{ .Release.Name }}-configmap
data:
  myvalue: "Hello World"
  drink: {{ .Values.favorite.drink | repeat 5 | quote }}
  food: {{ .Values.favorite.food | upper | quote }}

repeat関数は指定された文字列を指定された回数繰り返して出力するので、出力はこうなります。

# Source: mychart/templates/configmap.yaml
apiVersion: v1
kind: ConfigMap
metadata:
  name: melting-porcup-configmap
data:
  myvalue: "Hello World"
  drink: "coffeecoffeecoffeecoffeecoffee"
  food: "PIZZA"

default関数を使用する

テンプレートで頻繁に使用される関数の1つは、default関数です:default DEFAULT_VALUE GIVEN_VALUE。この関数は、値が省略された場合に、テンプレート内でデフォルト値を指定できます。上記の飲み物の例を変更するために使用してみましょう。

drink: {{ .Values.favorite.drink | default "tea" | quote }}

通常通り実行すると、coffeeが得られます。

# Source: mychart/templates/configmap.yaml
apiVersion: v1
kind: ConfigMap
metadata:
  name: virtuous-mink-configmap
data:
  myvalue: "Hello World"
  drink: "coffee"
  food: "PIZZA"

次に、values.yamlから好きな飲み物の設定を削除します。

favorite:
  #drink: coffee
  food: pizza

次にhelm install --dry-run --debug fair-worm ./mychartを再実行すると、このYAMLが出力されます。

# Source: mychart/templates/configmap.yaml
apiVersion: v1
kind: ConfigMap
metadata:
  name: fair-worm-configmap
data:
  myvalue: "Hello World"
  drink: "tea"
  food: "PIZZA"

実際のチャートでは、すべての静的なデフォルト値はvalues.yamlに存在する必要があり、defaultコマンドを使用して繰り返す必要はありません(そうでなければ冗長になります)。ただし、defaultコマンドは、values.yaml内に宣言できない計算された値に最適です。例えば

drink: {{ .Values.favorite.drink | default (printf "%s-tea" (include "fullname" .)) }}

場合によっては、if条件ガードの方がdefaultよりも適している場合があります。それらについては次のセクションで説明します。

テンプレート関数とパイプラインは、情報を変換してYAMLに挿入するための強力な方法です。しかし、単なる文字列の挿入よりも少し複雑なテンプレートロジックを追加する必要がある場合があります。次のセクションでは、テンプレート言語によって提供される制御構造を見ていきます。

lookup関数を使用する

lookup関数は、実行中のクラスタのリソースを検索するために使用できます。lookup関数の概要は、lookup apiVersion, kind, namespace, name -> resource or resource listです。

パラメータ
apiVersion文字列
kind文字列
名前空間文字列
名前文字列

namenamespaceはどちらもオプションであり、空文字列("")として渡すことができます。

次のパラメータの組み合わせが可能です。

動作lookup関数
kubectl get pod mypod -n mynamespacelookup "v1" "Pod" "mynamespace" "mypod"
kubectl get pods -n mynamespacelookup "v1" "Pod" "mynamespace" ""
kubectl get pods --all-namespaceslookup "v1" "Pod" "" ""
kubectl get namespace mynamespacelookup "v1" "Namespace" "" "mynamespace"
kubectl get namespaceslookup "v1" "Namespace" "" ""

lookupがオブジェクトを返す場合、辞書を返します。この辞書はさらにナビゲーションして、特定の値を抽出できます。

次の例は、mynamespaceオブジェクトに存在するアノテーションを返します。

(lookup "v1" "Namespace" "" "mynamespace").metadata.annotations

lookupがオブジェクトのリストを返す場合、itemsフィールドを介してオブジェクトリストにアクセスできます。

{{ range $index, $service := (lookup "v1" "Service" "mynamespace" "").items }}
    {{/* do something with each service */}}
{{ end }}

オブジェクトが見つからない場合、空の値が返されます。これは、オブジェクトの存在を確認するために使用できます。

lookup関数は、Helmの既存のKubernetes接続構成を使用してKubernetesにクエリを実行します。APIサーバーとの対話中にエラーが返された場合(例:リソースへのアクセス許可がないため)、Helmのテンプレート処理は失敗します。

Helmは、helm template|install|upgrade|delete|rollback --dry-run操作中にKubernetes APIサーバーに接続するべきではないことに注意してください。実行中のクラスタに対してlookupをテストするには、代わりにhelm template|install|upgrade|delete|rollback --dry-run=serverを使用して、クラスタ接続を許可する必要があります。

演算子は関数です

テンプレートでは、演算子(eqneltgtandorなど)はすべて関数として実装されています。パイプラインでは、括弧(())を使用して演算をグループ化できます。

これで、関数とパイプラインから、条件、ループ、スコープ修飾子を含むフロー制御に移ることができます。