Kubernetes 驱动程序
Kubernetes 驱动程序可让您将本地开发或 CI 环境连接到 Kubernetes 集群中的构建器,以允许访问更强大的计算资源(可选)在多个本机架构上。
概要
运行以下命令来创建一个名为 的新构建器,kube
该构建器使用 Kubernetes 驱动程序:
$ docker buildx create \
--bootstrap \
--name=kube \
--driver=kubernetes \
--driver-opt=[key=value,...]
下表描述了您可以传递给的可用的特定于驱动程序的选项--driver-opt
:
范围 | 类型 | 默认 | 描述 |
---|---|---|---|
image | 细绳 | 设置用于运行 BuildKit 的图像。 | |
namespace | 细绳 | 当前 Kubernetes 上下文中的命名空间 | 设置 Kubernetes 命名空间。 |
default-load | 布尔值 | false | 自动将镜像加载到 Docker Engine 镜像存储。 |
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 | 存储大小 | 设置以字节为单位指定或带有有效后缀的请求临时存储值。例如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 | 细绳 | 设置 pod 的serviceAccountName . | |
schedulername | 细绳 | 设置负责调度 pod 的调度程序。 | |
rootless | true ,false | false | 以非 root 用户身份运行容器。请参阅 无根模式。 |
loadbalance | sticky ,random | sticky | 负载均衡策略。如果设置为sticky ,则使用上下文路径的哈希值来选择 pod。 |
qemu.install | true ,false | 安装 QEMU 仿真以支持多平台。请参阅 QEMU。 | |
qemu.image | 细绳 | tonistiigi/binfmt:latest | 设置 QEMU 仿真映像。请参阅 QEMU。 |
扩展构建套件
Kubernetes 驱动程序的主要优点之一是您可以上下扩展构建器副本的数量以处理增加的构建负载。可使用以下驱动程序选项配置缩放:
replicas=N
这会将 BuildKit Pod 的数量缩放到所需的大小。默认情况下,它只创建一个 pod。增加副本数量可以让您利用集群中的多个节点。
requests.cpu
,,,,,,,requests.memory
requests.ephemeral-storage
limits.cpu
limits.memory
limits.ephemeral-storage
这些选项允许根据此处的官方 Kubernetes 文档请求和限制每个 BuildKit pod 可用的资源 。
例如,要创建 4 个 BuildKit pod 副本:
$ docker buildx create \
--bootstrap \
--name=kube \
--driver=kubernetes \
--driver-opt=namespace=buildkit,replicas=4
列出 pod,您会得到:
$ 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
。
节点分配
nodeSelector
Kubernetes 驱动程序允许您使用和驱动程序选项来控制 BuildKit pod 的调度tolerations
。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"
这些选项接受 CSV 分隔的字符串作为值。由于 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
和构建 Linux 映像arm64
:
$ docker buildx build \
--builder=kube \
--platform=linux/amd64,linux/arm64 \
-t <user>/<image> \
--push .
警告
QEMU 对非本机平台执行全 CPU 模拟,这比本机构建慢得多。编译和压缩/解压缩等计算量大的任务可能会严重影响性能。
使用自定义 BuildKit 映像或在构建中调用非本机二进制文件可能需要您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"
这将创建一个名为 的 Buildx 构建器kube
,其中包含一个名为 的构建器节点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
对想要支持的任意数量的体系结构重复该命令。
无根模式
Kubernetes 驱动程序支持无根模式。有关无根模式如何工作及其要求的更多信息,请参阅 此处。
要在集群中打开它,您可以使用rootless=true
驱动程序选项:
$ docker buildx create \
--name=kube \
--driver=kubernetes \
--driver-opt=namespace=buildkit,rootless=true
这将创建没有securityContext.privileged
.
需要 Kubernetes 版本 1.19 或更高版本。推荐使用Ubuntu作为主机内核。
示例:在 Kubernetes 中创建 Buildx 构建器
本指南向您展示如何:
- 为您的 Buildx 资源创建命名空间
- 创建 Kubernetes 构建器。
- 列出可用的构建器
- 使用 Kubernetes 构建器构建镜像
先决条件:
创建
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
使用 来检查构建驱动程序创建的正在运行的 Pod
kubectl
。$ 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
,同时在本地保留驱动程序配置。--builder
通过在运行 buildx 命令时包含该标志来使用新的构建器。例如: :# 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 参考。