フラミナル

考え方や調べたことを書き殴ります。IT技術系記事多め

Helm パッケージをどうやって OCI 準拠のレジストリに格納しているのか?

f:id:lirlia:20220122232750p:plain

Helm OCI をつかった OCI 準拠レジストリへの保存をどのように実施しているのか調べてみました。

OCI について

様々なアーティファクト(Helm や ライブラリ や各種パッケージなど) ごとに Registry を用意するのは面倒です。Docker イメージを格納するための Docker Registry ですが、これに全部保存できるととても嬉しいですね。

そこで OCI Image に関する規格と、それを格納する OCI Registry の規格が誕生しました。

この記事では、これらに準拠していることを OCI 準拠と表現します。

Helm パッケージが OCI 準拠のレジストリに保存できる

GCP / AWS / Azure の各コンテナ用のレジストリでは Helm パッケージを保管することが出来ます。

これらは一体どのように実現しているのでしょうか?結論は単純で 「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ファイル だけだと全く足りないわけです。

f:id:lirlia:20220122222308p:plain

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 が取り込まれ使いやすくなっていますので使ってみましょう〜。