サブチャートとグローバル値
ここまで、私たちは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を使用することをお勧めします。