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儲存大小設定以位元組或有效字尾指定的請求臨時儲存值。例如 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 標籤。參見節點分配
annotationsCSV 字串在部署和 Pod 上設定額外的註解。
labelsCSV 字串在部署和 Pod 上設定額外的標籤。
tolerationsCSV 字串配置 Pod 的汙點容忍度 (taint toleration)。參見節點分配
serviceaccount字串設定 Pod 的 serviceAccountName
schedulername字串設定負責排程 Pod 的排程器。
timeout時間120s設定超時限制,該限制確定 Buildx 在構建之前將等待 Pod 預配多久。
rootless布林值false以非 root 使用者執行容器。參見無 root 模式
loadbalance字串sticky負載均衡策略(stickyrandom)。如果設定為 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

    這些選項允許根據官方 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 引數是一個分號分隔的汙點 (taint) 列表。它接受與 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 標誌並指定要輸出到的平臺。

例如,要構建適用於 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 命令。

無 root 模式

Kubernetes 驅動程式支援無 root 模式。有關無 root 模式的工作原理及其要求的更多資訊,請參見此處

要在叢集中開啟此功能,您可以使用 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 參考文件

頁面選項