概要
Helmチャートで使う変数はvalues.yamlに定義するのがデフォルトですが、環境によって値を変えたい場合に変数定義ファイル一つだと結構使いにくいです。(templatesディレクトリ内のマニフェストの中でif文などを入れて対応可能ですが、ソースの可読性が落ちます...)
そこで公式ドキュメントを見てみると、helm install時のオプションで複数の変数定義ファイルを指定できるようなので、本記事で実際に試してみようと思います。
とりあえず結論
以下のように、-f(または--values)オプションで複数の変数定義ファイルを指定可能です。
$ helm install [NAME] [CHART] -f [変数定義ファイル1] -f [変数定義ファイル2]
公式ドキュメントからの抜粋
--values (または -f): 上書きする YAML ファイルを指定します。 これは複数回指定でき、一番右のファイルが優先されます
では実際の挙動を確認していきましょう。
環境情報
Helmのバージョンはv3.10.2
$ helm version
version.BuildInfo{Version:"v3.10.2", GitCommit:"50f003e5ee8704ec937a756c646870227d7c8b58", GitTreeState:"clean", GoVersion:"go1.19.3"}
ディレクトリ構成
以下のように、デフォルトのvalues.yamlに加えてvaluesディレクトリに環境毎の変数定義ファイルを格納しています。
.
├── Chart.yaml
├── templates
│ └── configmap.yaml
├── values # 環境別の変数定義ファイルを格納
│ ├── kameda.yaml
│ ├── mochikichi.yaml
│ └── yatsuhashi.yaml
└── values.yaml # デフォルトで使う変数を定義
共通に使うファイル内容
変数定義ファイル
common:
country: "Japan"
company:
name: "default"
prefecture: "Kyoto"
テンプレート内には値を確認する用のConfigMapを定義
apiVersion: v1
kind: ConfigMap
metadata:
name: company-wagashi
data:
country: {{ .Values.common.country }}
{{- range $key, $value := .Values.company }}
{{ $key }}: {{ $value }}
{{- end }}
確認
まずは、デフォルトの状態で生成されるマニフェストを確認してみます。
実際はhelm installでクラスターに反映されますが、今回はhelm templateで生成マニフェストの中身のみ確認します。
$ helm template .
---
# Source: some-path/templates/configmap.yaml
apiVersion: v1
kind: ConfigMap
metadata:
name: company-wagashi
data:
country: Japan
name: default
prefecture: Kyoto
values.yamlの内容が素直に反映されています。
続いて、以下のvalues/kameda.yamlのファイルを引数指定してみます。
company:
name: "Kameda"
prefecture: "Tokyo"
$ helm template . -f values/kameda.yaml
---
# Source: some-path/templates/configmap.yaml
apiVersion: v1
kind: ConfigMap
metadata:
name: company-wagashi
data:
country: Japan
name: Kameda
prefecture: Tokyo
nameとprefectureの内容が変わっていることを確認できました。
values.yamlの中身は-fオプションで指定しなくても反映されます。
次は以下のように、keyを新たに加えたもので確認してみます。
company:
name: "Mochikichi"
prefecture: "Fukuoka"
founding-date: "1929-09-01"
$ helm template . -f values/mochikichi.yaml
---
# Source: some-path/templates/configmap.yaml
apiVersion: v1
kind: ConfigMap
metadata:
name: company-wagashi
data:
country: Japan
founding-date: 1929-09-01
name: Mochikichi
prefecture: Fukuoka
founding-dateのキーが新たに加わりました。
反対に、次のようにデフォルトで存在するキーprefectureを定義しない場合はどうなるでしょうか。
company:
name: "Yatsuhashi"
$ helm template . -f values/yatsuhashi.yaml
---
# Source: some-path/templates/configmap.yaml
apiVersion: v1
kind: ConfigMap
metadata:
name: company-wagashi
data:
country: Japan
name: Yatsuhashi
prefecture: Kyoto
values.yamlのprefectureの値Kyotoが反映されました。
また複数ファイルを指定した場合は、公式ドキュメントにも記載があるように一番右(=最後)に指定したファイルの内容が優先されることも確認できます。
$ helm template . -f values/yatsuhashi.yaml -f values/kameda.yaml
---
# Source: some-path/templates/configmap.yaml
apiVersion: v1
kind: ConfigMap
metadata:
name: company-wagashi
data:
country: Japan
name: Kameda
prefecture: Tokyo
おわりに
今回ご紹介したお話は、GitHubのissue(Helm multiple environments best practices)でも話題になっており「よさそう!」と回答が出ていました