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.cpuCPU单元设置以 Kubernetes CPU 为单位指定的请求 CPU 值。例如requests.cpu=100mrequests.cpu=2
requests.memory内存大小设置以字节为单位或带有有效后缀指定的请求内存值。例如requests.memory=500Mirequests.memory=4G
requests.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存储大小设置以字节为单位或使用有效后缀指定的临时存储限制值。例如requests.ephemeral-storage=100M
nodeselectorCSV 字符串设置 pod 的nodeSelector标签。请参阅 节点分配
annotationCSV 字符串在部署和 Pod 上设置附加注释。
labelsCSV 字符串在部署和 Pod 上设置附加标签。
tolerationsCSV 字符串配置 pod 的污染容忍度。请参阅 节点分配
serviceaccount细绳设置 pod 的serviceAccountName.
schedulername细绳设置负责调度 pod 的调度程序。
rootlesstrue,falsefalse以非 root 用户身份运行容器。请参阅 无根模式
loadbalancesticky,randomsticky负载均衡策略。如果设置为sticky,则使用上下文路径的哈希值来选择 pod。
qemu.installtrue,false安装 QEMU 仿真以支持多平台。请参阅 QEMU
qemu.image细绳tonistiigi/binfmt:latest设置 QEMU 仿真映像。请参阅 QEMU

扩展构建套件

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

  • replicas=N

    这会将 BuildKit Pod 的数量缩放到所需的大小。默认情况下,它只创建一个 pod。增加副本数量可以让您利用集群中的多个节点。

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

节点分配

nodeSelectorKubernetes 驱动程序允许您使用和驱动程序选项来控制 BuildKit pod 的调度tolerationsschedulername如果您想完全使用自定义调度程序,您也可以设置该选项。

您可以使用annotationslabels驱动程序选项将其他元数据应用到托管构建器的部署和 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 构建器构建镜像

先决条件:

  • 您有一个现有的 Kubernetes 集群。如果您还没有,您可以按照以下步骤安装 minikube
  • 您想要连接的集群可以通过命令访问kubectl,并根据需要适当设置KUBECONFIG环境变量 。
  1. 创建buildkit命名空间。

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

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

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

    笔记

    请记住在驱动程序选项中指定名称空间。

  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. --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 参考