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 | 存储大小 | 设置以字节为单位或使用有效后缀指定的请求 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 | 存储大小 | 设置以字节为单位或使用有效后缀指定的 limit ephemeral-storage 值。例如requests.ephemeral-storage=100M | |
nodeselector | CSV 字符串 | 设置 Pod 的nodeSelector 标签。请参阅节点分配。 | |
annotation | CSV 字符串 | 在 Deployment 和 Pod 上设置其他注释。 | |
labels | CSV 字符串 | 在 Deployment 和 Pod 上设置其他标签。 | |
tolerations | CSV 字符串 | 配置 Pod 的污点容忍度。请参阅节点分配。 | |
serviceaccount | 字符串 | 设置 Pod 的serviceAccountName . | |
schedulername | 字符串 | 设置负责调度 Pod 的调度程序。 | |
timeout | 时间 | 120s | 设置超时限制,以确定 Buildx 在构建之前等待 Pod 预置的时间。 |
rootless | 布尔 | false | 以非 root 用户身份运行容器。参见 rootless mode。 |
loadbalance | 字符串 | sticky | 负载均衡策略 (sticky 或random ).如果设置为sticky ,则使用上下文路径的哈希值选择 Pod。 |
qemu.install | 布尔 | false | 安装 QEMU 仿真以获得多平台支持。参见 QEMU。 |
qemu.image | 字符串 | tonistiigi/binfmt:latest | 设置 QEMU 仿真镜像。参见 QEMU。 |
扩展 BuildKit
Kubernetes 驱动程序的主要优点之一是,您可以扩展 增加和减少构建器副本的数量,以处理增加的构建负载。缩放 可使用以下驱动程序选项进行配置:
replicas=N
这会将 BuildKit Pod 的数量扩展到所需的大小。默认情况下,它 仅创建一个 Pod。增加副本数量可让您将 集群中多个节点的优势。
requests.cpu
,requests.memory
,requests.ephemeral-storage
,limits.cpu
,limits.memory
,limits.ephemeral-storage
这些选项允许请求和限制每个选项可用的资源 BuildKit pod 根据此处的官方 Kubernetes 文档。
例如,要创建 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
选择
Node 池中的随机节点,从而在
副本。sticky
(默认)尝试连接执行的相同构建
多次到同一个节点,保证更好的利用本地缓存。
有关可伸缩性的更多信息,请参阅docker buildx create
.
节点分配
Kubernetes 驱动允许你控制 BuildKit Pod 的调度
使用nodeSelector
和tolerations
驱动程序选项。
您还可以设置schedulername
选项(如果要完全使用自定义调度程序)。
您可以使用annotations
和labels
驱动程序选项以应用其他
元数据添加到托管生成器的 Deployment 和 Pod 中。
的nodeSelector
parameter 是逗号分隔的字符串
键值对,其中 key 是节点标签,value 是标签
发短信。例如:"nodeselector=kubernetes.io/arch=arm64"
这tolerations
parameter 是以分号分隔的污点列表。它接受
与 Kubernetes 清单相同的值。每tolerations
entry 指定
污点键和值、运算符或效果。例如:"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
和arm64
:
$ docker buildx build \
--builder=kube \
--platform=linux/amd64,linux/arm64 \
-t <user>/<image> \
--push .
警告
QEMU 执行非原生平台的全 CPU 仿真,这很多 比原生版本慢。计算密集型任务,如 compilation 和 压缩/解压缩可能会对性能造成很大影响。
在构建中使用自定义 BuildKit 镜像或调用非原生Binaries可能会
要求您使用qemu.install
选项
创建构建器:
$ 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
,包含单个生成器节点
叫builder-amd64
.使用 分配节点名称--node
是可选的。构建
如果您不提供 Node Name,则会生成一个 Random Node Name。
请注意,节点的 Buildx 概念与 Kubernetes 的概念不同 的节点。在这种情况下,一个 Buildx 节点可以连接多个 Kubernetes 节点 相同的架构放在一起。
使用kube
builder 创建,您现在可以将另一个架构引入
混合使用--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
镜像,通过指定这些
platforms 一起添加到您的构建命令中:
$ 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
这将创建没有 Pod 的 PodsecurityContext.privileged
.
需要 Kubernetes 版本 1.19 或更高版本。使用 Ubuntu 作为主机内核是 推荐。
示例:在 Kubernetes 中创建 Buildx 构建器
本指南介绍如何:
- 为您的 Buildx 资源创建一个命名空间
- 创建 Kubernetes 构建器。
- 列出可用的生成器
- 使用 Kubernetes 构建器构建镜像
先决条件:
创建一个
buildkit
Namespace。创建单独的命名空间有助于将 Buildx 资源与 集群中的其他资源。
$ kubectl create namespace buildkit namespace/buildkit created
使用 Kubernetes 驱动程序创建新的构建器:
$ docker buildx create \ --bootstrap \ --name=kube \ --driver=kubernetes \ --driver-opt=namespace=buildkit
注意
请记住在 driver 选项中指定命名空间。
列出可用的构建器
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
.$ 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
标志 命令。例如::# 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 参考。