環境
Helm 3.7.1
Helmチャートでよくある悩み
Helmで実際のアプリをデプロイしていると、次のようなことが悩みどころになってくる。
- values.yamlに機密性の高い環境変数(APIキーなど)を直接書き込んでしまっているので、gitやhelmリポジトリに上げると機密情報が漏れてしまう
- デプロイ環境が複数あるときに、いちいち環境変数を書き換えてデプロイするのが面倒
Helmはあくまでもkubernetesのパッケージ管理ツールだからということもあってか、これらの悩みを解決する機能が明確に用意されているわけではない。そのため、ひと工夫が必要になる。
この記事を読んでできること
- 機密性の高い変数(APIキーなど)をgitなどの管理から除外する
- 環境変数は、
- 環境毎で共通のものは、values.yamlに書く
- 環境毎の差分はenv/以下のファイルに分けて記述する
Helmチャートを書き換えてみる
以下のvalues.yamlを例にとって説明する。
app:
port: 3000 #開発環境で3000、本番環境で3010
someLimit: 100
secret:
SOME_API_KEY: "apikey-dev" #開発環境で"apikey-dev"、本番環境で"apikey-prod"
このvalues.yamlをそのまま使うと、上述のようにデプロイ環境毎に環境変数を書き換えてからデプロイするひと手間がかかる。
Helmチャートをgit管理している場合、これらの値の更新がコミットされてしまうのも面倒になる上、APIキーをgit管理対象に含めてしまう危険性がある。
values.yamlのテンプレートを作成する
そこでまず、values.yamlのテンプレートを作る。
app:
port: <port>
someLimit: <limit>
secret:
SOME_API_KEY: <apikey>
gitではvalues.template.yamlを管理し、values.yamlはgit管理対象から外しておく。
env/フォルダ内にマニフェストファイルを作成し、デプロイ環境毎の環境変数を書く
さらに、環境毎の値を記述するマニフェストファイルを作成する。
env
ディレクトリの下に作成すると整理がしやすい。
APIキーを含んでいるので、これらもgit管理対象から外しておく。
app:
#開発環境では、portはvalues.yamlのものを使用
secret:
SOME_API_KEY: "apikey-dev"
app:
port: 3010 #本番だけポートを変える
secret:
SOME_API_KEY: "apikey-prod"
app.someLimit
は環境毎で共通の値なので、values.yamlにのみ書いておく。
逆に、環境毎に必ず分けておきたい変数は、無効な値を書いておくとよい。
app:
port: 3000 #デフォルト値
someLimit: 100
secret:
SOME_API_KEY: null #無効な値を設定し、env/xxx.yamlで指定させる
簡単にまとめると、
- デフォルト値や、環境毎で共通の値はvalues.yamlに記述する
- 環境毎に固有の値はenv/xxx.yamlに記述する
とすればよい。
デプロイ時
これらのファイルを用いてHelmチャートをデプロイ・アップデートするときは、以下のように-f
オプションを利用する。
-f
オプションで複数のファイルを指定したとき、各yamlファイルに重複した値がある場合にはより右(後)で指定したファイルのものが優先される(参考)。
$ helm install -f values.yaml -f product.yaml fuga-app-prod .
例えば、上記のコマンドでは以下のvalues.yamlを使用したのと同等になる。
app:
port: 3010
someLimit: 100
secret:
SOME_API_KEY: "apikey-prod"
ファイルの指定順を間違えると、誤った環境変数が適用されてしまうので注意。
例として、上記のコマンドでvalues.yamlより先にenv/product.yamlを書いてしまうと。以下のvalues.yamlを使用したことになってしまう。
app:
port: 3000
someLimit: 100
secret:
SOME_API_KEY: null
おわりに
Helmはあまり環境変数の取り扱いに便利な機能が無く、苦労したことがこの記事を執筆したきっかけです。
この記事がどなたかの助けになれば幸いです。