_helpers.tpl 在chart中以 “下划线” 开头的文件,称为”子模版”.
例如在 _helper.tpl
中定义子模块,格式:{{- define "模版名字" -}}
模版内容 {{- end -}}
1 2 3 4 {{- define "nginx.name" -}} {{- default .Chart.Name .Values.nameOverride | trunc 63 | trimSuffix "-" -}} {{- end -}} # 若 .Values.nameOverride 为空,则默认值为 .Chart.Name
引用模板,格式:{{ include "模版名字" 作用域}}
1 2 3 4 apiVersion: apps/v1kind: Deploymentmetadata: name: {{ include "nginx.fullname" . }}
内置对象 Build-in Objects: https://helm.sh/docs/chart_template_guide/builtin_objects/
Chart 预定义对象可直接在各模板中使用。
1 2 3 4 5 6 7 8 9 Release : 代表Release 对象,属性包含:Release .Name、Release .Namespace、Release .Revision等Values : 表示 values .yaml 文件数据 Chart: 表示 Chart.yaml 数据 Files: 用于访问 chart 中非标准文件 Capabilities: 用于获取 k8s 集群的一些信息 - Capabilities.KubeVersion.Major:K8s的主版本Template : 表示当前被执行的模板 - Name :表示模板名,如:mychart/templates/mytemplate.yaml - BasePath:表示路径,如:mychart/templates
变量 默认情况点( . ), 代表全局作用域,用于引用全局对象。
helm 全局作用域中有两个重要的全局对象:Values 和 Release
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 # Values # 这里引用了全局作用域下的Values 对象中的key 属性。 { { . Values . key } } Values 代表的就是values . yaml 定义的参数,通过. Values 可以引用任意参数。 例子:{ { . Values . replicaCount } } # 引用嵌套对象例子,跟引用json 嵌套对象类似{ { . Values . image . repository } } # Release 其代表一次应用发布,下面是Release 对象包含的属性字段:Release . Name - release 的名字,一般通过Chart . yaml 定义,或者通过helm 命令在安装应用的时候指定。Release . Time - release 安装时间Release . Namespace - k8s 名字空间Release . Revision - release 版本号,是一个递增值,每次更新都会加一Release . IsUpgrade - true 代表,当前release 是一次更新. Release . IsInstall - true 代表,当前release 是一次安装Release . Service : - The service that is rendering the present template . On Helm , this is always Helm .
自定义模版变量。
1 2 3 4 5 # 变量名以$开始命名, 赋值运算符是 := (冒号+等号) {{- $relname : = .Release.Name -}} 引用自定义变量: #不需要 . 引用 {{ $relname }}
include include是一个函数,所以他的输出结果是可以传给其他函数的
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 env: {{- include "xiaomage" . }} env: - name: name value: xiaomage - name: age value: secret - name: favourite value: "Cloud Native DevSecOps" - name: wechat value: majinghe11 env: {{- include "xiaomage" . | indent 8 }} env: - name: name value: xiaomage - name: age value: secret - name: favourite value: "Cloud Native DevSecOps" - name: wechat value: majinghe11
with with关键字可以控制变量的作用域,主要就是用来修改 . 作用域的,默认 . 代表全局作用域,with 语句可以修改 . 的含义
1 2 3 4 5 6 # 例子: # .Values.favorite 是一个 object 类型 {{- with .Values.favorite }} drink: {{ .drink | default "tea" | quote }} # 相当于.Values.favorite.drink food: {{ .food | upper | quote }} {{- end }}
toYaml 转 yaml 将数据转为yaml格式
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 spec: strategy: {{ toYaml .Values.strategy | indent 4 }} ------------------------------------------------------------------ values.yaml数据: strategy: type: RollingUpdate rollingUpdate: maxUnavailable: 0 ------------------------------------------------------------------ 渲染效果: spec: strategy: type: RollingUpdate rollingUpdate: maxUnavailable: 0
区别:nindent & indent
nindent 为向右移动 N 个缩进
indent 为向左的缩进。
Values 对象 values 对象的值有四个来源:
chart 包中的 values.yaml 文件
父 chart 包的 values.yaml 文件
使用 helm install 或者 helm upgrade 的 -f 或者 –values 参数传入的自定义的 yaml 文件
通过 –set 参数传入的值1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 cat global.yaml course: k8s cat mychart/templates/ configmap.yaml apiVersion: v1kind: ConfigMapmetadata: name: {{ .Release.Name }}-configmapdata: myvalue: "Hello World" course: {{ .Values.course }} helm install --name mychart --dry-run --debug -f global.yaml ./mychart/ helm install --name mychart --dry-run --debug --set course="k8s" ./mychart/ # 运行部分结果: # Source: mychart/templates/configmap.yaml apiVersion: v1kind: ConfigMapmetadata: name: mychart-configmapdata: myvalue: "Hello World" course: k8s# 编辑 mychart/values.yaml,在最后加入 course: k8s: klvchen python: lily cat mychart/templates/ configmap.yaml apiVersion: v1kind: ConfigMapmetadata: name: {{ .Release.Name }}-configmapdata: myvalue: "Hello World" k8s: {{ quote .Values.course.k8s }} # quote 叫双引号 python: {{ .Values.course.python }} helm install --name mychart --dry-run --debug ./mychart/ # 运行结果: # Source: mychart/templates/configmap.yaml apiVersion: v1kind: ConfigMapmetadata: name: mychart-configmapdata: myvalue: "Hello World" k8s: "klvchen" python: lily
管道
k8s: {{ quote .Values.course.k8s }}
# 加双引号
k8s: {{ .Values.course.k8s | upper | quote }}
# 大写字符串加双引号
k8s: {{ .Values.course.k8s | upper | quote }}
# 加双引号和重复3次字符串
if/else 条件 if/else 块是用于在模板中有条件地包含文本块的方法,条件块的基本结构
1 2 3 4 5 6 7 {{ if PIPELINE }} # Do something {{ else if OTHER PIPELINE }} # Do something else {{ else }} # Default case {{ end }}
判断条件,如果值为以下几种情况,管道的结果为 false:
一个布尔类型的假
一个数字零
一个空的字符串
一个 nil(空或null)
一个空的集合(map, slice, tuple, dict, array)
除了上面的这些情况外,其他所有的条件都为真。
常用的关系运算符>、 >=、 <、!=、与或非在helm模版中都以函数的形式实现。
关系运算函数定义:
eq 相当于 =
ne 相当于 !=
lt 相当于 <=
gt 相当于 >=
and 相当于 &&
or 相当于 ||
not 相当于 !
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 # 例子 cat mychart/templates/configmap.yaml apiVersion: v1 kind: ConfigMap metadata: name: {{ .Release.Name }} -configmap data: myvalue: {{ .Values.hello | default "Hello World" | quote }} k8s: {{ .Values.course.k8s | upper | quote | repeat 3 }} python: {{ .Values.course.python | repeat 3 | quote }} {{ if eq .Values.course.python "django" }} web: true {{ end }} helm install --name mychart --dry-run --debug ./mychart/ 运行部分结果: # Source: mychart/templates/configmap.yaml apiVersion: v1 kind: ConfigMap metadata: name: mychart-configmap data: myvalue: "Hello World" k8s: "KLVCHEN""KLVCHEN""KLVCHEN" python: "djangodjangodjango" web: true # 空格控制 {{- if eq .Values.course.python "django" }} web: true {{- end }} 如果要实现: {{- if eq .Values.isCar true }} OR {{- if eq .Values.isBus true }} # do something {{- end }} 功能,可以执行如下判断: {{- if or (eq .Values.gitdev.enable "true" ) (eq .Values.gitpreftest.enable "true" ) }} - name: galaxymxsdk-logs-pvc {{- if eq .Values.pvc.enabled "true" }} #如果values.pvc.enabled的值等于true,则存储用pvc,否则(不为true)用空卷 persistentVolumeClaim: claimName: {{ .Values.pvc.name }} {{- else }} emptyDir: {} {{- end }} values值为: pvc: enabled: "true" name: logs-pvc 通过dd测试是否有用cfs持久存储:dd if=/dev/zero of=test bs=1M count=1000 区别存在判断: - name: galaxymxsdk-logs-pvc {{- if .Values.pvc }} #如果存在values.pvc,则存储用pvc,否则(不存在)用空卷 persistentVolumeClaim: claimName: {{ .Values.pvc.name }} {{- else }} emptyDir: {} {{- end }}
With 关键字 with 关键字可以控制变量的作用域
{{ .Release.xxx }}
其中的.就是表示对当前范围的引用,.Values就是告诉模板在当前范围中查找Values对象的值。
with 语句可以允许将当前范围 . 设置为特定的对象,比如前面一直使用的.Values.course,可以使用 with 来将范围指向 .Values.course:(templates/configmap.yaml)
with主要就是用来修改 . 作用域的,默认 . 代表全局作用域,with语句可以修改.的含义.
1 2 3 4 5 6 7 8 9 10 语法: {{ with 引用的对象 }} 这里可以使用 . (点), 直接引用with指定的对象 {{ end }} 例子: #.Values.favorite是一个object类型 {{- with .Values.favorite }} drink: {{ .drink | default "tea" | quote }} #相当于.Values.favorite.drink food: {{ .food | upper | quote }} {{- end }}
range 关键字 range主要用于循环遍历数组类型。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 语法1: # 遍历map类型,用于遍历键值对象 # 变量key代表对象的属性名,val代表属性值 {{- range key,val : = 键值对象 }} {{ $key }} : {{ $val | quote }} {{- end}} 语法2: {{- range 数组 }} {{ . | title | quote }} # . (点),引用数组元素值,title即为把单词首字母大写,quote则为加引号,以字符串形式展示 #如果不需要任何形式的应用,直接用: {{ . }} {{- end }} 例子: # values.yaml定义 # map类型 favorite: drink: coffee food: pizza # 数组类型 pizzaToppings: - mushrooms - cheese - peppers - onions # map类型遍历例子: {{- range $key, $val : = .Values.favorite }} {{ $key }} : {{ $val | quote }} {{- end}} # 数组类型遍历例子: {{- range .Values.pizzaToppings}} {{ . | quote }} {{- end}}
常用函数: 1 2 3 4 5 6 7 8 1. quote 函数,将值渲染模板时候,以字符串方式引用. 2. upper 函数,将小写字母转换为大写 3. repeat 函数,写法repeat n 是将参数复制n遍 4. default 函数,用法default "tee" 给一个默认的参数,建议将静态的参数都写入values.yaml drink: {{ .Values.favorite.drink | default "tea" | quote }} 5. title 函数,首字母大写 6. indent 函数,缩进字符,以空格为单位 {{ toYaml .Values.strategy | indent 4 }}