テンプレート関数とパイプライン
これまで、テンプレートに情報を配置する方法を見てきました。しかし、その情報は変更されずにテンプレートに配置されます。時には、私たちにとってより使いやすくするために、提供されたデータを変換したい場合があります。
ベストプラクティスから始めましょう。.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.drink
はquote
関数を呼び出し、単一の引数を渡しています。
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 | quote
はquote .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 | 文字列 |
名前空間 | 文字列 |
名前 | 文字列 |
name
とnamespace
はどちらもオプションであり、空文字列(""
)として渡すことができます。
次のパラメータの組み合わせが可能です。
動作 | lookup関数 |
---|---|
kubectl get pod mypod -n mynamespace | lookup "v1" "Pod" "mynamespace" "mypod" |
kubectl get pods -n mynamespace | lookup "v1" "Pod" "mynamespace" "" |
kubectl get pods --all-namespaces | lookup "v1" "Pod" "" "" |
kubectl get namespace mynamespace | lookup "v1" "Namespace" "" "mynamespace" |
kubectl get namespaces | lookup "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
を使用して、クラスタ接続を許可する必要があります。
演算子は関数です
テンプレートでは、演算子(eq
、ne
、lt
、gt
、and
、or
など)はすべて関数として実装されています。パイプラインでは、括弧((
と)
)を使用して演算をグループ化できます。
これで、関数とパイプラインから、条件、ループ、スコープ修飾子を含むフロー制御に移ることができます。