Pull to refresh

Масштабируем и ускоряем сборки с помощью buildkit и Kubernetes. Upd

Reading time2 min
Views4.1K

О теории можно почитать здесь.

Это больше инструкция по применению.

  1. Берем какое-нибудь web-приложение с большим количеством зависимостей:

git clone https://github.com/quay/quay.git && cd quay
time docker build --no-cache .
real    8m38.954s

Сборка занимает примерно 8 минут без кэша. Примерно похожие результаты получаются если использовать podman/buildah с crun вместо runc.

  1. Создаем сборочную ферму в Кубере с помощью 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
  1. Теперь можно собирать в Кубере с помощью 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

Tags:
Hubs:
Total votes 3: ↑1 and ↓2+1
Comments1

Articles