Kubernetes 驱动
Kubernetes 驱动程序允许您将本地开发或 CI 环境连接到 Kubernetes 集群中的构建器,以访问更强大的计算资源,可选地在多种原生架构上运行。
概述
运行以下命令以创建一个使用Kubernetes驱动程序的新构建器,命名为kube:
$ docker buildx create \
--bootstrap \
--name=kube \
--driver=kubernetes \
--driver-opt=[key=value,...]
以下表格描述了您可以传递给 --driver-opt 的可用驱动程序特定选项:
| 参数 | 类型 | 默认 | 描述 |
|---|---|---|---|
image | string | 设置用于运行 BuildKit 的镜像。 | |
namespace | string | 当前Kubernetes上下文中的命名空间 | 设置 Kubernetes 命名空间。 |
default-load | 布尔值 | false | 自动将镜像加载到 Docker 引擎镜像存储中。 |
replicas | 整数 | 1 | 设置要创建的 Pod 副本数量。参见 扩展 BuildKit |
requests.cpu | CPU 单位 | 设置以 Kubernetes CPU 为单位指定的请求 CPU 值。例如 requests.cpu=100m 或 requests.cpu=2 | |
requests.memory | 内存大小 | 设置以字节或有效后缀指定的请求内存值。例如 requests.memory=500Mi 或 requests.memory=4G | |
requests.ephemeral-storage | 存储大小 | 设置以字节或有效后缀指定的请求 ephemeral-storage 值。例如 requests.ephemeral-storage=2Gi | |
limits.cpu | CPU 单位 | 设置以Kubernetes CPU单位指定的CPU限制值。例如 requests.cpu=100m 或 requests.cpu=2 | |
limits.memory | 内存大小 | 设置以字节或有效后缀指定的内存限制值。例如 requests.memory=500Mi 或 requests.memory=4G | |
limits.ephemeral-storage | 存储大小 | 设置以字节或有效后缀指定的临时存储限制值。例如 requests.ephemeral-storage=100M | |
nodeselector | CSV 字符串 | 设置 Pod 的 nodeSelector 标签。参见
节点分配。 | |
annotation | CSV 字符串 | 在部署和 pod 上设置附加注解。 | |
labels | CSV 字符串 | 在部署和 pod 上设置附加标签。 | |
tolerations | CSV 字符串 | 配置 Pod 的污点容忍度。参见 节点分配。 | |
serviceaccount | string | 设置 pod 的 serviceAccountName。 | |
schedulername | string | 设置负责调度 pod 的调度器。 | |
timeout | 时间 | 120s | 设置超时限制,该限制确定 Buildx 在构建之前等待 pod 配置的时间长度。 |
rootless | 布尔值 | false | 以非root用户身份运行容器。参见 无根模式。 |
loadbalance | string | sticky | 负载均衡策略(sticky 或 random)。如果设置为 sticky,则使用上下文路径的哈希值来选择 Pod。 |
qemu.install | 布尔值 | false | 安装 QEMU 模拟以支持多平台。参见 QEMU。 |
qemu.image | string | tonistiigi/binfmt:latest | 设置 QEMU 模拟镜像。参见 QEMU。 |
缩放 BuildKit
Kubernetes 驱动程序的主要优势之一是您可以根据构建负载的增加上下调整构建器副本的数量。可以使用以下驱动程序选项配置扩展:
replicas=N这将 BuildKit 的副本数量调整为所需的规模。默认情况下,它仅创建一个副本。增加副本数量可让您充分利用集群中的多个节点。
requests.cpu,requests.memory,requests.ephemeral-storage,limits.cpu,limits.memory,limits.ephemeral-storage这些选项允许根据官方 Kubernetes 文档为每个 BuildKit pod 请求和限制可用资源 here。
例如,要创建4个副本的BuildKit pod:
$ docker buildx create \
--bootstrap \
--name=kube \
--driver=kubernetes \
--driver-opt=namespace=buildkit,replicas=4
列出的 pods,你得到这个:
$ kubectl -n buildkit get deployments
NAME READY UP-TO-DATE AVAILABLE AGE
kube0 4/4 4 4 8s
$ kubectl -n buildkit get pods
NAME READY STATUS RESTARTS AGE
kube0-6977cdcb75-48ld2 1/1 Running 0 8s
kube0-6977cdcb75-rkc6b 1/1 Running 0 8s
kube0-6977cdcb75-vb4ks 1/1 Running 0 8s
kube0-6977cdcb75-z4fzs 1/1 Running 0 8s
此外,您可以使用 loadbalance=(sticky|random) 选项在有多个副本时控制负载均衡行为。 random 从节点池中选择随机节点,使副本之间的负载分布更加均匀。 sticky (默认值)尝试将多次执行的相同构建每次都连接到同一个节点,以更好地利用本地缓存。
有关可扩展性的更多信息,请参阅 docker buildx create 的选项。
节点分配
Kubernetes 驱动允许您使用 nodeSelector 和 tolerations 驱动选项来控制 BuildKit Pod 的调度。
如果您想完全使用自定义调度程序,还可以设置 schedulername 选项。
您可以使用 annotations 和 labels 驱动程序选项为承载构建器的部署和 pod 应用附加元数据。
nodeSelector 参数的值是一个由逗号分隔的键值对字符串,其中键是节点标签,值是标签文本。例如: "nodeselector=kubernetes.io/arch=arm64"
参数 tolerations 是一个以分号分隔的污点列表。它接受与 Kubernetes 清单相同的值。每个 tolerations 条目指定一个污点键以及值、运算符或效果。例如:
"tolerations=key=foo,value=bar;key=foo2,operator=exists;key=foo3,effect=NoSchedule"
这些选项接受以逗号分隔的字符串作为值。由于 shell 命令的引号规则,您必须用单引号将值括起来。您甚至可以用单引号将所有 --driver-opt 括起来,例如:
$ docker buildx create \
--bootstrap \
--name=kube \
--driver=kubernetes \
'--driver-opt="nodeselector=label1=value1,label2=value2","tolerations=key=key1,value=value1"'
多平台构建
Kubernetes 驱动程序支持创建 多平台镜像, 可以使用 QEMU,也可以利用节点的本机架构。
QEMU
与 docker-container 驱动程序类似,Kubernetes 驱动程序也支持使用
QEMU(用户模式)为非本机平台构建镜像。包含 --platform 标志并指定要输出到的平台。
例如,为 amd64 和 arm64 构建 Linux 镜像:
$ docker buildx build \
--builder=kube \
--platform=linux/amd64,linux/arm64 \
-t <user>/<image> \
--push .
警告
QEMU 对非本地平台执行完整的 CPU 模拟,这比本地构建慢得多。像编译和压缩/解压缩这样的计算密集型任务可能会受到很大的性能影响。
在构建中使用自定义的 BuildKit 镜像或调用非本地Binaries可能需要在创建构建器时使用 qemu.install 选项显式启用 QEMU:
$ docker buildx create \
--bootstrap \
--name=kube \
--driver=kubernetes \
--driver-opt=namespace=buildkit,qemu.install=true
原生
如果你可以访问具有不同架构的集群节点,Kubernetes 驱动程序可以利用这些节点进行本机构建。为此,请使用 --append 标志的 docker buildx create。
首先,使用对单个架构的显式支持创建构建器,例如 amd64:
$ docker buildx create \
--bootstrap \
--name=kube \
--driver=kubernetes \
--platform=linux/amd64 \
--node=builder-amd64 \
--driver-opt=namespace=buildkit,nodeselector="kubernetes.io/arch=amd64"
这将创建一个名为 kube 的 Buildx 构建器,其中包含一个名为 builder-amd64 的构建器节点。使用 --node 为节点命名是可选的。如果您不提供名称,Buildx 会生成一个随机的节点名称。
请注意,Buildx 中的节点概念与 Kubernetes 中的节点概念不同。在此情况下,Buildx 节点可以将相同架构的多个 Kubernetes 节点连接在一起。
在创建了kube构建器后,您可以现在使用--append引入另一种架构。例如,要添加arm64:
$ docker buildx create \
--append \
--bootstrap \
--name=kube \
--driver=kubernetes \
--platform=linux/arm64 \
--node=builder-arm64 \
--driver-opt=namespace=buildkit,nodeselector="kubernetes.io/arch=arm64"
列出您的构建器会显示 kube 构建器的两个节点:
$ docker buildx ls
NAME/NODE DRIVER/ENDPOINT STATUS PLATFORMS
kube kubernetes
builder-amd64 kubernetes:///kube?deployment=builder-amd64&kubeconfig= running linux/amd64*, linux/amd64/v2, linux/amd64/v3, linux/386
builder-arm64 kubernetes:///kube?deployment=builder-arm64&kubeconfig= running linux/arm64*
现在,您可以通过在构建命令中同时指定这些平台来构建多架构amd64和arm64镜像:
$ docker buildx build --builder=kube --platform=linux/amd64,linux/arm64 -t <user>/<image> --push .
您可以根据需要支持的架构数量重复使用 buildx create --append 命令。
Rootless 模式
Kubernetes 驱动程序支持无 root 权限模式。有关无 root 权限模式的工作原理及其要求的更多信息,请参阅 此处。
要在集群中启用它,您可以使用 rootless=true 驱动程序选项:
$ docker buildx create \
--name=kube \
--driver=kubernetes \
--driver-opt=namespace=buildkit,rootless=true
这将创建您的 pods 而不使用 securityContext.privileged。
需要 Kubernetes 1.19 或更高版本。建议使用 Ubuntu 作为主机内核。
示例:在 Kubernetes 中创建 Buildx 构建器
本指南将向您展示如何:
- 为您的 Buildx 资源创建一个命名空间
- 创建一个Kubernetes构建器。
- 列出可用的构建器
- 使用您的 Kubernetes 构建器构建镜像
Prerequisites:
- 你已经有一个现有的Kubernetes集群。如果没有,你可以通过安装 minikube来跟上。
- 要连接的集群可通过
kubectl命令访问, 并使用KUBECONFIG环境变量 适当设置(如需)。
创建一个
buildkit命名空间。创建单独的命名空间有助于将 Buildx 资源与其他集群资源分开。
$ kubectl create namespace buildkit namespace/buildkit created使用 Kubernetes 驱动程序创建新的构建器:
$ docker buildx create \ --bootstrap \ --name=kube \ --driver=kubernetes \ --driver-opt=namespace=buildkit注意
请在驱动程序选项中指定命名空间。
使用
docker buildx ls列出可用的构建器$ docker buildx ls NAME/NODE DRIVER/ENDPOINT STATUS PLATFORMS kube kubernetes kube0-6977cdcb75-k9h9m running linux/amd64, linux/amd64/v2, linux/amd64/v3, linux/386 default * docker default default running linux/amd64, linux/386使用
kubectl检查由构建驱动程序创建的正在运行的 pods。$ kubectl -n buildkit get deployments NAME READY UP-TO-DATE AVAILABLE AGE kube0 1/1 1 1 32s $ kubectl -n buildkit get pods NAME READY STATUS RESTARTS AGE kube0-6977cdcb75-k9h9m 1/1 Running 0 32s构建驱动程序会在您指定的命名空间(在此情况下为
buildkit)上为您在集群上创建必要的资源,同时将驱动程序配置保存在本地。在运行 buildx 命令时包含
--builder标志,以使用您的新构建器。例如::# Replace <registry> with your Docker username # and <image> with the name of the image you want to build docker buildx build \ --builder=kube \ -t <registry>/<image> \ --push .
就是这样:您现在已经使用 Buildx 从 Kubernetes pod 构建了一个镜像。
进一步阅读
有关 Kubernetes 驱动程序的更多信息,请参阅 buildx 参考。