helm installで入れるチャートの管理の仕方

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に書いておいて、installupgradeするときに読ませることができる(-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