範本
最佳實務指南的這一部分著重於範本。
templates/
的結構
templates/
目錄應按如下方式 structuring:
- 如果範本檔案產生 YAML 輸出,則應使用
.yaml
副檔名。副檔名.tpl
可用於不產生格式化內容的範本檔案。 - 範本檔案名稱應使用連字號表示法 (
my-example-configmap.yaml
),而不是駝峰式大小寫。 - 每個資源定義都應位於其自己的範本檔案中。
- 範本檔案名稱應反映名稱中的資源種類。例如
foo-pod.yaml
、bar-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 格式。