變數

掌握了函式、管道、物件和控制結構後,我們可以轉向許多程式語言中更基本的概念:變數。在範本中,它們的使用頻率較低。但我們將看到如何使用它們來簡化程式碼,以及更好地利用 withrange

在前面的範例中,我們看到以下程式碼會失敗

  {{- with .Values.favorite }}
  drink: {{ .drink | default "tea" | quote }}
  food: {{ .food | upper | quote }}
  release: {{ .Release.Name }}
  {{- end }}

Release.Name 不在 with 區塊中限制的範圍內。解決範圍問題的一種方法是將物件賦值給可以在不考慮當前範圍的情況下存取的變數。

在 Helm 範本中,變數是對另一個物件的命名參考。它遵循 $name 的形式。變數使用特殊的賦值運算符 := 進行賦值。我們可以重寫以上內容以使用 Release.Name 的變數。

apiVersion: v1
kind: ConfigMap
metadata:
  name: {{ .Release.Name }}-configmap
data:
  myvalue: "Hello World"
  {{- $relname := .Release.Name -}}
  {{- with .Values.favorite }}
  drink: {{ .drink | default "tea" | quote }}
  food: {{ .food | upper | quote }}
  release: {{ $relname }}
  {{- end }}

請注意,在我們開始 with 區塊之前,我們賦值 $relname := .Release.Name。現在在 with 區塊內,$relname 變數仍然指向發佈名稱。

執行該程式碼將產生以下結果

# Source: mychart/templates/configmap.yaml
apiVersion: v1
kind: ConfigMap
metadata:
  name: viable-badger-configmap
data:
  myvalue: "Hello World"
  drink: "coffee"
  food: "PIZZA"
  release: viable-badger

變數在 range 迴圈中特別有用。它們可以用於類似列表的物件,以捕獲索引和值

  toppings: |-
    {{- range $index, $topping := .Values.pizzaToppings }}
      {{ $index }}: {{ $topping }}
    {{- end }}    

請注意,首先是 range,然後是變數,然後是賦值運算符,最後是列表。這會將整數索引(從零開始)賦值給 $index,並將值賦值給 $topping。執行它將產生以下結果

  toppings: |-
      0: mushrooms
      1: cheese
      2: peppers
      3: onions      

對於同時具有鍵和值的資料結構,我們可以使用 range 來獲取兩者。例如,我們可以像這樣迴圈遍歷 .Values.favorite

apiVersion: v1
kind: ConfigMap
metadata:
  name: {{ .Release.Name }}-configmap
data:
  myvalue: "Hello World"
  {{- range $key, $val := .Values.favorite }}
  {{ $key }}: {{ $val | quote }}
  {{- end }}

現在在第一次迭代中,$key 將是 drink$val 將是 coffee,在第二次迭代中,$key 將是 food$val 將是 pizza。執行以上程式碼將產生以下結果

# Source: mychart/templates/configmap.yaml
apiVersion: v1
kind: ConfigMap
metadata:
  name: eager-rabbit-configmap
data:
  myvalue: "Hello World"
  drink: "coffee"
  food: "pizza"

變數通常不是「全域」的。它們的範圍限定在其聲明的區塊內。之前,我們在範本的頂層賦值了 $relname。該變數將在整個範本中都有效。但在我們的最後一個範例中,$key$val 將僅在 {{ range... }}{{ end }} 區塊內有效。

但是,有一個變數始終是全域的 - $ - 這個變數將始終指向根上下文。當您在範圍內迴圈並且需要知道圖表的發佈名稱時,這非常有用。

一個說明此問題的範例

{{- range .Values.tlsSecrets }}
apiVersion: v1
kind: Secret
metadata:
  name: {{ .name }}
  labels:
    # Many helm templates would use `.` below, but that will not work,
    # however `$` will work here
    app.kubernetes.io/name: {{ template "fullname" $ }}
    # I cannot reference .Chart.Name, but I can do $.Chart.Name
    helm.sh/chart: "{{ $.Chart.Name }}-{{ $.Chart.Version }}"
    app.kubernetes.io/instance: "{{ $.Release.Name }}"
    # Value from appVersion in Chart.yaml
    app.kubernetes.io/version: "{{ $.Chart.AppVersion }}"
    app.kubernetes.io/managed-by: "{{ $.Release.Service }}"
type: kubernetes.io/tls
data:
  tls.crt: {{ .certificate }}
  tls.key: {{ .key }}
---
{{- end }}

到目前為止,我們只看了一個在一個檔案中聲明的範本。但 Helm 範本語言的強大功能之一是它能夠聲明多個範本並一起使用它們。我們將在下一節中討論這個問題。