テンプレート

ベストプラクティスガイドのこの部分は、テンプレートに焦点を当てています。

templates/の構造

templates/ディレクトリは、次のように構造化する必要があります

  • テンプレートファイルは、YAML出力を生成する場合は拡張子.yamlを持つ必要があります。拡張子.tplは、フォーマットされたコンテンツを生成しないテンプレートファイルに使用できます。
  • テンプレートファイル名は、キャメルケースではなく、ダッシュ表記(my-example-configmap.yaml)を使用する必要があります。
  • 各リソース定義は、独自のテンプレートファイルに存在する必要があります。
  • テンプレートファイル名は、名前でリソースの種類を反映する必要があります。例:foo-pod.yamlbar-svc.yaml

定義済みテンプレートの名前

定義済みテンプレート({{ define }}ディレクティブ内で作成されたテンプレート)は、グローバルにアクセス可能です。つまり、チャートとそのすべてのサブチャートは、{{ define }}で作成されたすべてのテンプレートにアクセスできます。

そのため、すべての定義済みテンプレート名は名前空間化する必要があります。

正しい

{{- define "nginx.fullname" }}
{{/* ... */}}
{{ end -}}

不正解

{{- define "fullname" -}}
{{/* ... */}}
{{ end -}}

テンプレート名は、このベストプラクティスに従って自動的に定義されるため、新しいチャートはhelm createコマンドを使用して作成することを強くお勧めします。

テンプレートのフォーマット

テンプレートは、2つのスペース(タブは絶対に使用しない)を使用してインデントする必要があります。

テンプレートディレクティブは、開始中括弧の後に空白文字、および終了中括弧の前に空白文字を持つ必要があります

正しい

{{ .foo }}
{{ print "foo" }}
{{- print "bar" -}}

不正解

{{.foo}}
{{print "foo"}}
{{-print "bar"-}}

テンプレートは、可能な限り空白を削除する必要があります

foo:
  {{- range .Values.items }}
  {{ . }}
  {{ end -}}

(制御構造などの)ブロックは、テンプレートコードの流れを示すためにインデントすることができます。

{{ if $foo -}}
  {{- with .Bar }}Hello{{ end -}}
{{- end -}}

ただし、YAMLは空白文字指向の言語であるため、コードのインデントがその規則に従うことができないことがよくあります。

生成されたテンプレートの空白

生成されたテンプレートの空白の量を最小限に抑えることが望ましいです。特に、多数の空白行が隣接して表示されるべきではありません。ただし、時折の空行(特に論理セクション間)は問題ありません。

これが最適です

apiVersion: batch/v1
kind: Job
metadata:
  name: example
  labels:
    first: first
    second: second

これはOKです

apiVersion: batch/v1
kind: Job

metadata:
  name: example

  labels:
    first: first
    second: second

しかし、これは避けるべきです

apiVersion: batch/v1
kind: Job

metadata:
  name: example





  labels:
    first: first

    second: second

コメント(YAMLコメント vs. テンプレートコメント)

YAMLとHelmテンプレートの両方にコメントマーカーがあります。

YAMLコメント

# This is a comment
type: sprocket

テンプレートコメント

{{- /*
This is a comment.
*/}}
type: frobnitz

テンプレートコメントは、定義済みテンプレートの説明など、テンプレートの機能を文書化する場合に使用する必要があります

{{- /*
mychart.shortname provides a 6 char truncated version of the release name.
*/}}
{{ define "mychart.shortname" -}}
{{ .Release.Name | trunc 6 }}
{{- end -}}

テンプレート内では、デバッグ中にHelmユーザーが(場合によっては)コメントを見ることが有益な場合、YAMLコメントを使用できます。

# This may cause problems if the value is more than 100Gi
memory: {{ .Values.maxMem | quote }}

上記のコメントは、ユーザーがhelm install --debugを実行すると表示されますが、{{- /* */}}セクションで指定されたコメントは表示されません。

特定のテンプレート関数で必要となる可能性のあるHelm値を含むテンプレートセクションに#YAMLコメントを追加することには注意してください。

たとえば、上記の例にrequired関数が導入され、maxMemが設定されていない場合、# YAMLコメントによりレンダリングエラーが発生します。

正しい:helm templateはこのブロックをレンダリングしません

{{- /*
# This may cause problems if the value is more than 100Gi
memory: {{ required "maxMem must be set" .Values.maxMem | quote }}
*/ -}}

不正解:helm templateError: execution error at (templates/test.yaml:2:13): maxMem must be setを返します

# This may cause problems if the value is more than 100Gi
# memory: {{ required .Values.maxMem "maxMem must be set" | quote }}

YAMLコメントがそのまま残されるこの動作の別の例については、テンプレートのデバッグを確認してください。

テンプレートとテンプレート出力でのJSONの使用

YAMLはJSONのスーパーセットです。場合によっては、JSON構文を使用する方が他のYAML表現よりも読みやすくなる可能性があります。

たとえば、このYAMLは、リストを表現する通常のYAMLメソッドに近いものです

arguments:
  - "--dirname"
  - "/foo"

しかし、JSONリストスタイルに折りたたむ方が読みやすくなります

arguments: ["--dirname", "/foo"]

可読性を高めるためにJSONを使用するのは良いことです。ただし、JSON構文は、より複雑な構造を表すために使用しないでください。

(initコンテナの構成など)YAML内に埋め込まれた純粋なJSONを処理する場合は、JSON形式を使用するのが適切です。