Helm OCI をつかった OCI 準拠レジストリへの保存をどのように実施しているのか調べてみました。
OCI について
様々なアーティファクト(Helm や ライブラリ や各種パッケージなど) ごとに Registry を用意するのは面倒です。Docker イメージを格納するための Docker Registry ですが、これに全部保存できるととても嬉しいですね。
そこで OCI Image に関する規格と、それを格納する OCI Registry の規格が誕生しました。
- image-spec/spec.md at main · opencontainers/image-spec
- distribution-spec/spec.md at main · opencontainers/distribution-spec
この記事では、これらに準拠していることを OCI 準拠と表現します。
Helm パッケージが OCI 準拠のレジストリに保存できる
GCP / AWS / Azure の各コンテナ用のレジストリでは Helm パッケージを保管することが出来ます。
- image-spec/spec.md at main · opencontainers/image-spec
- Managing Helm charts | Artifact Registry documentation | Google Cloud
- Helm グラフの保存 - Azure Container Registry | Microsoft Docs
これらは一体どのように実現しているのでしょうか?結論は単純で 「Helm push コマンドが Helm パッケージを OCI 準拠に変換して Push」 しています。
これだと味気ないのでもう少してみていきます。
現在の最新である Helm 3.7.2
において OCI 準拠は実験的(experimental) な機能とされていますが、個人の感想だとこのまま正式機能になりそうです。
※後で確認したら v3.8.0-rc.1
ではすでに実験的ではなくなっていました。
実際に各レジストリに Helm パッケージを保存するのは非常に簡単でGCP の場合は以下のコマンドを実行するだけです。
❯ gcloud auth print-access-token | helm registry login -u oauth2accesstoken --password-stdin https://asia-northeast1-docker.pkg.dev ❯ export HELM_EXPERIMENTAL_OCI=1 ❯ helm package . ❯ helm push x.x.x.tgz oci://asia-northeast1-docker.pkg.dev/xxx/xxx
helm package
は指定した Helm チャートをアーカイブ&圧縮するtgz(tar.gz)
だけなので、これまでと特に変わったことをしていません。変わったのは helm push
で、ここで OCI 準拠のファイルを生成しています。
OCI Image の規格ではこの図のものを作成する必要があるので、先ほど紹介した helm package
コマンドで作った tgzファイル
だけだと全く足りないわけです。
image-spec/spec.md at main · opencontainers/image-spec
それを、ここで行っています。 https://github.com/helm/helm/blob/c7e1f9b04606574b2f0d93d34e22efb06847ad08/pkg/registry/client.go#L486-L524
この時、OCI に準拠するための設定などは ORAS
のライブラリを使用しています。(へー、便利)
これによって生成した Helm Package を OCI 準拠のものに変換して Push
しているわけですね。逆に Pull
の時や dependency update
は OCI 準拠から tgz
を取り出していると。
まとめ
Helm が OCI 準拠 になり使いやすくなりそうです!
ArgoCD でも Helm 3.7.1
が取り込まれ使いやすくなっていますので使ってみましょう〜。