次の値を含むvalues.yamlがあります。
abc:
env:
- name: name01
value: value01
- name: name02
value: value02
-fを使用してインストールするときに追加する値ファイルvalues-dev.yamlがあり、次のようになっています。
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つのリストを、異なる値ファイルの同じフィールド名でマージするにはどうすればよいですか?
簡単に言えば、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の魔法を使えば、これらの値を環境変数としてポッドに簡単に渡すことができます。
...
containers:
- name: abc
image: abc
env:
{{- range $key, $value := .Values.abc.env }}
- name: {{ $key }}
value: {{ $value | quote }}
{{- end }}
私は個人的には複数のenv値ファイルを好みません。最善の方法は、このアプローチを使用することです。
このようなものを持つ単一の値ファイルを保持します。
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 }}'
そして、helm installまたはhelm upgradeの前にCI/CDパイプラインでこのコマンドを実行しますが、yqツールがインストールされていることを確認してください。または、任意のツールを使用して同じことを行うことができます。
yq w -i values.yaml envName dev
このプロセス全体で、構成ファイルが10.0.2.204のmongodb ipに置き換えられます。これは、yqツールでdevを指定したためです。
これは、単一の値ファイルを作成し、複数の値ファイルではなく、必要に応じて複数のリージョンまたは環境に設定する方法のサンプルです。
一方、使用法に基づいて言ったように、-valuesまたは-fフラグを使用することもできます。そして、このようなことを試してください。これは、複数のクライアントなどで複数のファイルを使用する場合です。
helm install ./path --values ./generic-values.yaml --values ./dev-values.yaml
お役に立てば幸いです。