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=100m` 或 `requests.cpu=2`
requests.memory記憶體大小設定以位元組或有效後綴指定的請求記憶體值。例如 `requests.memory=500Mi` 或 `requests.memory=4G`
requests.ephemeral-storage儲存空間大小設定以位元組或有效後綴指定的請求臨時儲存空間值。例如 `requests.ephemeral-storage=2Gi`
limits.cpuCPU 單位設定以 Kubernetes CPU 單位指定的限制 CPU 值。例如 `requests.cpu=100m` 或 `requests.cpu=2`
limits.memory記憶體大小設定以位元組或有效後綴指定的限制記憶體值。例如 `requests.memory=500Mi` 或 `requests.memory=4G`
limits.ephemeral-storage儲存空間大小設定以位元組或有效後綴指定的限制臨時儲存空間值。例如 `requests.ephemeral-storage=100M`
nodeselectorCSV 字串設定 pod 的 `nodeSelector` 標籤。請參閱節點指派
annotationCSV 字串在部署和 pod 上設定額外的註釋。
labelsCSV 字串在部署和 pod 上設定額外的標籤。
tolerationsCSV 字串設定 pod 的污點容忍度。請參閱節點指派
serviceaccount字串設定 pod 的 `serviceAccountName`。
schedulername字串設定負責排程 pod 的排程器。
timeout時間120s設定逾時限制,決定 Buildx 在建置前等待 pod 佈建的時間。
rootless布林值false以非 root 使用者身分執行容器。請參閱無 root 模式
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`

    這些選項允許根據 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 命令。

無根模式

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 驅動程式建立新的建置器

    注意事項

    請記得在驅動程式選項中指定命名空間。

  • 使用 docker buildx ls 列出可用的建置器

  • 使用 kubectl 檢查建置驅動程式建立的正在執行的 Pod。

    建置驅動程式會在您叢集的指定命名空間(在本例中為 buildkit)中建立必要的資源,同時將您的驅動程式設定保留在本地。

  • 在執行 buildx 命令時,透過包含 --builder 旗標來使用您的新建置器。例如:

  • 這樣就完成了:您現在已經使用 Buildx 從 Kubernetes Pod 建置了一個映像檔。

    進一步閱讀

    有關 Kubernetes 驅動程式的更多資訊,請參閱 buildx 參考