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_k3s_01.png

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

良さそうですね。