はじめに

この記事は旧ブログからの移行記事です。バージョン等古い可能性がありますのでご注意ください。

概要

Buildkitを使い、Kubernetes上でDocker Imageをビルドする

自分のローカルやビルドサーバで複数のDocker Imageを同時にビルドすると、その環境のスペックにビルドの速度が依存してしまうので、高速化するためにはスケールアップする必要がある。そこで今回は、BuildkitのHostをKubernetes上のPodで実行してみる。これにより、Kubernetesのノードをスケールアウトすることで、同時に実行した場合でも必要なリソースを確保できる。

環境構築

各ソフトウェアのバージョンは次の通り

下記のDeploymentを適用する

apiVersion: apps/v1
kind: Deployment
metadata:
  labels:
    app: buildkitd
  name: buildkitd
spec:
  selector:
    matchLabels:
      app: buildkitd
  template:
    metadata:
      labels:
        app: buildkitd
    spec:
      containers:
      - image: moby/buildkit:latest
        args:
        - --addr
        - unix:///run/buildkit/buildkitd.sock
        - --addr
        - tcp://0.0.0.0:1234
        name: buildkitd
        ports:
        - containerPort: 1234
        securityContext:
          privileged: true

ソースコードを確認したところ下記のように指定が可能。

$ export BUILDKIT_HOST="kube-pod://<pod>?context=<context>&namespace=<namespace>&container=<container>"

注意点として、"^[-a-z0-9.]+$" の正規表現にマッチする必要があるので、特にcontextは注意しておく。

環境変数を設定後、buildctlコマンドを使ってbuildkit on kubernetesを実現する

$ buildctl build --output type=image,name=<image>,push=false --frontend=dockerfile.v0 --local context=. --local dockerfile=.

--outputで出力をimageにして、dockerイメージを出力する。pushをtrueにすると実行後repositoryにpushされる。 --local はローカルのディレクトリへのアクセスを許可するもの。これで基本的な動作については問題なく完了する。1回目の実行時はpodにキャッシュが存在しないので、ビルドに時間がかかるが、2回目以降はキャッシュされるため高速にビルドが可能になる。