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

时间:2019-12-18 14:44:03

标签: kubernetes kubernetes-helm

我有一个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

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

2 个答案:

答案 0 :(得分:0)

我个人不喜欢多个环境价值文件。最好的办法就是使用这种方法。

保留具有以下内容的单个值文件。

mongodb_ip:
  prod: 10.0.2.201
  staging: 10.0.2.202
  test: 10.0.2.203
  dev: 10.0.2.204

在配置文件或部署文件中,您可以使用来调用值

data:
  debug: 'false'
  mongodb_ip: '{{ pluck .Values.envName .Values.mongodb_ip | first }}'

在头盔安装或头盔升级之前,请在CI / CD管道上运行此命令,但请确保已安装yq工具来执行此操作。或者,您可以使用任何工具执行相同操作。

yq w -i values.yaml envName dev

正如我在yq工具中给开发人员提供的那样,整个过程用10.0.2.204的mongodb ip替换了我的配置文件。

这是我们如何拥有单个值文件,并根据您的需要将其配置到多个区域或环境的示例,而不是多个值文件。

另一方面,您也可以根据使用情况使用--values或-f标志。尝试这样的事情。这是当您想将多个文件用于多个客户端或类似的客户端时。

helm install ./path --values ./generic-values.yaml --values ./dev-values.yaml

希望这会有所帮助。

答案 1 :(得分:0)

简单的答案是,您不能合并lists

在您的情况下,abc.envkey,而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 }}