はじめに
この記事は旧ブログからの移行記事です。バージョン等古い可能性がありますのでご注意ください。
概要
Buildkitを使い、Kubernetes上でDocker Imageをビルドする
自分のローカルやビルドサーバで複数のDocker Imageを同時にビルドすると、その環境のスペックにビルドの速度が依存してしまうので、高速化するためにはスケールアップする必要がある。そこで今回は、BuildkitのHostをKubernetes上のPodで実行してみる。これにより、Kubernetesのノードをスケールアウトすることで、同時に実行した場合でも必要なリソースを確保できる。
環境構築
各ソフトウェアのバージョンは次の通り
- kubectl v1.17
- kubernetes v1.16.7
- buildctl github.com/moby/buildkit v0.7.1
下記の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回目以降はキャッシュされるため高速にビルドが可能になる。