Helm Template语法

_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/v1
kind: Deployment
metadata:
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
# 例子1:
env:
{{- include "xiaomage" . }}
# 结果:
env:
- name: name
value: xiaomage
- name: age
value: secret
- name: favourite
value: "Cloud Native DevSecOps"
- name: wechat
value: majinghe11
# 例子2:
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: v1
    kind: ConfigMap
    metadata:
    name: {{ .Release.Name }}-configmap
    data:
    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: v1
    kind: ConfigMap
    metadata:
    name: mychart-configmap
    data:
    myvalue: "Hello World"
    course: k8s
    # 编辑 mychart/values.yaml,在最后加入
    course:
    k8s: klvchen
    python: lily
    cat mychart/templates/configmap.yaml
    apiVersion: v1
    kind: ConfigMap
    metadata:
    name: {{ .Release.Name }}-configmap
    data:
    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: v1
    kind: ConfigMap
    metadata:
    name: mychart-configmap
    data:
    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 }}

本博客所有文章除特别声明外,均采用 CC BY-SA 4.0 协议 ,转载请注明出处!