Helm 通过模板创建 Kubernetes 能够理解的 YAML 格式的资源配置文件,我们将通过例子来学习如何使用模板。
以
templates/secrets.yaml
为例:
从结构看,文件的内容非常像 Secret 配置,只是大部分属性值变成了
{{ xxx }}
。这些
{{ xxx }}
实际上是模板的语法。Helm 采用了 Go 语言的模板来编写 chart。Go 模板非常强大,支持变量、对象、函数、流控制等功能。下面我们通过解析
templates/secrets.yaml
快速学习模板。
①
{{ template "mysql.fullname" . }}
定义 Secret 的
name
。
关键字
template
的作用是引用一个子模板
mysql.fullname
。这个子模板是在
templates/_helpers.tpl
文件中定义的。
这个定义还是很复杂的,因为它用到了模板语言中的对象、函数、流控制等概念。现在看不懂没关系,这里我们学习的重点是:
如果存在一些信息多个模板都会用到,则可在
templates/_helpers.tpl
中将其定义为子模板,然后通过
templates
函数引用
。
这里
mysql.fullname
是由 release 与 chart 二者名字拼接组成。
根据 chart 的最佳实践,所有资源的名称都应该保持一致,对于我们这个 chart,无论 Secret 还是 Deployment、PersistentVolumeClaim、Service,它们的名字都是子模板
mysql.fullname
的值。
②
Chart
和
Release
是 Helm 预定义的对象,每个对象都有自己的属性,可以在模板中使用。如果使用下面命令安装 chart:
helm install stable/mysql -n my
那么:
{{ .Chart.Name }}
的值为
mysql
。
{{ .Chart.Version }}
的值为
0.3.0
。
{{ .Release.Name }}
的值为
my
。
{{ .Release.Service }}
始终取值为
Tiller
。
{{ template "mysql.fullname" . }}
计算结果为
my-mysql
。
③ 这里指定
mysql-root-password
的值,不过使用了
if-else
的流控制,其逻辑为:
如果
.Values.mysqlRootPassword
有值,则对其进行 base64 编码;否则随机生成一个 10 位的字符串并编码。
Values
也是预定义的对象,代表的是
values.yaml
文件。而
.Values.mysqlRootPassword
则是
values.yaml
中定义的
mysqlRootPassword
参数:
因为
mysqlRootPassword
被注释掉了,没有赋值,所以逻辑判断会走
else
,即随机生成密码。
randAlphaNum
、
b64enc
、
quote
都是 Go 模板语言支持的函数,函数之间可以通过管道
|
连接。
{{ randAlphaNum 10 | b64enc | quote }}
的作用是首先随机产生一个长度为 10 的字符串,然后将其 base64 编码,最后两边加上双引号。
templates/secrets.yaml
这个例子展示了 chart 模板主要的功能,我们最大的收获应该是:
模板将 chart 参数化了,通过
values.yaml
可以灵活定制应用
。
无论多复杂的应用,用户都可以用 Go 模板语言编写出 chart。无非是使用到更多的函数、对象和流控制。对于初学者,我的建议是尽量参考官方的 chart。根据二八定律,这些 chart 已经覆盖了绝大部分情况,而且采用了最佳实践。如何遇到不懂的函数、对象和其他语法,可参考官网文档
https://docs.helm.sh
有了上面 chart 结构和模板的知识后,下节我们将重新实践一次 MySQL chart,相信会有更多收获。
书籍:
1.《每天5分钟玩转Kubernetes》
https://item.jd.com/26225745440.html(点击“阅读原文”直达)
2.《每天5分钟玩转Docker容器技术》
https://item.jd.com/16936307278.html
3.《每天5分钟玩转OpenStack》
https://item.jd.com/12086376.html