サブチャートとグローバル値

ここまで、私たちは1つのチャートのみを操作してきました。しかし、チャートには、独自の値を持ち、テンプレートも持つ、*サブチャート*と呼ばれる依存関係を持つことができます。このセクションでは、サブチャートを作成し、テンプレート内から値にアクセスするさまざまな方法を見ていきます。

コードに入る前に、アプリケーションのサブチャートについて学ぶべき重要な詳細がいくつかあります。

  1. サブチャートは「スタンドアロン」と見なされます。つまり、サブチャートは親チャートに明示的に依存することはできません。
  2. そのため、サブチャートは親の値にアクセスできません。
  3. 親チャートは、サブチャートの値をオーバーライドできます。
  4. 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の*親*チャートです。この関係は、mysubchartmychart/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.yamlmysubchart/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チャートは他の任意のチャートから含めることができます。

チャート開発者はincludetemplateのどちらかを選択できますが、includeを使用する利点の1つは、includeがテンプレートを動的に参照できることです。

{{ include $mytemplate }}

上記は、$mytemplateを逆参照します。対照的に、template関数は文字列リテラルのみを受け入れます。

ブロックの使用を避ける

Goテンプレート言語には、開発者が後でオーバーライドされるデフォルト実装を提供できるblockキーワードが用意されています。Helmチャートでは、同じブロックの複数の実装が提供されている場合、選択される実装が予測できないため、ブロックはオーバーライドに最適なツールではありません。

代わりにincludeを使用することをお勧めします。