1、Helm3调试模板
调试模板可能很棘手,因为模板是在Tiller服务器上渲染的,而不是在Helm客户端上。然后将渲染后的模板发送给了 Kubernetes API 服务器,该服务器可能会因为格式以外的原因拒绝YAML文件。
以下命令有助于你的调试:
helm lint
是验证chart是否遵循最佳实践的首选工具helm install --dry-run --debug
或helm template --debug
:我们已经看过这个技巧了, 这是让服务器渲染模板,然后返回生成的清单文件的好方法。helm get manifest
: 这是查看服务器上安装了哪些模板的好方法。
当你的YAML文件解析失败,但你想知道生成了什么,检索YAML一个简单的方式是注释掉模板中有问题的部分,然后重新运行 helm install --dry-run --debug
:
apiVersion: v2
# some: problem section
# {{ .Values.foo | quote }}
以上内容会被完整渲染同时返回注释:
apiVersion: v2
# some: problem section
# "bar"
这样就提供了一种快速查看生成内容的方法,而不会被YAML解析错误阻塞。
2、Helm chart最佳实践
2.1 基本规约
- Chart命名:必须是小写字母和数字,单词之间分割符用
-
,chart名称中不能用大写字母也不能用下划线。点( . )
也不行。 - 版本规范: 版本号遵循SemVer2的规范
- Yaml缩进: 使用两个空格缩进,不能用tab
2.2 values.yaml编写的最佳实践
命名规范: 首字母小写的驼峰式命名
- 注意所有的Helm内置变量以大写字母开头,以便与用户定义的value进行区分,如:
.Release.Name
反例:
Chicken: true # initial caps may conflict with built-ins
chicken-noodle-soup: true # do not use hyphens in the name
所有Helm内置的变量都是大写开头(如.Chart.Name, .Capabilities.KubeVersion),这样可以和用户自定义的变量区分开。
变量平铺 Or 层叠
Yaml格式灵活,里面的变量既可以平铺也可以层叠编写,通常情况下平铺更好,因为简单。
层叠:
server:
name: nginx
port: 80
平铺:
serverName: nginx
serverPort: 80
使用字典而不是数组
由于values.yaml的变量是可以支持被命令行的参数 --set
或 --set-string
改写,而参数的写法有限。
所以values.yaml变量的写法尽可能使用map,而不是数组
反例:
servers:
- name: foo
port: 80
- name: bar
port: 81
如何用 --set
改写端口, Helm2.4之前不支持, 2.5之后可以用 --set servers[0].port=80
。 但表意不明确,万一values里的顺序改变了,就糟糕了。
正例:
servers:
foo:
port: 80
bar:
port: 81
改foo的端口 --set servers.foo.port=80
类型清醒
Yaml的类型转化的规则有时是反直觉的。比如foo: false和foo: "false"不一样。 大数 foo:1234567在某些场景下会变成科学计数法表达。
最简单,清醒的做法:所有变量都用 ""引号表达成字符串。
在需要使用数字时,用 {{ int $value }}
进行变量转换
2.3 模板
templates的结构化规范:
- 所有的yaml模板必须有
.yaml
后缀, 非格式化内容的模板使用.tpl
后缀 - 模板文件的命名使用小写,使用
-
符号分割单词(my-example-configmap.yaml)
,不用驼峰法。 - 每种资源的定义必须单独的模板文件
- 模板文件的名称应该反映名称中的资源类型。比如:
foo-pod.yaml
,bar-svc.yaml
。 - 模板应该使用两个空格缩进(永远不要用tab)。
- 模板命令的大括号前后应该使用空格
- 模板注释
{{- /*
mychart.shortname provides a 6 char truncated version of the release name.
*/}}
- YAML注释
# This is a comment
type: sprocket
- 当相关的一些变量是可选的,为了安全起见,使用层叠方式,并在每个层级中都对变量进行校验。
{{ if .Values.server }}
{{ default "none" .Values.server.name }}
{{ end }}
- helm lint是验证chart是否遵循最佳实践的首选工具
当你想测试模板渲染但又不想安装任何内容时,可以使用 helm install --debug --dry-run goodly-guppy ./mychart
命名模板
{{ define }}
创建出命名模板是全局可见的,为了避免名称冲突,命名中应该带上命名空间。
正例
{{- define "nginx.fullname" }}
{{/* ... */}}
{{ end -}}
反例
{{- define "fullname" -}}
{{/* ... */}}
{{ end -}}
推荐使用helm create 创建新的chart,它会自动循序最佳实践
模板命令
{{ }}
表示模板命令。在 {{
后和 }}
前需要用一个空格隔开
正例
{{ .foo }}
{{ print "foo" }}
{{- print "bar" -}}
反例
{{.foo}}
{{print "foo"}}
{{-print "bar"-}}
2.4 模板函数和流水线
模板函数遵循的语法是 functionName arg1 arg2...
管道符
使用管道符(|)
将参数“”发送给函数:.Values.favorite.drink | quote
,这里倒置了命令。
模板函数列表
- trim:移除字符串两边的空格
trim " hello " #hello
- trimAll:从字符串中移除给定的字符
trimAll "$" "$5.00" #5.00
- trimPrefix:从字符串中移除前缀
trimPrefix "-" "-hello" #hello
-
trimSuffix:从字符串中移除后缀
-
trimSuffix “-” “hello-” #hello
-
lower:将整个字符串转换成小写
-
upper:将整个字符串转换成大写
lower "HELLO" #hello
upper "hello" #HELLO
- title:首字母转换成大写
- untitle:移除首字母大写
title "hello world" #Hello World
untitle "Hello World" #hello world
- indent:以指定长度缩进给定字符串所在行
2.5 注释
每个变量都应该注释。
注释必须以变量名开头
正例
# serverHost is the host name for the webserver
serverHost: example
# serverPort is the HTTP listener port for the webserver
serverPort: 9191
变量名开头的注释有利于在grep时,可以快速抓取变量及其文档说明
Yaml注释: 常用注释,而且在 helm install --debug
调试时可见
# This is a comment
type: sprocket
模板注释:多行注释,常用于对模块、方法的说明
{{- /*
This is a comment.
*/}}
type: frobnitz
评论区