我有一个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
如何将这两个列表与来自不同值文件的相同字段名称合并?
答案 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.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 }}