1)if
修改values.yaml
cat > values.yaml <<EOF
myname: aming
service:
type: ClusterIP
port: 80
myport: 8080
EOF
修改service.yaml
cat > templates/service.yaml <<EOF
apiVersion: v1
kind: Service
metadata:
name: testserivce
labels:
app: myapp
spec:
type: {{ .Values.service.type }}
ports:
{{- if eq .Values.web "nginx" }}
- port: {{ .Values.service.port }}
{{- else }}
- port: {{ .Values.service.myport }}
{{- end }}
targetPort: http
protocol: TCP
name: http
EOF
说明:在if else end 左边加-,是为了去掉空行。{{- 表示删除左边的所有空格,直到非空格字符,而 -}}表示删除右边的所有空格。注意,换行符也是空格,当然还包括空格,TAB字符
渲染
helm template testrelease . --set web=nginx
ports:
- port: 80
如果不定义web变量的值,port为8080
helm template testrelease .
ports:
- port: 8080
2)with 限定作用域
with 的语法类似简单的 if:
{{ with PIPELINE }}
# restricted scope
{{ end }}
没有用 with 的例子:
values.yaml:
env:
host: localhost
user: test
hello: world
deployment.yaml 的引用:
{{- if .Values.env }}
env:
- name: host
value: {{ .Values.env.host }}
- name: user
value: {{ .Values.env.user }}
- name: hello
value: {{ .Values.env.hello }}
{{- end }}
上面的变量引用都需要从.Values开始, 有点繁琐。
with 的例子:
deployment.yaml 添加 with 以后:
{{- with .Values.env }}
env:
- name: host
value: {{ .host }}
- name: user
value: {{ .user }}
- name: hello
value: {{ .hello }}
{{- end }}
with 语句块里, 把当前范围定义在了.Values.env这个变量上了。
渲染后结果:
env:
- name: host
value: localhost
- name: user
value: test
- name: hello
value: world
3)range 实现循环
在values.yaml 文件中添加上一个变量列表:
cat > values.yaml <<EOF
myname: aming
service:
type: ClusterIP
port: 80
myport: 8080
test:
- 1
- 2
- 3
EOF
循环打印该列表:
cat > templates/configmap.yaml <<EOF
apiVersion: v1
kind: ConfigMap
metadata:
name: {{ .Release.Name }}-configmap
data:
myvalue: "Hello World"
myname: {{ quote .Values.myname }}
test: |
{{- range .Values.test }}
- {{ . }} ##遍历循环打印所有元素
{{- end }}
EOF
渲染
helm template testrelease .
test: |
- 1
- 2
- 3
变量在模板中,使用变量的场合不多,但个别情况下不得不使用变量。
问题 1:获取数组键值
values.yaml
env:
NAME: "gateway"
JAVA_OPTS: "-Xmx1G"
deployment.yaml
...
env:
{{- range $k, $v := .Values.env }}
- name: {{ $k }}
value: {{ $v | quote }}
{{- end }}
结果如下
env:
- name: JAVA_OPTS
value: "-Xmx1G"
- name: NAME
value: "gateway"
上面在 range 循环中使用 $k 和 $v 两个变量来接收后面列表循环的键和值。
问题 2:with 中不能使用内置对象
with 语句块内不能带 .Release.Name 对象,否则报错。我们可以将该对象赋值给一个变量可以来解决这个问题:
apiVersion: apps/v1
kind: Deployment
metadata:
name: {{ .Release.Name }}-deployment
spec:
replicas: {{ .Values.replicas }}
template:
metadata:
labels:
project: {{ .Values.label.project }}
app: {{ quote .Values.label.app }}
{{- with .Values.label }}
project: {{ .project }}
app: {{ .app }}
release: {{ .Release.Name }}
{{- end }}