Note
Source code for this example available in ./examples/kubernetes
Kubernetes manifests for BuildKit¶
This directory contains Kubernetes manifests for Pod
, Deployment
(with Service
), StatefulSet
, and Job
.
Pod
: good for quick-startDeployment
+Service
: good for random load balancing with registry-side cacheStateFulset
: good for client-side load balancing, without registry-side cacheJob
: good if you don't want to have daemon pods
Using Rootless mode (*.rootless.yaml
) is recommended because Rootless mode image is executed as non-root user (UID 1000) and doesn't need securityContext.privileged
.
Rootless mode may not work on some host kernels. See rootless mode docs.
See also "Building Images Efficiently And Securely On Kubernetes With BuildKit" (KubeCon EU 2019).
Pod
¶
$ kubectl apply -f pod.rootless.yaml
$ buildctl \
--addr kube-pod://buildkitd \
build --frontend dockerfile.v0 --local context=/path/to/dir --local dockerfile=/path/to/dir
If rootless mode doesn't work, try pod.privileged.yaml
.
kube-pod://
connection helper requires Kubernetes role that can access pods/exec
resources. If pods/exec
is not accessible, use Service
instead (See below).
Deployment
+ Service
¶
Setting up mTLS is highly recommended.
./create-certs.sh SAN [SAN...]
can be used for creating certificates.
$ ./create-certs.sh 127.0.0.1
The daemon certificates is created as Secret
manifest named buildkit-daemon-certs
.
$ kubectl apply -f .certs/buildkit-daemon-certs.yaml
Apply the Deployment
and Service
manifest:
$ kubectl apply -f deployment+service.rootless.yaml
$ kubectl scale --replicas=10 deployment/buildkitd
Run buildctl
with TLS client certificates:
$ kubectl port-forward service/buildkitd 1234
$ buildctl \
--addr tcp://127.0.0.1:1234 \
--tlscacert .certs/client/ca.pem \
--tlscert .certs/client/cert.pem \
--tlskey .certs/client/key.pem \
build --frontend dockerfile.v0 --local context=/path/to/dir --local dockerfile=/path/to/dir
StatefulSet
¶
StatefulSet
is useful for consistent hash mode.
$ kubectl apply -f statefulset.rootless.yaml
$ kubectl scale --replicas=10 statefulset/buildkitd
$ buildctl \
--addr kube-pod://buildkitd-4 \
build --frontend dockerfile.v0 --local context=/path/to/dir --local dockerfile=/path/to/dir
See ./consistenthash
for how to use consistent hashing.
Job
¶
$ kubectl apply -f job.rootless.yaml
To push the image to the registry, you also need to mount ~/.docker/config.json
and set $DOCKER_CONFIG
to /path/to/.docker
directory.