範本函式與管線
到目前為止,我們已經了解如何將資訊放入範本中。但是這些資訊會原封不動地放入範本中。有時候我們想要轉換提供的數據,使其對我們更有用。
讓我們從最佳實務開始:將字串從 .Values
物件注入範本時,我們應該將這些字串加上引號。我們可以使用範本指令中的 quote
函式來做到這一點
apiVersion: v1
kind: ConfigMap
metadata:
name: {{ .Release.Name }}-configmap
data:
myvalue: "Hello World"
drink: {{ quote .Values.favorite.drink }}
food: {{ quote .Values.favorite.food }}
範本函式遵循語法 functionName arg1 arg2...
。在上面的程式碼片段中,quote .Values.favorite.drink
會呼叫 quote
函式,並傳遞單一參數。
Helm 有超過 60 個可用的函式。其中一些是由 Go 範本語言 本身定義的。大多數其他函式是 Sprig 範本庫 的一部分。我們將在範例中看到其中許多函式。
雖然我們將「Helm 範本語言」稱為 Helm 特定的語言,但它實際上是 Go 範本語言、一些額外函式,以及用於將某些物件公開給範本的各種包裝器的組合。當您學習範本時,許多關於 Go 範本的資源可能會有所幫助。
管線
範本語言的強大功能之一是其「管線」的概念。管線借鑒了 UNIX 的概念,是一種將一系列範本命令鏈接在一起的工具,用於簡潔地表達一系列轉換。換句話說,管線是一種有效率地按順序完成多項任務的方法。讓我們使用管線重寫上面的範例。
apiVersion: v1
kind: ConfigMap
metadata:
name: {{ .Release.Name }}-configmap
data:
myvalue: "Hello World"
drink: {{ .Values.favorite.drink | quote }}
food: {{ .Values.favorite.food | quote }}
在此範例中,我們沒有呼叫 quote ARGUMENT
,而是反轉了順序。我們使用管線 (|
) 將參數「發送」到函式:.Values.favorite.drink | quote
。使用管線,我們可以將多個函式鏈接在一起
apiVersion: v1
kind: ConfigMap
metadata:
name: {{ .Release.Name }}-configmap
data:
myvalue: "Hello World"
drink: {{ .Values.favorite.drink | quote }}
food: {{ .Values.favorite.food | upper | quote }}
反轉順序在範本中是一種常見的做法。您會更常看到
.val | quote
,而不是quote .val
。兩種做法都可以。
評估時,該範本將產生以下內容
# Source: mychart/templates/configmap.yaml
apiVersion: v1
kind: ConfigMap
metadata:
name: trendsetting-p-configmap
data:
myvalue: "Hello World"
drink: "coffee"
food: "PIZZA"
請注意,我們原本的 pizza
現在已轉換為 "PIZZA"
。
以這種方式將參數通過管線傳遞時,第一次評估的結果 (.Values.favorite.drink
) 會作為「函式的最後一個參數」發送。我們可以修改上面的飲料範例,以說明採用兩個參數的函式:repeat COUNT STRING
apiVersion: v1
kind: ConfigMap
metadata:
name: {{ .Release.Name }}-configmap
data:
myvalue: "Hello World"
drink: {{ .Values.favorite.drink | repeat 5 | quote }}
food: {{ .Values.favorite.food | upper | quote }}
repeat
函式會將給定的字串重複給定的次數,因此我們將獲得以下輸出
# Source: mychart/templates/configmap.yaml
apiVersion: v1
kind: ConfigMap
metadata:
name: melting-porcup-configmap
data:
myvalue: "Hello World"
drink: "coffeecoffeecoffeecoffeecoffee"
food: "PIZZA"
使用 default
函式
範本中經常使用的一個函式是 default
函式:default DEFAULT_VALUE GIVEN_VALUE
。此函式允許您在範本內指定預設值,以防省略該值。讓我們使用它來修改上面的飲料範例
drink: {{ .Values.favorite.drink | default "tea" | quote }}
如果我們照常執行此操作,我們將獲得 coffee
# Source: mychart/templates/configmap.yaml
apiVersion: v1
kind: ConfigMap
metadata:
name: virtuous-mink-configmap
data:
myvalue: "Hello World"
drink: "coffee"
food: "PIZZA"
現在,我們將從 values.yaml
中移除最喜歡的飲料設定
favorite:
#drink: coffee
food: pizza
現在重新執行 helm install --dry-run --debug fair-worm ./mychart
將產生以下 YAML
# Source: mychart/templates/configmap.yaml
apiVersion: v1
kind: ConfigMap
metadata:
name: fair-worm-configmap
data:
myvalue: "Hello World"
drink: "tea"
food: "PIZZA"
在實際的圖表中,所有靜態預設值都應該位於 values.yaml
中,並且不應該使用 default
命令重複(否則它們會是多餘的)。但是,default
命令非常適合計算值,這些值無法在 values.yaml
中宣告。例如
drink: {{ .Values.favorite.drink | default (printf "%s-tea" (include "fullname" .)) }}
在某些情況下,if
條件防護可能比 default
更適合。我們將在下一個章節中看到這些。
範本函式和管線是一種強大的方法,可以轉換資訊,然後將其插入您的 YAML 中。但有時需要添加一些比僅插入字串更複雜的範本邏輯。在下一個章節中,我們將探討範本語言提供的控制結構。
使用 lookup
函式
lookup
函式可用於「查詢」執行中叢集中的資源。lookup 函式的語法為 lookup apiVersion, kind, namespace, name -> resource or resource list
。
參數 | 類型 |
---|---|
apiVersion | 字串 |
種類 | 字串 |
命名空間 | 字串 |
名稱 | 字串 |
name
和 namespace
都是可選的,並且可以作為空字串 (""
) 傳遞。
以下參數組合是可能的
行為 | 查詢函式 |
---|---|
kubectl get pod mypod -n mynamespace | lookup "v1" "Pod" "mynamespace" "mypod" |
kubectl get pods -n mynamespace | lookup "v1" "Pod" "mynamespace" "" |
kubectl get pods --all-namespaces | lookup "v1" "Pod" "" "" |
kubectl get namespace mynamespace | lookup "v1" "Namespace" "" "mynamespace" |
kubectl get namespaces | lookup "v1" "Namespace" "" "" |
當 lookup
返回一個物件時,它將返回一個字典。可以進一步瀏覽此字典以提取特定值。
以下範例將返回 mynamespace
物件的註解
(lookup "v1" "Namespace" "" "mynamespace").metadata.annotations
當 lookup
返回物件列表時,可以透過 items
欄位存取物件列表
{{ range $index, $service := (lookup "v1" "Service" "mynamespace" "").items }}
{{/* do something with each service */}}
{{ end }}
當找不到物件時,將返回空值。這可以用於檢查物件是否存在。
lookup
函式使用 Helm 現有的 Kubernetes 連線組態來查詢 Kubernetes。如果在與呼叫 API 伺服器互動時返回任何錯誤(例如,由於缺乏存取資源的權限),Helm 的範本處理將會失敗。
請記住,Helm 不應該在 helm template|install|upgrade|delete|rollback --dry-run
操作期間與 Kubernetes API 伺服器聯繫。要針對執行中的叢集測試 lookup
,應該改用 helm template|install|upgrade|delete|rollback --dry-run=server
來允許叢集連線。
運算子是函式
對於範本,運算子 (eq
、ne
、lt
、gt
、and
、or
等等) 都是作為函式實作的。在管線中,運算可以使用括號 ((
和 )
) 進行分組。
現在,我們可以從函式和管線轉向使用條件、迴圈和範圍修飾符的流程控制。