chart 模板 — Kubernetes(52)
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,相信会有更多收获。
Exclusive 30 days free upvotes to your every new post. No need to send any kinds of steem or sbd its full free service. we have paid service too so please check them too. Active the free upvote service and learn more about it here : https://t.co/x00cCqsVa1