变量

在掌握了函数、管道、对象和控制结构之后,我们可以转向许多编程语言中更基本的概念之一:变量。在模板中,它们的使用频率较低。但我们将看到如何使用它们来简化代码,以及如何更好地利用 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 模板语言的一个强大功能是能够声明多个模板并将其组合使用。我们将在下一节中讨论这一点。