k3sでコンテナをビルドする

背景

ラズパイ上にGenPi64をインストールし、k3sでkubernetes環境を構築した。 このラズパイでdockerイメージをビルドしたい。

私の環境でのnerdctlはbuildkitが必要だった。

buildkitのインストールとbuildkitd(デーモン)の起動

インストール

buildkitはGo言語で書かれており多数のプラットフォーム向けにパッケージが提供されている。

buildkitのプロジェクトページ( moby/buildkit: concurrent, cache-efficient, and Dockerfilcnie-agnostic builder toolkit )の「Releases」に移動し「Assets」から各プラットフォームのtarアーカイブをダウンロードする。 私のラズパイ環境の場合、buildkit-v0.12.4.linux-arm64.tar.gz を用いた。

展開するとbinディレクトリができるので中身を全て/usr/local/bin配下にコピーした。cni

buildkitd(デーモン)の起動

systemdのユニットとして起動させたいが手軽に試す場合は下記で起動する。 これでビルドが開始できる。

sudo /usr/local/bin/buildkitd &
INFO[2024-01-17T23:05:15+09:00] auto snapshotter: using overlayfs
WARN[2024-01-17T23:05:15+09:00] using host network as the default
INFO[2024-01-17T23:05:15+09:00] found worker "icepdj7khuiltkpxu75ft0k9w", labels=map[org.mobyproject.buildkit.worker.executor:oci org.mobyproject.buildkit.worker.hostname:k3s-prd-agent-a org.mobyproject.buildkit.worker.network:host org.mobyproject.buildkit.worker.oci.process-mode:sandbox org.mobyproject.buildkit.worker.selinux.enabled:false org.mobyproject.buildkit.worker.snapshotter:overlayfs], platforms=[linux/arm64 linux/arm/v7 linux/arm/v6]
WARN[2024-01-17T23:05:15+09:00] skipping containerd worker, as "/run/containerd/containerd.sock" does not exist
INFO[2024-01-17T23:05:15+09:00] found 1 workers, default="icepdj7khuiltkpxu75ft0k9w"
WARN[2024-01-17T23:05:15+09:00] currently, only the default worker can be used.
INFO[2024-01-17T23:05:15+09:00] running server on /run/buildkit/buildkitd.sock

buildkitd起動後、Dockerfileが存在するディレクトリに移動して下記のようにビルドできる。

sudo nerdctl --address /run/k3s/containerd/containerd.sock --namespace k8s.io build -t test:latest .

ただ上記のログの中にWARNだが気になるログがある。

skipping containerd worker, as "/run/containerd/containerd.sock" does not exist

k3s環境の場合、sockファイルは /run/k3s/containerd/containerd.sock になる。

恐らくk3sとbuildkitdの連携には下記のメリットがある。

  • 直接的なイメージ管理
    • containerdとBuildKitが連携することで、ビルドされたイメージを直接containerdのイメージストアに格納できる。
  • パフォーマンスの向上
    • containerdとの統合により、イメージのレイヤーのキャッシングや共有が効率的になり、ビルドプロセスのパフォーマンスが向上する。

buildkitd -h とするとオプション一覧が見れる。

コマンドラインで指定する場合は下記のように行うようだ。

buildkitd --containerd-worker-addr /run/k3s/containerd/containerd.sock

また設定ファイルとしては /etc/buildkit/buildkitd.toml が指定できる模様。 buildkitd.toml | Docker Docs にサンプルがあった。下記のようになると思う。

[worker.containerd]
  address = "/run/k3s/containerd/containerd.sock"

dockerイメージ実行時、CNIプラグインのエラーが出る

sudo nerdctl --address /run/k3s/containerd/containerd.sock --namespace k8s.io run -it test fish
FATA[0000] failed to verify networking settings: failed to create default network: needs CNI plugin "bridge" to be installed in CNI_PATH ("/opt/cni/bin"), see https://github.com/containernetworking/plugins/releases: exec: "/opt/cni/bin/bridge": stat /opt/cni/bin/bridge: no such file or directory

CNIのプラグインは Releases · containernetworking/plugins でダウンロードできる。 私の環境向けでは cni-plugins-linux-arm64-v1.4.0.tgz だった。 ダウンロードして展開するとコマンド郡が得られるので、/opt/cni/bin というディレクトリを作成し、コピーするとnerdctlから参照されコンテナが起動した。

CNI関連として/usr/local/bin/crictlというコマンドもk3sでインストールされる。オプションで近い機能があるかな、と思って確認したが、無い。 上記のエラーで必要とされているのは /opt/cni/bin/bridge なので別途追加が必要。