值
最佳实践指南的这一部分介绍了使用值。在本指南的这一部分中,我们提供了有关如何构建和使用值的建议,重点介绍图表 values.yaml
文件的设计。
命名约定
变量名称应以小写字母开头,单词应使用驼峰式命名法分隔。
正确
chicken: true
chickenNoodleSoup: true
错误
Chicken: true # initial caps may conflict with built-ins
chicken-noodle-soup: true # do not use hyphens in the name
请注意,所有 Helm 的内置变量都以大写字母开头,以便轻松地将它们与用户定义的值区分开来:.Release.Name
、.Capabilities.KubeVersion
。
扁平化或嵌套值
YAML 是一种灵活的格式,值可以深度嵌套或扁平化。
嵌套
server:
name: nginx
port: 80
扁平化
serverName: nginx
serverPort: 80
在大多数情况下,应该优先使用扁平化而不是嵌套。这样做的原因是,它对模板开发人员和用户来说更简单。
为了最佳安全性,必须在每一层检查嵌套值。
{{ if .Values.server }}
{{ default "none" .Values.server.name }}
{{ end }}
对于每一层嵌套,都必须进行存在性检查。但是对于扁平化配置,可以跳过此类检查,使模板更易于阅读和使用。
{{ default "none" .Values.serverName }}
当存在大量相关的变量,并且其中至少一个是非可选的时,可以使用嵌套值来提高可读性。
使类型清晰
YAML 的类型强制规则有时违反直觉。例如,foo: false
与 foo: "false"
不同。在某些情况下,像 foo: 12345678
这样的大整数将转换为科学计数法。
避免类型转换错误的最简单方法是明确字符串,并隐式地处理其他所有内容。简而言之,就是引用所有字符串。
通常,为了避免整数转换问题,将整数也存储为字符串,并在模板中使用 {{ int $value }}
从字符串转换回整数是有利的。
在大多数情况下,显式类型标签会受到尊重,因此 foo: !!string 1234
应将 1234
视为字符串。但是,YAML 解析器会使用标签,因此类型数据在解析一次后就会丢失。
考虑用户将如何使用您的值
有三个潜在的值来源。
- 图表的
values.yaml
文件 - 由
helm install -f
或helm upgrade -f
提供的值文件 - 传递给
helm install
或helm upgrade
上--set
或--set-string
标志的值
在设计值结构时,请记住,图表的使用者可能希望通过 -f
标志或 --set
选项覆盖它们。
由于 --set
在表达能力上更加有限,因此编写 values.yaml
文件的第一个准则是使其易于从 --set
覆盖。
为此,通常最好使用映射来构建值文件。
难以使用 --set
servers:
- name: foo
port: 80
- name: bar
port: 81
以上内容无法在 Helm <=2.4
中使用 --set
表达。在 Helm 2.5 中,访问 foo 上的端口为 --set servers[0].port=80
。这不仅对用户来说更难理解,而且如果在以后的某个时间更改 servers
的顺序,很容易出错。
易于使用
servers:
foo:
port: 80
bar:
port: 81
访问 foo 的端口更加直观:--set servers.foo.port=80
。
记录 values.yaml
values.yaml
中定义的每个属性都应该记录。文档字符串应以其描述的属性名称开头,然后至少提供一个句子描述。
错误
# the host name for the webserver
serverHost: example
serverPort: 9191
正确
# serverHost is the host name for the webserver
serverHost: example
# serverPort is the HTTP listener port for the webserver
serverPort: 9191
以其记录的参数名称开头每个注释,这使得使用 grep 搜索文档变得很容易,并将使文档工具能够可靠地将文档字符串与它们描述的参数相关联。