kubernetesのコンテナイメージはOCI標準と互換性があります。
Dockerにはイメージビルドツールが付属していますが、kubernetesの場合には、
buildkitなどを利用します。
buildkitはdockerの派生プロジェクトですが単体で利用できます。
ディストリビューションのパッケージがないケースが多々あるため、インストールはGitHubのReleases配布バイナリをダウンロードして、実行ファイルをPATHのとおったディレクトリに置きます。
buildkitはクライアント・サーバ構成になっているため、あらかじめサーバプロセスを起動しておきます。
なお、素朴なセットアップでは全般的にroot権限を求められるため、sudo経由で実行する必要があるでしょう。
$ sudo buildkitd &
buildctlでイメージ作成
イメージビルドのクライアントはbuildctl buildコマンドです。
docker buildに相当するコマンドで、コンテキストとDockerfileを入力に用いる点は同じです。
ただし拡張性のため、明示的に指定すべきオプションが多数あります。
$ sudo buildctl build \
--frontend dockerfile.v0 \
--local context=. --local dockerfile=. \
--output type=oci,name=<some-image-name> \
> <export-file>.tar
カレントディレクトリのDockerfileからビルドするケースでは、--frontendと--localオプションは上のとおりです。
--outputオプションではイメージの形式と名前を指定します。
アウトプットはリダイレクトでtarファイルに出力します。ファイル名はインポート時に指定するだけの用途であり、大きな意味はもちません。
kubernetesクラスタにインポート
各クラスタ実装のコマンドでイメージをインポートします。
k3sの場合k3s ctr images importコマンドです。
$ sudo k3s ctr images import <export-file>.tar
imageの名称はbuildctl buildで指定した名前が使われます。また、暗黙にdocker.io/のprefixが付きました。
インポート後は、コンテナのimageに指定して利用できます。ただし、imagePullPolicy: Neverなどを指定しないと、docker.ioを探索して失敗する場合があります。
buildkitdの停止
ビルド作業を完了してbuildkitdを停止したい場合は、killallコマンドを利用できます。
$ sudo killall buildkitd