一、Chart模板:函数与管道
常用函数:
• quote:将值转换为字符串,即加双引号
• default:设置默认值,如果获取的值为空则为默认值
• indent和nindent:缩进字符串
• toYaml:引用一块YAML内容
• 其他函数:upper(转换为大写)、title(只首字母大写)等
1.1 quote:将值转换为字符串,即加双引号
示例:nodeSelector标签的值用了true正常使用会报错,这是因为它是关键字,需要加引号才可以。
# values.yaml
nodeSelector:
gpu: true
# templates/deployment.yaml
…
nodeSelector:
disktype: {{ quote .Values.nodeSelector.gpu }}
输出效果:
# templates/deployment.yaml
…
nodeSelector:
disktype: "true"
1.2 default:设置默认值,如果获取的值为空则为默认值
示例:以防止忘记定义而导致模板文件缺少字段无法创建资源,这时可以为字段定义一个默认值。
image: {{ .Values.image.repository }}:{{ .Values.image.tag | default "latest" }}
这里用到了管道符“|”,前面的值传递后函数验证是否为空。
假如.Values.image.tag
这个变量值为空,输出效果就如下:
image: nginx:latest
1.3 indent和nindent函数
indent和nindent函数都是缩进字符串,主要区别在于nindent会在缩进前多添加一个换行符。
示例:
apiVersion: apps/v1
kind: Deployment
metadata:
labels:
app: {{ .Release.Name | indent 6 }}
app: {{ .Release.Name | nindent 6 }}
...
后面的数字6,标识往后缩进6个字符
示例效果:
apiVersion: apps/v1
kind: Deployment
metadata:
labels:
app: web-ng
app:
web-ng
...
1.4 toYaml:引用一块YAML内容
示例:在values.yaml里写结构化数据,引用内容块
# values.yaml
resources:
limits:
cpu: 100m
memory: 128Mi
requests:
cpu: 100m
memory: 128Mi
deployment.yaml引用values.yaml的变量值,并换行缩进10个字符
# templates/deployment.yaml
...
resources:
{{ toYaml .Values.resources | nindent 10 }}
deployment.yaml输出的效果:
# templates/deployment.yaml
...
resources:
limits:
cpu: 100m
memory: 128Mi
requests:
cpu: 100m
memory: 128Mi
二、Chart模板:流程控制
Helm模板语言提供以下流程控制语句:
• if/else:条件判断
• range:循环
• with:指定变量作用域
2.1 流程控制之if/else
# values.yaml
ingress:
enabled: false
# templates/ingress.yaml
{{ if .Values.ingress.enabled }}
apiVersion: networking.k8s.io/v1
kind: Ingress
metadata:
name: web
spec:
rules:
- host: www.ctnrs.com
http:
paths:
- path: /
pathType: Prefix
backend:
service:
name: web
port:
number: 80
{{ end }}
测试:helm install test --set ingress.enabled=true --dry-run mychart
,效果为:不填充if包裹的内容
2.2 流程控制之range
# cat values.yaml
test:
- 1
- 2
- 3
# templates/configmap.yaml
apiVersion: v1
kind: ConfigMap
metadata:
name: {{ .Release.Name }}
data:
test: |
{{- range .Values.test }}
{{ . }} # 引用当前元素
{{- end }}
输出效果:
# templates/configmap.yaml
apiVersion: v1
kind: ConfigMap
metadata:
name: web-ng
data:
test:
- 1
- 2
- 3
2.3 流程控制之with
with语句可以允许将当前范围 . 设置为特定的对象,比如我们前面一直使用
的 .Values.nodeSelecotr,我们可以使用 with来将 . 范围指向 .Values.nodeSelecotr
# cat values.yaml
...
nodeSelector:
team: a
gpu: yes
# cat templates/deployment.yaml
...
{{- with .Values.nodeSelector }}
nodeSelector:
team: {{ .team }}
gpu: {{ .gpu }}
{{- end }}
填充后的效果:
# templates/deployment.yaml
...
nodeSelector:
team: a
gpu: yes
三、Chart模板:命名模板
命名模板类似于开发语言中的函数。指一段可以直接被另一段程序或代码引用的程序或代码。
在编写chart时,可以将一些重复使用的内容写在命名模板文件中供公共使用,这样可减少重
复编写程序段和简化代码结构。
命名模块使用define定义,template或include引入,在templates目录中默认下划线开头的
文件为公共模板(helpers.tpl)。
定义模板:
示例:资源名称生成指令放到公共模板文件,作为所有资源名称
# cat templates/_helpers.tpl 注意是在_helpers.tpl文件写模板
{{- define "fullname" -}}
{{- .Chart.Name -}}-{{ .Release.Name }}
{{- end -}}
# cat templates/deployment.yaml
apiVersion: apps/v1
kind: Deployment
metadata:
name: {{ template "fullname" . }}
...
使用模板:
template指令是将一个模板包含在另一个模板中的方法。但是,template函
数不能用于Go模板管道。为了解决该问题,引入include指令。(平时我们用include就行)
示例:
1 定义:
# cat _helpers.tpl
{{- define "labels" -}}
app: {{ template "fullname" . }}
chart: "{{ .Chart.Name }}-{{ .Chart.Version }}"
release: "{{ .Release.Name }}"
{{- end -}}
2 使用:
# cat deployment.yaml
apiVersion: apps/v1
kind: Deployment
metadata:
name: {{ include "fullname" . }}
labels:
{{- include "labels" . | nindent 4 }}
...