在编程语言中还有一个很重要的概念“变量”,在 Helm 模板中也有变量,只是使用变量的场合不是特别多,但是在合适的时候使用变量可以很好的解决我们的问题。如变量搭配
with
和range
使用,可以有效的简化代码。
- 在 Helm 模板中,变量是对另一个对象的命名引用。
1、变量的定义和使用
变量的格式定义:$name := value
,其中 :=
被称为赋值运算符,$name
为变量,value
为值。
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 }}
在该例{{- $relname := .Release.Name -}}
中,定义了一个变量 $relname
,在 release: {{ $relname }}
中使用了这个变量。
2、使用变量解决对象作用域问题
在前面的例子中,我们看到这段代码会失败:
{{- with .Values.favorite}}
drink: {{ .drink | default "tea" | quote }}
food: {{ .food | upper | quote }}
release: {{ .Release.Name }}
{{- end }}
Release.Name
不在该 with 块中限制的范围内。解决作用域范围问题的一种方法是将对象分配给可以在不考虑当前范围的情况下访问的变量。我们可以使用变量重写上面的 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
,其中relname 变量仍然指向的是
.Release.Name`。执行模板结果如下:
# 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
可以看到已经正常了。
3、变量与range的结合
变量在 range 循环中特别有用。它们可以用于类似列表的对象以同时捕获 索引 和 值:
toppings: |-
{{- range $index, $topping := .Values.pizzaToppings }}
{{ $index }}: {{ $topping }}
{{- end }}
我们在range循环中使用 $index
和 $course
两个变量来接收后面 列表 循环的索引和对应的值,这将分配整数索引(从零开始)给 $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
、$val
来接收字段 .Values.favorite
的键和值。在第一次迭代中,$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"
4、全局变量$
变量通常不是 “全局” 的。它们的范围是它们所在的块。之前,我们在模板的顶层赋值 $relname
。该变量将在整个模板的范围内起作用。但在我们的最后一个例子中,$key
和 $val
只会在该 {{ range... }}{{ end }}
块的范围内起作用。
但有个变量一直是全局的 $
, 这个变量一直是指向根的上下文。当在一个范围内循环时会很有用,同时你要知道chart的版本名称。
举例说明如下:
{{- 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 }}
评论区