变量

    在之前的例子中,我们看到下面的代码会失败:

    Release.Name 不在with块的限制范围内。解决作用域问题的一种方法是将对象分配给可以不考虑当前作用域而访问的变量。

    Helm模板中,变量是对另一个对象的命名引用。遵循$name变量的格式且指定了一个特殊的赋值运算符::=。 我们可以使用针对Release.Name的变量重写上述内容。

    1. apiVersion: v1
    2. kind: ConfigMap
    3. metadata:
    4. name: {{ .Release.Name }}-configmap
    5. data:
    6. myvalue: "Hello World"
    7. {{- $relname := .Release.Name -}}
    8. {{- with .Values.favorite }}
    9. drink: {{ .drink | default "tea" | quote }}
    10. food: {{ .food | upper | quote }}
    11. release: {{ $relname }}
    12. {{- end }}

    运行之后会生成以下内容:

    变量在range循环中特别有用。可以用于类似列表的对象,以捕获索引和值:

    1. toppings: |-
    2. {{- end }}

    注意先是range,然后是变量,然后是赋值运算符,然后是列表。会将整型索引(从0开始)赋值给$index并将值赋值给$topping。 执行会生成:

    1. apiVersion: v1
    2. kind: ConfigMap
    3. metadata:
    4. name: {{ .Release.Name }}-configmap
    5. data:
    6. myvalue: "Hello World"
    7. {{- range $key, $val := .Values.favorite }}
    8. {{ $key }}: {{ $val | quote }}
    9. {{- end }}

    第一次迭代,$key会是drink$val会是coffee,第二次迭代$key会是food$val会是pizza。 运行之后会生成:

    变量一般不是”全局的”。作用域是其声明所在的块。上面我们在模板的顶层赋值了。变量的作用域会是整个模板。 但在最后一个例子中$key$val作用域会在{{ range... }}{{ end }}块内。

    但有个变量一直是全局的 - $ - 这个变量一直是指向根的上下文。当在一个范围内循环时会很有用,同时你要知道chart的版本名称。

    1. {{- range .Values.tlsSecrets }}
    2. apiVersion: v1
    3. kind: Secret
    4. metadata:
    5. labels:
    6. # Many helm templates would use `.` below, but that will not work,
    7. # however `$` will work here
    8. app.kubernetes.io/name: {{ template "fullname" $ }}
    9. # I cannot reference .Chart.Name, but I can do $.Chart.Name
    10. helm.sh/chart: "{{ $.Chart.Name }}-{{ $.Chart.Version }}"
    11. app.kubernetes.io/instance: "{{ $.Release.Name }}"
    12. # Value from appVersion in Chart.yaml
    13. app.kubernetes.io/version: "{{ $.Chart.AppVersion }}"
    14. app.kubernetes.io/managed-by: "{{ $.Release.Service }}"
    15. type: kubernetes.io/tls
    16. data:
    17. tls.crt: {{ .certificate }}
    18. tls.key: {{ .key }}

    到目前为止,我们只看到在一个文件声明的一个模板。但是Helm模板语言一个很强大的特性是能够声明多个模板并将它们一起使用。 我们将在下一节讨论这个问题。