1 つのチャート、複数の環境:dev、staging、prod 用の values ファイル
環境間で異なる部分だけを上書きし、values がマージされる順序を理解します。
チャートの values.yaml には妥当なデフォルトが入っていますが、dev、staging、本番が、namespace、レプリカ数、設定値を共有することはまれです。このガイドでは、チャート自体の別々のコピーを維持することなく、環境ごとに追加の values ファイルを重ねる方法を説明します。前のガイドの webapp チャートを元にしています。
values.yaml を共通のベースラインとして保つ
どこでも同一であるべきもの、つまりアプリケーション名やイメージリポジトリは、values.yaml に残します。環境固有のものだけを上書きファイルに入れます。
# values-dev.yaml
namespace: dev
config:
customHeader: "welcome to dev"
# values-prod.yaml
namespace: prod
replicaCount: 5
config:
customHeader: "welcome to production"
-f で渡したファイルは values.yaml を置き換えるのではなく、その上にマージされます。values-dev.yaml は、namespace と config.customHeader にだけ言及すればよく、他のすべて、つまり appName や image は、ベースのファイルからそのまま引き継がれます。
テンプレートで namespace を参照する
値を追加し、マニフェストが namespace を宣言する必要がある場所で使います。
# values.yaml (デフォルトを追加)
namespace: default
# templates/deployment.yaml, templates/service.yaml, templates/configmap.yaml
metadata:
name: {{ .Values.appName }}
namespace: {{ .Values.namespace }}
環境の values ファイルでインストールする
kubectl create namespace dev
kubectl create namespace prod
helm install web-dev ./webapp -f values-dev.yaml -n dev
helm install web-prod ./webapp -f values-prod.yaml -n prod
ここでは、関連はありますが別々の 2 つの仕事が行われています。-n dev は、リリース自体のメタデータを保存する namespace を Helm に伝え、テンプレート内の metadata.namespace は、各リソースがどの namespace に入るかを Kubernetes に伝えます。両者を同じにして、リリースがデプロイしたものと同じ namespace に存在するようにするのが標準的なやり方で、後で helm list -n dev を実行して、そこで実際に動作しているすべてが表示されることを期待したときの混乱を避けられます。
helm list -A
kubectl get all -n dev
kubectl get all -n prod
curl <dev-pod-ip> # または NOTES.txt に従って kubectl port-forward
各環境が、それぞれ独自の customHeader とレプリカ数を表示していることを確認します。
優先順位の完全な順序
Helm は複数のソースから values をマージし、それぞれが前のものを上書きします。
values.yaml:チャート自身のデフォルト。- 親チャートの
values.yaml:このチャートが依存関係として使われる場合(ここでは扱いません)。 -fで渡された任意のファイル:指定された順で、後のものが先のものに優先します。--set、--set-string、--set-jsonのフラグ:すべてのファイルより優先されます。
helm upgrade web-dev ./webapp -f values-dev.yaml --set replicaCount=1
--set は、一度きりの上書きや素早いテストには便利ですが、再現したいものは、ファイルに入れてバージョン管理にチェックインしてください。ターミナルで入力した --set フラグは、実際に何がデプロイされたかの記録を残しません。
マージの結果を確認する 2 つの方法
インストールやアップグレードを信頼する前に、結果を確認します。
helm template ./webapp -f values-prod.yaml
helm get values web-prod
helm template -f は、install とまったく同じように、指定した values ファイルでチャートをレンダリングしますが、クラスターには触れないため、2 つの環境の出力を直接 diff できます。helm get values(インストール後)は、稼働中のリリースに記録されている values を表示します。実行中のリリースが、ファイルから生成されるはずのものと一致しないときに確認するものです。
シークレットについての注意
values ファイルはプレーンテキストなので、Git にコミットされるものに実際の認証情報を入れないでください。一般的な分け方は、機密でない環境ごとの設定は values-<env>.yaml に、シークレットは、CI のシークレットストアから --set で、Sealed Secrets や SOPS などのツールで、あるいは値を values.yaml に埋め込む代わりに、チャートが Helm の外で作成された Kubernetes Secret を参照するようにすることで、注入するというものです。