在多个值文件中具有多个列表的 Helm Charts

ara*_*een 6 kubernetes kubernetes-helm

我有一个 values.yaml ,它具有以下内容:

abc:
  env:
  - name: name01
    value: value01
  - name: name02
    value: value02
Run Code Online (Sandbox Code Playgroud)

我还有另一个值文件 values-dev.yaml ,我在使用 -f 安装时添加了它,它有:

abc:
  env:
  - name: name03
    value: value03
Run Code Online (Sandbox Code Playgroud)

并使用范围将它们列在我的模板中。我希望在应用这两个文件后,列表会变成这样:

abc:
  env:
  - name: name01
    value: value01
  - name: name02
    value: value02
  - name: name03
    value: value03
Run Code Online (Sandbox Code Playgroud)

但是 values-dev.yaml 值将覆盖 values.yaml 中的值,它变成:

abc:
  env:
  - name: name03
    value: value03
Run Code Online (Sandbox Code Playgroud)

如何实现将这 2 个列表与来自不同值文件的相同字段名称合并?

小智 17

简短的回答是,你不能合并lists

在你的情况下abc.envkeyvalue是一个列表。让我用等效的符号重写您的第一个值文件,它会更清晰:

abc:
  env: [{name: name01, value: value01}, {name: name02, value: value02}]
Run Code Online (Sandbox Code Playgroud)

因此,Helm 正在执行预期的操作,abc.env用最后提供的密钥覆盖密钥。

解决方案是重新构建您的值文件,如下所示:

abc:
  env:
    name01: value01
    name02: value02
Run Code Online (Sandbox Code Playgroud)

这样,您可以根据需要合并和覆盖您的值文件。这样,使用命令行标志覆盖单个值也很容易,例如:

--set abc.env.name01=different
Run Code Online (Sandbox Code Playgroud)

借助 Helm 的一些魔力,可以轻松地将这些值作为环境变量传递到您的 pod:

...
  containers:
  - name: abc
    image: abc
    env:
    {{- range $key, $value := .Values.abc.env }}
    - name: {{ $key }}
      value: {{ $value | quote }}
    {{- end }}  
Run Code Online (Sandbox Code Playgroud)