範本

最佳實務指南的這一部分著重於範本。

templates/ 的結構

templates/ 目錄應按如下方式 structuring:

  • 如果範本檔案產生 YAML 輸出,則應使用 .yaml 副檔名。副檔名 .tpl 可用於不產生格式化內容的範本檔案。
  • 範本檔案名稱應使用連字號表示法 (my-example-configmap.yaml),而不是駝峰式大小寫。
  • 每個資源定義都應位於其自己的範本檔案中。
  • 範本檔案名稱應反映名稱中的資源種類。例如 foo-pod.yamlbar-svc.yaml

已定義範本的名稱

已定義的範本(在 {{ define }} 指令內建立的範本)可全域存取。這表示圖表及其所有子圖表都將能夠存取使用 {{ define }} 建立的所有範本。

因此,所有已定義的範本名稱都應命名空間化。

正確

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

錯誤

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

強烈建議透過 helm create 命令建立新的圖表,因為範本名稱會根據此最佳實務自動定義。

格式化範本

範本應使用兩個空格縮排(絕不使用定位鍵)。

範本指令在大括號之後和之前應有空格

正確

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

錯誤

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

範本應盡可能chomp空格

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

這可以

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 註釋與範本註釋)

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 template 傳回 錯誤:執行錯誤,位於 (templates/test.yaml:2:13):必須設定 maxMem

# 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 語法來表示更複雜的結構。

在處理嵌入在 YAML 內部的純 JSON(例如 init 容器設定)時,當然適合使用 JSON 格式。