Values

这部分最佳实践指南涵盖了 values 的使用。在指南的这一部分,我们提供关于如何构建和使用 values 的建议,重点在于设计 chart 的 values.yaml 文件。

命名约定

变量名称应该以小写字母开头,单词应该用 camelcase 分隔:

正确写法:

  1. chicken: true
  2. chickenNoodleSoup: true

不正确写法:

  1. Chicken: true # initial caps may conflict with built-ins
  2. chicken-noodle-soup: true # do not use hyphens in the name

请注意,Helm 的所有内置变量都以大写字母开头,以便将它们与用户定义的 value 区分开来,如:.Release.Name.Capabilities.KubeVersion

展平或嵌套值

YAML 是一种灵活的格式,并且值可以嵌套或扁平化。

嵌套:

  1. server:
  2. name: nginx
  3. port: 80

展平:

  1. serverName: nginx
  2. serverPort: 80

在大多数情况下,展平应该比嵌套更受青睐。原因是对模板开发人员和用户来说更简单。

为了获得最佳安全性,必须在每个级别检查嵌套值:

  1. {{ if .Values.server }}
  2. {{ default "none" .Values.server.name }}
  3. {{ end }}

对于每一层嵌套,都必须进行存在检查。但对于展平配置,可以跳过这些检查,使模板更易于阅读和使用。

  1. {{ default "none" .Values.serverName }}

当有大量相关变量时,且至少有一个是非可选的,可以使用嵌套值来提高可读性。

使类型清晰

YAML 的类型强制规则有时是违反直觉的。例如, foo: falsefoo: "false" 不一样。foo: 12345678 在某些情况下,大整数将被转换为科学记数法。

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

通常,为了避免整型转换问题,最好将整型存储为字符串,并在模板中使用 {{ int $value }} 将字符串转换为整数。

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

考虑用户如何使用你的 values

有几种潜在的 values 来源:

  • chart 的 values.yaml 文件
  • helm install -fhelm upgrade -f 提供的 value 文件
  • 传递给 --set 或的 --set-string 标志 helm installhelm upgrade 命令
  • 通过 --set-file 将 文件内容传递给 helm install or helm upgrade

在设计 value 的结构时,请记住 chart 的用户可能希望通过 -f 标志或 --set 选项覆盖它们。

由于 --set 在表现力方面比较有限,编写 values.yaml 文件的第一个指导原则可以轻松使用 --set 覆盖。

出于这个原因,使用 map 来构建 value 文件通常会更好。

难以配合 --set 使用:

  1. servers:
  2. - name: foo
  3. port: 80
  4. - name: bar
  5. port: 81

Helm <=2.4 时,以上不能用 --set 来表示。在 Helm 2.5 中,访问 foo 上的端口是 --set servers[0].port=80。用户不仅难以弄清楚,而且如果稍后 servers 改变顺序,则容易出错。

使用方便:

  1. servers:
  2. foo:
  3. port: 80
  4. bar:
  5. port: 81

访问 foo 的端口更为方便:--set servers.foo.port=80

文档’values.yaml’

应该记录’values.yaml’中的每个定义的属性。文档字符串应该以它描述的属性的名称开始,然后至少给出一个单句描述。

不正确:

  1. # the host name for the webserver
  2. serverHost = example
  3. serverPort = 9191

正确:

  1. # serverHost is the host name for the webserver
  2. serverHost = example
  3. # serverPort is the HTTP listener port for the webserver
  4. serverPort = 9191

使用参数名称开始每个注释,它使文档易于grep,并使文档工具能够可靠地将文档字符串与其描述的参数关联起来。