Helm 图表在多个值文件中包含多个列表

问题描述 投票:0回答:2

我有一个包含以下内容的values.yaml:

abc:
  env:
  - name: name01
    value: value01
  - name: name02
    value: value02

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

abc:
  env:
  - name: name03
    value: value03

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

abc:
  env:
  - name: name01
    value: value01
  - name: name02
    value: value02
  - name: name03
    value: value03

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

abc:
  env:
  - name: name03
    value: value03

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

kubernetes kubernetes-helm
2个回答
17
投票

简短的回答是,您无法合并

lists

在您的情况下,

abc.env
key
value
是一个列表。让我用等效的符号重写您的第一个值文件,它会更清晰:

abc:
  env: [{name: name01, value: value01}, {name: name02, value: value02}]

因此 Helm 正在执行预期的操作,用最后提供的键覆盖键

abc.env

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

abc:
  env:
    name01: value01
    name02: value02

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

--set abc.env.name01=different

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

...
  containers:
  - name: abc
    image: abc
    env:
    {{- range $key, $value := .Values.abc.env }}
    - name: {{ $key }}
      value: {{ $value | quote }}
    {{- end }}  

0
投票

这可能并不总是您想要的行为,但您可以在 helm 中连接两个或多个列表,而无需任何复杂的模板。只需使用列表中的

concat
函数即可:

apiVersion: v1
kind: Pod
metadata:
  name: wget
  labels:
    app.kubernetes.io/name: wget
    app.kubernetes.io/instance: wget
    app.kubernetes.io/managed-by: Helm
spec:
  containers:
    - name: wget
      image: busybox
      command: ['sleep']
      args: ['7d']
   volumes:
     {{- toYaml (concat .Values.volumes .Values.defautVolumes) | nindent 4 }}

这会添加两个列表

volumes
defautVolumes
。空列表也有效。

注意: 这不会减少磁盘空间。如果两个列表具有相同的值,它会产生重复项。您不能使用它来用另一个列表覆盖一个列表中的值。

© www.soinside.com 2019 - 2024. All rights reserved.