k3sでもBuildKitを使用してイメージをビルドしたい
はじめに
家で運用しているサーバ機をアップデートに失敗して吹き飛ばしたとある事情で空いたので、k3sをインストールしました。
せっかく?なので、k3s上でイメージをビルドできるようにしておくとなんか捗りそうな気がするので方法を確認しておきます。
Dockerfileの準備
とりあえずサクッとRustでマルチステージビルドを行うDockerfileを用意します。
FROM rust:1.65.0-bullseye AS builder
ADD . /src
WORKDIR /src
RUN --mount=type=cache,target=/usr/local/cargo/registry \
cargo build --release
FROM gcr.io/distroless/cc
COPY --from=builder /src/target/release/ferris_says ferris_says
CMD ["./ferris_says"]
とりあえずDockerのBuildKitでビルドできるか確認しておきます。
$ docker buildx build -t ferris_says:latest .
実行するとこんな感じです。
$ docker run --rm -it ferris_says:latest
__________________________
< Hello fellow Rustaceans! >
--------------------------
\
\
_~^~^~_
\) / o o \ (/
'_ - _'
/ '-----' \
k3s側のビルド用のPodの用意
k3s側でビルドするのに必要なマニフェストはBuildKit側で用意してくれていたのでそれをそのまま使用します。
Kubernetes manifests for BuildKit
今回はとりあえずPodで生やします。
$ kubectl apply -f pod.rootless.yaml
$ kubectl get pods
NAME READY STATUS RESTARTS AGE
buildkitd 1/1 Running 0 124m
BuildKitを使用してのビルド
buildctl
を使用してビルドをします。
buildctl --addr kube-pod://buildkitd build \
--frontend dockerfile.v0 \
--local context=. \
--local dockerfile=. \
--output type=oci,name=ferris_says:latest > ferris_says.tar
ビルドがうまくいくとイメージがtarに詰まって出てくるので、あとはそれをk3sに突っ込むだけです。
$ sudo k3s ctr images import ferris_says.tar
$ sudo k3s crictl images
IMAGE TAG IMAGE ID SIZE
docker.io/library/ferris_says latest 7948ed6b9ec95 10.6MB
ここまで来ればあとはイメージを動かすだけです。
この時、--image-pull-policy=Never
を指定してイメージをプルしないようにしないとイメージ取得で詰まっていい感じに動いてくれません。
$ kubectl run ferris-says --restart=Never --image=docker.io/library/ferris_says:latest --rm -it --image-pull-policy=Never
__________________________
< Hello fellow Rustaceans! >
--------------------------
\
\
_~^~^~_
\) / o o \ (/
'_ - _'
/ '-----' \
pod "ferris-says" deleted
おわり