最佳实践指南的这一部分介绍了使用值。在本指南的这一部分中,我们提供了有关如何构建和使用值的建议,重点介绍图表 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: falsefoo: "false" 不同。在某些情况下,像 foo: 12345678 这样的大整数将转换为科学计数法。

避免类型转换错误的最简单方法是明确字符串,并隐式地处理其他所有内容。简而言之,就是引用所有字符串

通常,为了避免整数转换问题,将整数也存储为字符串,并在模板中使用 {{ int $value }} 从字符串转换回整数是有利的。

在大多数情况下,显式类型标签会受到尊重,因此 foo: !!string 1234 应将 1234 视为字符串。但是,YAML 解析器会使用标签,因此类型数据在解析一次后就会丢失。

考虑用户将如何使用您的值

有三个潜在的值来源。

  • 图表的 values.yaml 文件
  • helm install -fhelm upgrade -f 提供的值文件
  • 传递给 helm installhelm 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 搜索文档变得很容易,并将使文档工具能够可靠地将文档字符串与它们描述的参数相关联。