Kubernetes 驱动程序

Kubernetes 驱动程序允许您连接本地开发或 CI 环境分配给 Kubernetes 集群中的构建者,以允许访问更多 强大的计算资源,可选择在多个原生架构上使用。

概要

运行以下命令以创建一个名为 的新生成器,该生成器使用 Kubernetes 驱动程序:kube

$ 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.cpuCPU 单位设置以 Kubernetes CPU 为单位指定的请求 CPU 值。例如 或requests.cpu=100mrequests.cpu=2
requests.memory内存大小设置以字节为单位或有效后缀指定的请求内存值。例如 或requests.memory=500Mirequests.memory=4G
requests.ephemeral-storage存储大小设置以字节为单位或使用有效后缀指定的请求 ephemeral-storage 值。例如requests.ephemeral-storage=2Gi
limits.cpuCPU 单位设置以 Kubernetes CPU 为单位指定的限制 CPU 值。例如 或requests.cpu=100mrequests.cpu=2
limits.memory内存大小设置以字节为单位或使用有效后缀指定的限制内存值。例如 或requests.memory=500Mirequests.memory=4G
limits.ephemeral-storage存储大小设置以字节为单位或使用有效后缀指定的 limit ephemeral-storage 值。例如requests.ephemeral-storage=100M
nodeselectorCSV 字符串设置 Pod 的标签。请参阅节点分配nodeSelector
annotationCSV 字符串在 Deployment 和 Pod 上设置其他注释。
labelsCSV 字符串在 Deployment 和 Pod 上设置其他标签。
tolerationsCSV 字符串配置 Pod 的污点容忍度。请参阅节点分配
serviceaccount字符串设置 Pod 的 .serviceAccountName
schedulername字符串设置负责调度 Pod 的调度程序。
timeout时间120s设置超时限制,以确定 Buildx 在构建之前等待 Pod 预置的时间。
rootless布尔false以非 root 用户身份运行容器。参见 rootless mode
loadbalance字符串sticky负载均衡策略( 或 )。如果设置为 ,则使用上下文路径的哈希选择 Pod。stickyrandomsticky
qemu.install布尔false安装 QEMU 仿真以获得多平台支持。参见 QEMU
qemu.image字符串tonistiigi/binfmt:latest设置 QEMU 仿真镜像。参见 QEMU

扩展 BuildKit

Kubernetes 驱动程序的主要优点之一是,您可以扩展 增加和减少构建器副本的数量,以处理增加的构建负载。缩放 可使用以下驱动程序选项进行配置:

  • replicas=N

    这会将 BuildKit Pod 的数量扩展到所需的大小。默认情况下,它 仅创建一个 Pod。增加副本数量可让您将 集群中多个节点的优势。

  • requests.cpu, , , , ,requests.memoryrequests.ephemeral-storagelimits.cpulimits.memorylimits.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

此外,您还可以使用该选项来控制 存在多个副本时的负载均衡行为。 选择 Node 池中的随机节点,从而在 副本。 (默认)尝试连接执行的相同构建 多次到同一个节点,保证更好的利用本地缓存。loadbalance=(sticky|random)randomsticky

有关可扩展性的更多信息,请参阅 docker buildx create 的选项。

节点分配

Kubernetes 驱动允许你控制 BuildKit Pod 的调度 使用 AND 驱动程序选项。 如果要完全使用自定义计划程序,也可以设置该选项。nodeSelectortolerationsschedulername

您可以使用 和 driver 选项来应用其他 元数据添加到托管生成器的 Deployment 和 Pod 中。annotationslabels

参数的值是逗号分隔的字符串 键值对,其中 key 是节点标签,value 是标签 发短信。例如:nodeSelector"nodeselector=kubernetes.io/arch=arm64"

该参数是以分号分隔的污点列表。它接受 与 Kubernetes 清单相同的值。每个条目指定 污点键和值、运算符或效果。例如:tolerationstolerations"tolerations=key=foo,value=bar;key=foo2,operator=exists;key=foo3,effect=NoSchedule"

这些选项接受 CSV 分隔的字符串作为值。由于引用规则 shell 命令,则必须将值括在单引号中。您甚至可以将所有 of 括在单引号中,例如:--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

与驱动程序一样,Kubernetes 驱动程序也支持使用 QEMU(用户 模式)为非原生平台构建镜像。包括标志 并指定要输出到的平台。docker-container--platform

例如,要为 和 构建 Linux 镜像:amd64arm64

$ docker buildx build \
  --builder=kube \
  --platform=linux/amd64,linux/arm64 \
  -t <user>/<image> \
  --push .

警告

QEMU 执行非原生平台的全 CPU 仿真,这很多 比原生版本慢。计算密集型任务,如 compilation 和 压缩/解压缩可能会对性能造成很大影响。

在构建中使用自定义 BuildKit 镜像或调用非原生二进制文件可能会 要求您在以下情况下使用选项 创建构建器:qemu.install

$ docker buildx create \
  --bootstrap \
  --name=kube \
  --driver=kubernetes \
  --driver-opt=namespace=buildkit,qemu.install=true

本地

如果你可以访问不同架构的集群节点,则 Kubernetes 驱动程序可以利用这些进行本机构建。为此,请使用 .--appenddocker 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 构建器,其中包含一个构建器节点 叫。分配节点名称 using 是可选的。构建 如果您不提供 Node Name,则会生成一个 Random Node Name。kubebuilder-amd64--node

请注意,节点的 Buildx 概念与 Kubernetes 的概念不同 的节点。在这种情况下,一个 Buildx 节点可以连接多个 Kubernetes 节点 相同的架构放在一起。

创建构建器后,您现在可以将另一个架构引入 使用 .例如,要添加 :kube--appendarm64

$ 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*

现在,您可以通过指定 platforms 一起添加到您的构建命令中:amd64arm64

$ docker buildx build --builder=kube --platform=linux/amd64,linux/arm64 -t <user>/<image> --push .

您可以对任意数量的架构重复该命令 您想要支持的。buildx create --append

无根模式

Kubernetes 驱动程序支持无根模式。有关如何操作的更多信息 无根模式有效,其要求,请参见此处

要在集群中启用它,您可以使用 driver 选项: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 构建器构建镜像

先决条件:

  • 您有一个现有的 Kubernetes 集群。如果您还没有,请 可以通过安装 Minikube 来跟进。
  • 要连接的集群可通过命令 并根据需要适当设置 environment 变量。kubectlKUBECONFIG
  1. 创建命名空间。buildkit

    创建单独的命名空间有助于将 Buildx 资源与 集群中的其他资源。

    $ kubectl create namespace buildkit
    namespace/buildkit created
    
  2. 使用 Kubernetes 驱动程序创建新的构建器:

    $ docker buildx create \
      --bootstrap \
      --name=kube \
      --driver=kubernetes \
      --driver-opt=namespace=buildkit
    

    注意

    请记住在 driver 选项中指定命名空间。

  3. 列出可用的构建器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
    
  4. 使用 检查由构建驱动程序创建的正在运行的 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

  5. 通过在运行 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 参考