Kubernetes 驱动程序

Kubernetes 驱动程序允许您将本地开发或 CI 环境连接到 Kubernetes 集群中的构建器,以访问更强大的计算资源,并可选择支持多种原生架构。

概要

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

$ docker buildx create \
  --bootstrap \
  --name=kube \
  --driver=kubernetes \
  --driver-opt=[key=value,...]

下表描述了可以传递给 --driver-opt 的可用驱动程序特定选项

参数类型默认值描述
image字符串设置用于运行 BuildKit 的镜像。
命名空间字符串当前 Kubernetes 上下文中的命名空间设置 Kubernetes 命名空间。
默认加载布尔值false自动将镜像加载到 Docker Engine 镜像存储。
副本数整数1设置要创建的 Pod 副本数量。请参阅扩展 BuildKit
请求.cpuCPU 单位设置以 Kubernetes CPU 单位指定的请求 CPU 值。例如 requests.cpu=100mrequests.cpu=2
请求.内存内存大小设置以字节或带有效后缀指定的请求内存值。例如 requests.memory=500Mirequests.memory=4G
请求.临时存储存储大小设置以字节或带有效后缀指定的请求临时存储值。例如 requests.ephemeral-storage=2Gi
限制.cpuCPU 单位设置以 Kubernetes CPU 单位指定的限制 CPU 值。例如 requests.cpu=100mrequests.cpu=2
限制.内存内存大小设置以字节或带有效后缀指定的限制内存值。例如 requests.memory=500Mirequests.memory=4G
限制.临时存储存储大小设置以字节或带有效后缀指定的限制临时存储值。例如 requests.ephemeral-storage=100M
buildkit-root-volume-memory内存大小使用常规文件系统/var/lib/buildkit 挂载到 emptyDir 内存支持卷上,SizeLimit 作为值。例如,buildkit-root-folder-memory=6G
节点选择器CSV 字符串设置 Pod 的 nodeSelector 标签。请参阅节点分配
annotationsCSV 字符串在部署和 Pod 上设置额外的注解。
labelsCSV 字符串在部署和 Pod 上设置额外的标签。
容忍度CSV 字符串配置 Pod 的污点容忍度。请参阅节点分配
服务帐户字符串设置 Pod 的 serviceAccountName
调度器名称字符串设置负责调度 Pod 的调度器。
超时时间120秒设置超时限制,用于确定 Buildx 在构建前等待 Pod 预置的时间。
无根布尔值false以非 root 用户运行容器。请参阅无根模式
负载均衡字符串粘性负载均衡策略(stickyrandom)。如果设置为 sticky,则使用上下文路径的哈希值选择 Pod。
qemu.install布尔值false安装 QEMU 仿真以支持多平台。请参阅QEMU
qemu.image字符串tonistiigi/binfmt:latest设置 QEMU 仿真镜像。请参阅QEMU

扩展 BuildKit

Kubernetes 驱动程序的主要优点之一是,您可以根据构建负载的增加来向上或向下扩展构建器副本的数量。扩展可以通过以下驱动程序选项进行配置

  • 副本数=N

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

  • requests.cpurequests.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 的选项。

节点分配

Kubernetes 驱动程序允许您使用 nodeSelectortolerations 驱动程序选项来控制 BuildKit Pod 的调度。如果您想使用自定义调度器,还可以设置 schedulername 选项。

您可以使用 annotationslabels 驱动程序选项将额外的元数据应用于托管构建器的部署和 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 标志并指定您想要输出到的平台。

例如,构建一个用于 amd64arm64 的 Linux 镜像

$ 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 驱动程序可以利用这些节点进行原生构建。为此,请使用 docker buildx create--append 标志。

首先,创建您的构建器,并明确支持单一架构,例如 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*

您现在可以通过在构建命令中同时指定这些平台来构建多架构的 amd64arm64 镜像

$ 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 的 Pod。

需要 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. 使用 kubectl 检查构建驱动程序创建的正在运行的 Pod。

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

© . This site is unofficial and not affiliated with Kubernetes or Docker Inc.