О теории можно почитать здесь.
Это больше инструкция по применению.
Берем какое-нибудь web-приложение с большим количеством зависимостей:
git clone https://github.com/quay/quay.git && cd quay
time docker build --no-cache .
real 8m38.954s
Сборка занимает примерно 8 минут без кэша. Примерно похожие результаты получаются если использовать podman/buildah с crun вместо runc.
Создаем сборочную ферму в Кубере с помощью buildx:
docker buildx create --platform amd64 --append --name kube-build-farm --driver kubernetes --driver-opt loadbalance=random --driver-opt replicas=2 --driver-opt namespace=buildx --driver-opt limits.cpu=1 --config ./config.toml --bootstrap
В config.toml указываем локальные директории под кэш:
cache-to = ["type=local,dest=/tmp/cache,mode=max"]
cache-from = ["type=local,src=/tmp/cache,mode=max"]
Видим как buildx разворачивает воркеров в Кубере:
kubectl get all -n buildx
NAME READY STATUS RESTARTS AGE
pod/kube-build-farm0-7949dd94db-frp6d 1/1 Running 0 30m
pod/kube-build-farm0-7949dd94db-qzhhz 1/1 Running 0 30m
Теперь можно собирать в Кубере с помощью docker buildix use kube-build-farm && docker buildix build ., или можно использовать Docker compose с buildkit:
COMPOSE_DOCKER_CLI_BUILD=1 \
DOCKER_BUILDKIT=1 \
DOCKER_DEFAULT_PLATFORM=linux/amd64 \
docker-compose build
Получаем масштабируемость и прозрачность процессов для DevOps, DevSecOps и SRE. Теперь можно использовать богатый инструментарий Kubernetes для работы со сборками и тестами.
upd:
Сравниваем сборку в kubernetes:
time docker buildx --builder kube-build-farm build . --no-cache
10:32.01 total
И на локальной машине (desktop-linux – Mac m1):
time docker buildx --builder desktop-linux build . --no-cache
13:41.42 total
Особенно заметной разница становится когда нужно собирать под разные архитектуры.
Сначала создаем builder для Куба:
docker buildx create --platform amd64 --append --name kube-build-farm --driver kubernetes --driver-opt loadbalance=random --driver-opt replicas=6 --driver-opt namespace=kbuild --driver-opt=qemu.install=true --driver-opt limits.cpu=2 --bootstrap
--driver-opt=qemu.install=true
– это флаг нужен для установки qemu в контейнерах.
Можно собирать сразу для нескольких платформ:
time docker buildx --builder kube-build-farm build --platform linux/amd64,linux/arm64 . --no-cache
Можно сократить в несколько раз сборку сложного приложения в Docker compose в несколько раз
time COMPOSE_DOCKER_CLI_BUILD=1 DOCKER_BUILDKIT=1 docker-compose build --builder kube-build-farm --no-cache
20:45.86 total
vs
80~ минут на Mac m1