サブチャートとグローバル値
ここまで、私たちは1つのチャートのみを操作してきました。しかし、チャートには、独自の値を持ち、テンプレートも持つ、*サブチャート*と呼ばれる依存関係を持つことができます。このセクションでは、サブチャートを作成し、テンプレート内から値にアクセスするさまざまな方法を見ていきます。
コードに入る前に、アプリケーションのサブチャートについて学ぶべき重要な詳細がいくつかあります。
- サブチャートは「スタンドアロン」と見なされます。つまり、サブチャートは親チャートに明示的に依存することはできません。
- そのため、サブチャートは親の値にアクセスできません。
- 親チャートは、サブチャートの値をオーバーライドできます。
- Helmには、すべてのチャートからアクセスできる*グローバル値*という概念があります。
これらの制限は、標準化されたヘルパー機能を提供するように設計されたライブラリチャートには必ずしもすべて適用されるわけではありません。
このセクションの例を見ていくと、これらの概念の多くがより明確になります。
サブチャートの作成
これらの演習では、このガイドの最初に作成したmychart/
チャートから始め、その中に新しいチャートを追加します。
$ cd mychart/charts
$ helm create mysubchart
Creating mysubchart
$ rm -rf mysubchart/templates/*
以前と同様に、基本テンプレートをすべて削除して、最初から開始できるようにしたことに注意してください。このガイドでは、依存関係の管理ではなく、テンプレートの仕組みに焦点を当てています。ただし、チャートガイドには、サブチャートの仕組みに関する詳細情報が記載されています。
サブチャートへの値とテンプレートの追加
次に、mysubchart
チャートの簡単なテンプレートと値ファイルを作成しましょう。mychart/charts/mysubchart
には、すでにvalues.yaml
があるはずです。次のように設定します。
dessert: cake
次に、mychart/charts/mysubchart/templates/configmap.yaml
に新しいConfigMapテンプレートを作成します。
apiVersion: v1
kind: ConfigMap
metadata:
name: {{ .Release.Name }}-cfgmap2
data:
dessert: {{ .Values.dessert }}
すべてのサブチャートは*スタンドアロンチャート*であるため、mysubchart
を単独でテストできます。
$ helm install --generate-name --dry-run --debug mychart/charts/mysubchart
SERVER: "localhost:44134"
CHART PATH: /Users/mattbutcher/Code/Go/src/helm.sh/helm/_scratch/mychart/charts/mysubchart
NAME: newbie-elk
TARGET NAMESPACE: default
CHART: mysubchart 0.1.0
MANIFEST:
---
# Source: mysubchart/templates/configmap.yaml
apiVersion: v1
kind: ConfigMap
metadata:
name: newbie-elk-cfgmap2
data:
dessert: cake
親チャートからの値のオーバーライド
元のチャートであるmychart
は、現在mysubchart
の*親*チャートです。この関係は、mysubchart
がmychart/charts
内にあるという事実のみに基づいています。
mychart
は親であるため、mychart
で構成を指定し、その構成をmysubchart
にプッシュすることができます。たとえば、mychart/values.yaml
を次のように変更できます。
favorite:
drink: coffee
food: pizza
pizzaToppings:
- mushrooms
- cheese
- peppers
- onions
mysubchart:
dessert: ice cream
最後の2行に注意してください。mysubchart
セクション内の任意のディレクティブは、mysubchart
チャートに送信されます。したがって、helm install --generate-name --dry-run --debug mychart
を実行すると、mysubchart
ConfigMapが表示されるものの1つです。
# Source: mychart/charts/mysubchart/templates/configmap.yaml
apiVersion: v1
kind: ConfigMap
metadata:
name: unhinged-bee-cfgmap2
data:
dessert: ice cream
トップレベルの値が、サブチャートの値をオーバーライドしました。
ここで注意すべき重要な詳細があります。mychart/charts/mysubchart/templates/configmap.yaml
のテンプレートを.Values.mysubchart.dessert
を指すように変更していません。そのテンプレートの観点からすると、値はまだ.Values.dessert
にあります。テンプレートエンジンが値を渡すにつれて、スコープが設定されます。したがって、mysubchart
テンプレートの場合、mysubchart
に固有の値のみが.Values
で利用可能になります。
ただし、すべてのテンプレートで特定の値を使用できるようにしたい場合があります。これは、グローバルチャート値を使用して実現します。
グローバルチャート値
グローバル値は、まったく同じ名前で、任意のチャートまたはサブチャートからアクセスできる値です。グローバルには明示的な宣言が必要です。既存の非グローバルをグローバルであるかのように使用することはできません。
Valuesデータ型には、グローバル値を設定できるValues.global
という予約されたセクションがあります。mychart/values.yaml
ファイルに設定しましょう。
favorite:
drink: coffee
food: pizza
pizzaToppings:
- mushrooms
- cheese
- peppers
- onions
mysubchart:
dessert: ice cream
global:
salad: caesar
グローバルが機能する方法により、mychart/templates/configmap.yaml
とmysubchart/templates/configmap.yaml
の両方で、その値を{{ .Values.global.salad }}
としてアクセスできる必要があります。
mychart/templates/configmap.yaml
:
apiVersion: v1
kind: ConfigMap
metadata:
name: {{ .Release.Name }}-configmap
data:
salad: {{ .Values.global.salad }}
mysubchart/templates/configmap.yaml
:
apiVersion: v1
kind: ConfigMap
metadata:
name: {{ .Release.Name }}-cfgmap2
data:
dessert: {{ .Values.dessert }}
salad: {{ .Values.global.salad }}
ここで、ドライランインストールを実行すると、両方の出力に同じ値が表示されます。
# Source: mychart/templates/configmap.yaml
apiVersion: v1
kind: ConfigMap
metadata:
name: silly-snake-configmap
data:
salad: caesar
---
# Source: mychart/charts/mysubchart/templates/configmap.yaml
apiVersion: v1
kind: ConfigMap
metadata:
name: silly-snake-cfgmap2
data:
dessert: ice cream
salad: caesar
グローバルは、このように情報を渡すのに役立ちますが、グローバルを使用するように適切なテンプレートが構成されていることを確認するには、ある程度の計画が必要です。
サブチャートとのテンプレートの共有
親チャートとサブチャートはテンプレートを共有できます。任意のチャートで定義された任意のブロックは、他のチャートで利用できます。
たとえば、次のような単純なテンプレートを定義できます。
{{- define "labels" }}from: mychart{{ end }}
テンプレートのラベルが*グローバルに共有*されていることを思い出してください。したがって、labels
チャートは他の任意のチャートから含めることができます。
チャート開発者はinclude
とtemplate
のどちらかを選択できますが、include
を使用する利点の1つは、include
がテンプレートを動的に参照できることです。
{{ include $mytemplate }}
上記は、$mytemplate
を逆参照します。対照的に、template
関数は文字列リテラルのみを受け入れます。
ブロックの使用を避ける
Goテンプレート言語には、開発者が後でオーバーライドされるデフォルト実装を提供できるblock
キーワードが用意されています。Helmチャートでは、同じブロックの複数の実装が提供されている場合、選択される実装が予測できないため、ブロックはオーバーライドに最適なツールではありません。
代わりにinclude
を使用することをお勧めします。