子圖表和全域值
到目前為止,我們只使用了一個圖表。但是圖表可以具有也具有自己的值和範本的依賴關係,稱為 子圖表。在本節中,我們將建立一個子圖表,並查看我們可以從範本內部訪問值的各種方式。
在深入研究程式碼之前,需要了解一些關於應用程式子圖表的重要細節。
- 子圖表被認為是「獨立的」,這意味著子圖表永遠不能明確地依賴於其父圖表。
- 因此,子圖表無法訪問其父圖表的值。
- 父圖表可以覆蓋子圖表的值。
- 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
的 父 圖表。這種關係完全基於 mysubchart
位於 mychart/charts
內的事實。
因為 mychart
是一個父圖表,所以我們可以在 mychart
中指定配置,並將該配置推送到 mysubchart
。例如,我們可以像這樣修改 mychart/values.yaml
favorite:
drink: coffee
food: pizza
pizzaToppings:
- mushrooms
- cheese
- peppers
- onions
mysubchart:
dessert: ice cream
請注意最後兩行。mysubchart
部分內的任何指令都將發送到 mysubchart
圖表。因此,如果我們執行 helm install --generate-name --dry-run --debug mychart
,我們將看到的一件事是 mysubchart
ConfigMap
# 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.yaml
和 mysubchart/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
圖表。
雖然圖表開發人員可以在 include
和 template
之間進行選擇,但使用 include
的一個優點是 include
可以動態地引用範本
{{ include $mytemplate }}
以上將取消引用 $mytemplate
。相比之下,template
函式將只接受字串字面量。
避免使用區塊
Go 範本語言提供了一個 block
關鍵字,允許開發人員提供稍後被覆蓋的預設實現。在 Helm 圖表中,區塊不是覆蓋的最佳工具,因為如果提供了同一區塊的多個實現,則選擇哪一個是不可預測的。
建議改用 include
。