k3sクラスタにBuildkitインストール
以前Buildkitを構築したことがある
のですが
またマルチプラットフォームでビルドしたくなったので再構築しました。
構築環境
今回はラズパイではなく1台のVMにk3sをインストールして構築したクラスタを使います。
# k3s kubectl get node -o wide
NAME STATUS ROLES AGE VERSION INTERNAL-IP EXTERNAL-IP OS-IMAGE KERNEL-VERSION CONTAINER-RUNTIME
rancher Ready control-plane,etcd,master 157d v1.27.10+k3s2 192.168.0.208 <none> Ubuntu 24.04 LTS 6.8.0-36-generic containerd://1.7.11-k3s2.27
アーキテクチャはamd64です。
dockerは入れてません。
# uname -m
x86_64
# docker
Command 'docker' not found, but can be installed with:
snap install docker # version 24.0.5, or
apt install docker.io # version 24.0.7-0ubuntu4.1
apt install podman-docker # version 4.9.3+ds1-1ubuntu0.2
See 'snap info docker' for additional versions.
以下構築済みの状態ですがRancherとharborが同居してます。
# k3s kubectl get pod -A
NAMESPACE NAME READY STATUS RESTARTS AGE
buildkit buildkitd-bb5679cd9-2fzhk 1/1 Running 0 74m
buildkit buildkitd-bb5679cd9-h6vsj 1/1 Running 0 74m
buildkit buildkitd-bb5679cd9-ljvc2 1/1 Running 0 104m
cattle-fleet-local-system fleet-agent-6779fb5dd9-8kv6j 1/1 Running 0 2d14h
cattle-fleet-system fleet-controller-696d4b8878-74rqc 1/1 Running 1 (2d14h ago) 157d
cattle-fleet-system gitjob-694dd97686-zhsfc 1/1 Running 2 (2d14h ago) 157d
cattle-provisioning-capi-system capi-controller-manager-79ddf9b9d8-czdrk 1/1 Running 3 (2d14h ago) 157d
cattle-system rancher-8896c5d8c-l9xjd 1/1 Running 1 (2d14h ago) 157d
cattle-system rancher-webhook-dbdbf746-whc7m 1/1 Running 1 (51d ago) 157d
cert-manager cert-manager-75bf5d6774-mdg7t 1/1 Running 1 (2d14h ago) 157d
cert-manager cert-manager-cainjector-6b9f7767b7-snb2h 1/1 Running 1 (2d14h ago) 157d
cert-manager cert-manager-webhook-599d446d97-q8l8k 1/1 Running 0 157d
harbor harbor-1-1734180854-core-78c49f7965-nd9wc 1/1 Running 0 2d22h
harbor harbor-1-1734180854-database-0 1/1 Running 0 2d23h
harbor harbor-1-1734180854-jobservice-8d8d86bc8-vz7p7 1/1 Running 0 2d22h
harbor harbor-1-1734180854-portal-5c99cb7998-6hx8d 1/1 Running 0 2d23h
harbor harbor-1-1734180854-redis-0 1/1 Running 0 2d23h
harbor harbor-1-1734180854-registry-74ffdfc7f5-vx7x8 2/2 Running 0 2d22h
harbor harbor-1-1734180854-trivy-0 1/1 Running 0 2d23h
kube-system coredns-77ccd57875-wc4rd 1/1 Running 0 157d
kube-system helm-install-traefik-crd-xf46m 0/1 Completed 0 157d
kube-system helm-install-traefik-lrftr 0/1 Completed 1 157d
kube-system local-path-provisioner-957fdf8bc-jq9s6 1/1 Running 0 157d
kube-system metrics-server-648b5df564-xflp4 1/1 Running 0 157d
kube-system svclb-buildkitd-a642124b-8fshw 1/1 Running 0 22h
kube-system svclb-traefik-94a99924-swg6f 2/2 Running 0 157d
kube-system traefik-768bdcdcdd-nmdq4 1/1 Running 0 157d
local-path-storage local-path-provisioner-7cd974d68b-fsl79 1/1 Running 0 57d
harborはingressでアクセスできるようにしています。
# kubectl get ingress -n harbor
NAME CLASS HOSTS ADDRESS PORTS AGE
harbor-1-1734180854-ingress traefik harbor.tsuchinokometal.com 192.168.0.208 80 2d23h
Harborでpayaraプロジェクト作りました。
ここにpushしようと思います。
Buildkitインストール
こちら を参考に進めます。
まずmkcert を使えるようにします。
# apt update
# apt install libnss3-tools
# curl -JLO "https://dl.filippo.io/mkcert/latest?for=linux/amd64"
# chmod +x mkcert-v*-linux-amd64
# cp mkcert-v*-linux-amd64 /usr/local/bin/mkcert
# mkcert --version
v1.4.4
手順の通りスクリプトを実行します。
# ./create-certs.sh buildkit.tsuchinokometal.com
実行後.certsディレクトリができていると思います。
次にリソースをデプロイしますが、
serviceはclusterIPからLoadBalancerに変更します。
apiVersion: v1
kind: Service
metadata:
labels:
app: buildkitd
name: buildkitd
spec:
ports:
- port: 1234
protocol: TCP
targetPort: 1234
selector:
app: buildkitd
type: LoadBalancer
ではデプロイします。
# kubectl create ns buildkit
namespace/buildkit created
# kubectl apply -f .certs/buildkit-daemon-certs.yaml -n buildkit
secret/buildkit-daemon-certs created
# kubectl apply -f deployment+service.rootless.yaml -n buildkit
deployment.apps/buildkitd created
service/buildkitd created
# kubectl get pod,svc -n buildkit
NAME READY STATUS RESTARTS AGE
pod/buildkitd-bb5679cd9-gwv22 1/1 Running 0 13m
NAME TYPE CLUSTER-IP EXTERNAL-IP PORT(S) AGE
service/buildkitd LoadBalancer 10.43.202.135 192.168.0.208 1234:30889/TCP 13m
必要であればレプリカ数を増やしておいてください。
buildctlインストール
今回はこのk3sクラスタノードからbuildctlを実行します。
こちら
からバイナリをダウンロードします。
# wget https://github.com/moby/buildkit/releases/download/v0.18.1/buildkit-v0.18.1.linux-amd64.tar.gz
# tar -zxvf buildkit-v0.18.1.linux-amd64.tar.gz
# cp bin/buildctl /usr/local/bin/buildctl
# buildctl --version
buildctl github.com/moby/buildkit v0.18.1 eb68885955169461d72dc2b7e6d084100fcaba86
ビルドする
buildkitとharborにホスト名でアクセスしたいので名前解決できるようにしておいてください。
# dig buildkit.tsuchinokometal.com +short
192.168.0.208
# dig harbor.tsuchinokometal.com +short
192.168.0.208
次にharborへの認証情報をdocker loginで準備します。
こちら
によると
dockerコマンドと同じく~/.docker/config.jsonを読み込むそうです。
このノードにはdockerがインストールされていないため、
別のノードで作成したconfig.jsonを配置しました。
ではDockerfileを準備してビルドとharborへのpushを行います。
以下のDockerfileでテストしました。
FROM payara/micro:6.2024.11-jdk21
USER root
ENV TZ=Asia/Tokyo
RUN apk update && \
apk add --no-cache curl
USER payara
今回準備した環境だと以下のコマンドとなります。
# buildctl --addr tcp://buildkit.tsuchinokometal.com:1234 --tlscacert ~/buildkit/examples/kubernetes/.certs/client/ca.pem --tlscert ~/buildkit/examples/kubernetes/.certs/client/cert.pem --tlskey ~/buildkit/examples/kubernetes/.certs/client/key.pem build --frontend dockerfile.v0 --local context=. --local dockerfile=. --output type=image,name=harbor.tsuchinokometal.com/payara/payara-micro:v1,push=true,registry.insecure=true --opt platform=linux/amd64,linux/arm64
[+] Building 42.6s (10/10) FINISHED
=> [internal] load build definition from Dockerfile 0.1s
=> => transferring dockerfile: 159B 0.0s
=> [linux/arm64 internal] load metadata for docker.io/payara/micro:6.2024.11-jdk21 2.7s
=> [linux/amd64 internal] load metadata for docker.io/payara/micro:6.2024.11-jdk21 3.0s
=> [internal] load .dockerignore 0.0s
=> => transferring context: 2B 0.0s
=> [linux/arm64 1/2] FROM docker.io/payara/micro:6.2024.11-jdk21@sha256:af137eaf643e36058aa46d9c22c4868911acd5d422c97c4e1b4f609327658ce4 27.0s
=> => resolve docker.io/payara/micro:6.2024.11-jdk21@sha256:af137eaf643e36058aa46d9c22c4868911acd5d422c97c4e1b4f609327658ce4 0.0s
=> => sha256:5abffaa1ef4c6b16ff2c8ad2d8f261ae9ecc5125e897be7a3069629f6ac48db9 91.97MB / 91.97MB 3.1s
=> => sha256:5739008c1e55598d37247e5be754817de81c819fe13d3c2cc215dee99995d753 1.23kB / 1.23kB 0.2s
=> => sha256:4f4fb700ef54461cfa02571ae0db9a0dc1e0cdb5577484a6d75e68dc38e8acc1 32B / 32B 0.4s
=> => sha256:b7a6f767295c14d7a284325ff67e19eb86e59cb449ae4ba57a1fb9021269b8ca 1.06kB / 1.06kB 0.7s
=> => sha256:884f1dd273b5fb6c5c5abaa05c18f654ba47ad917b8f5eb6ffbce81d12843797 158.30MB / 158.30MB 7.6s
=> => sha256:9986a736f7d3d24bb01b0a560fa0f19c4b57e56c646e1f998941529d28710e6b 4.09MB / 4.09MB 0.7s
=> => extracting sha256:9986a736f7d3d24bb01b0a560fa0f19c4b57e56c646e1f998941529d28710e6b 0.4s
=> => extracting sha256:884f1dd273b5fb6c5c5abaa05c18f654ba47ad917b8f5eb6ffbce81d12843797 13.5s
=> => extracting sha256:b7a6f767295c14d7a284325ff67e19eb86e59cb449ae4ba57a1fb9021269b8ca 0.1s
=> => extracting sha256:4f4fb700ef54461cfa02571ae0db9a0dc1e0cdb5577484a6d75e68dc38e8acc1 0.1s
=> => extracting sha256:5739008c1e55598d37247e5be754817de81c819fe13d3c2cc215dee99995d753 0.1s
=> => extracting sha256:5abffaa1ef4c6b16ff2c8ad2d8f261ae9ecc5125e897be7a3069629f6ac48db9 5.1s
=> [linux/amd64 1/2] FROM docker.io/payara/micro:6.2024.11-jdk21@sha256:af137eaf643e36058aa46d9c22c4868911acd5d422c97c4e1b4f609327658ce4 27.0s
=> => resolve docker.io/payara/micro:6.2024.11-jdk21@sha256:af137eaf643e36058aa46d9c22c4868911acd5d422c97c4e1b4f609327658ce4 0.0s
=> => sha256:41a53c10c4839277a3c94786fd15990f992a1acabcaae2386c07a905b59e00bd 91.97MB / 91.97MB 4.1s
=> => sha256:409abbfe68a807f5ff3b54f1f87064ab826b139422876998a471465347051946 1.23kB / 1.23kB 0.9s
=> => sha256:e5c96d5a00af34b77c65d24aa64ab89cfba5fe996e838428454997952b31f5e5 1.06kB / 1.06kB 1.0s
=> => sha256:bb18763c34d852e9919975b994a787aff93af776d7fccd2d32accfcd83021930 160.75MB / 160.75MB 6.2s
=> => sha256:da9db072f522755cbeb85be2b3f84059b70571b229512f1571d9217b77e1087f 3.62MB / 3.62MB 0.4s
=> => extracting sha256:da9db072f522755cbeb85be2b3f84059b70571b229512f1571d9217b77e1087f 0.4s
=> => extracting sha256:bb18763c34d852e9919975b994a787aff93af776d7fccd2d32accfcd83021930 12.2s
=> => extracting sha256:e5c96d5a00af34b77c65d24aa64ab89cfba5fe996e838428454997952b31f5e5 0.1s
=> => extracting sha256:4f4fb700ef54461cfa02571ae0db9a0dc1e0cdb5577484a6d75e68dc38e8acc1 0.1s
=> => extracting sha256:409abbfe68a807f5ff3b54f1f87064ab826b139422876998a471465347051946 0.1s
=> => extracting sha256:41a53c10c4839277a3c94786fd15990f992a1acabcaae2386c07a905b59e00bd 5.0s
=> [linux/amd64 2/2] RUN apk update && apk add --no-cache curl 3.9s
=> [linux/arm64 2/2] RUN apk update && apk add --no-cache curl 7.3s
=> exporting to image 4.5s
=> => exporting layers 1.3s
=> => exporting manifest sha256:a453b0c12811222ded06904728307b0a2bcaa80db61e20b74d560ec55b41f24b 0.0s
=> => exporting config sha256:4a54f4394e951ebd2c62027ba7288df855ceb7c57b09d3c3524f7333588c904c 0.0s
=> => exporting manifest sha256:d5229c283d8118d594f38e67b2edbe723b273dbee46a78443183a78681f50b47 0.0s
=> => exporting config sha256:baef97762dcc560b07a355242841ca2a66fb939f8f8a12646843cc32225b686c 0.0s
=> => exporting manifest list sha256:ee3044d29fa7c3181069e4275ca990f924fdece2d8e21f08252713400ea64af6 0.0s
=> => pushing layers 2.1s
=> => pushing manifest for harbor.tsuchinokometal.com/payara/payara-micro:v1@sha256:ee3044d29fa7c3181069e4275ca990f924fdece2d8e21f08252713400ea64af6 0.9s
=> [auth] payara/payara-micro:pull,push token for harbor.tsuchinokometal.com
デプロイする
arm64のラズパイk8sクラスタにデプロイしてみます。
$ kubectl create deploy --image=harbor.tsuchinokometal.com/payara/payara-micro:v1@sha256:ee3044d29fa7c3181069e4275ca990f924fdece2d8e21f08252713400ea64af6 --replicas=2 payara
deployment.apps/payara created
$ kubectl get pod
NAME READY STATUS RESTARTS AGE
payara-786bf5bff-b8fbv 1/1 Running 0 14s
payara-786bf5bff-mw2fd 1/1 Running 0 14s
$ kubectl exec -it payara-786bf5bff-b8fbv -- date
Fri Dec 20 00:09:09 JST 2024
良さそうですね。