helmはhelm install
で公開されているチャートを簡単にインストールできて便利。一方、GKEで動かすアプリケーションなどの管理をしていると、helm install
で入れるチャートのバージョンや設定自体を管理したくなることがある。イマイチその辺のノウハウがまとまっていなくて困ったので、メモ的に書いておきます。「もっといい方法がある」とかあったらコメントで教えてください。
例がないと分かりにくいので、以下ではargo workflowsのバージョンと設定管理することを念頭に置いて書きます。
Chart.yaml
バージョン管理したいものの対象をChart.yamlのdependencies
に書いていく。複数書けるので、必要があったらつらつら書いていく。
name: argo-ml-news apiVersion: v1 appVersion: "1.0" description: ML-News用のバッチ実行基盤 version: 0.0.1 dependencies: - name: argo-workflows version: 0.2.5 # ココ! repository: https://argoproj.github.io/argo-helm
このディレクトリ配下で以下のコマンドを実行すると、必要なチャートを手元に持ってきて、ビルドしてくれる。
helm dependency update && helm dependency build
実行が終わるとrequirements.lock
というファイルができていて、digest
の情報などが吐き出される。Pipfile.lock
とかと似たようなものだと思えばよい。こいつもバージョン管理しておけば、特定時点のargoの状況を再現できる。ちなみに、ファイルの中身はこういう感じ。
dependencies: - name: argo-workflows repository: https://argoproj.github.io/argo-helm version: 0.2.5 digest: sha256:56a8ff28ba06272c57c2a38bdf0f9d65be3765e1b044e11720bd80634cd6bee0 generated: "2021-06-29T21:53:13.031529+09:00"
バージョンを上げたり下げたりしたくなった場合、Chart.yamlのdependencies以下のversionを変えればよい。
設定値自体を管理する
helm install
する際、特定の設定値を変えたくなることはよくあると思う。例えばargo worlflowsの場合、argoで実行するコンテナのexecutorをdockerから変えたい、などといった具合。k8sapiに変えたい場合、以下のようにsetオプションを通じてコマンドラインから設定できる
helm install ... --set argo-workflows.controller.containerRuntimeExecutor=k8sapi
これでもよいのだが、設定を変えたい、今動いている設定はどうやって設定されたのか知りたい、というのはよくあるかなと思う。設定値自体も管理したい。helmでは設定値をyamlに書いておいて、install
やupgrade
するときに読ませることができる(-f
あるいは --values
オプション)。例えばこういうyamlファイル。
argo-workflows: controller: containerRuntimeExecutor: k8sapi
「そもそもどういう設定ができるのか?」を知りたい場合、チャートが提供しているvalues.yamlを見にいくとよい。ここの設定を自分の設定で上書きしている形になる。
便利Makefile
この辺の操作はイチイチ覚えていられないので、Makefileにして最低限のものだけ覚えておけばよい形にしている。
RELEASE=argo NAMESPACE=argo init: gcloud container clusters get-credentials my-project --region us-west1-a helm dependency update helm dependency build install: init helm install $(RELEASE) . --namespace ${NAMESPACE} --create-namespace -f values.yaml diff: init helm diff upgrade $(RELEASE) . --install --namespace ${NAMESPACE} -f values.yaml upgrade: init helm upgrade $(RELEASE) . --install --namespace ${NAMESPACE} -f values.yaml