子圖表和全域值

到目前為止,我們只使用了一個圖表。但是圖表可以具有也具有自己的值和範本的依賴關係,稱為 子圖表。在本節中,我們將建立一個子圖表,並查看我們可以從範本內部訪問值的各種方式。

在深入研究程式碼之前,需要了解一些關於應用程式子圖表的重要細節。

  1. 子圖表被認為是「獨立的」,這意味著子圖表永遠不能明確地依賴於其父圖表。
  2. 因此,子圖表無法訪問其父圖表的值。
  3. 父圖表可以覆蓋子圖表的值。
  4. 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.yamlmysubchart/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 圖表。

雖然圖表開發人員可以在 includetemplate 之間進行選擇,但使用 include 的一個優點是 include 可以動態地引用範本

{{ include $mytemplate }}

以上將取消引用 $mytemplate。相比之下,template 函式將只接受字串字面量。

避免使用區塊

Go 範本語言提供了一個 block 關鍵字,允許開發人員提供稍後被覆蓋的預設實現。在 Helm 圖表中,區塊不是覆蓋的最佳工具,因為如果提供了同一區塊的多個實現,則選擇哪一個是不可預測的。

建議改用 include