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 |
請求.cpu | CPU 單位 | 設定以 Kubernetes CPU 單位指定的請求 CPU 值。例如 requests.cpu=100m 或 requests.cpu=2 | |
請求.記憶體 | 記憶體大小 | 設定以位元組或帶有效字尾指定的請求記憶體值。例如 requests.memory=500Mi 或 requests.memory=4G | |
請求.臨時儲存 | 儲存大小 | 設定以位元組或帶有效字尾指定的請求臨時儲存值。例如 requests.ephemeral-storage=2Gi | |
限制.cpu | CPU 單位 | 設定以 Kubernetes CPU 單位指定的限制 CPU 值。例如 requests.cpu=100m 或 requests.cpu=2 | |
限制.記憶體 | 記憶體大小 | 設定以位元組或帶有效字尾指定的限制記憶體值。例如 requests.memory=500Mi 或 requests.memory=4G | |
限制.臨時儲存 | 儲存大小 | 設定以位元組或帶有效字尾指定的限制臨時儲存值。例如 requests.ephemeral-storage=100M | |
buildkit-root-volume-memory | 記憶體大小 | 使用常規檔案系統 | 將 /var/lib/buildkit 掛載到 emptyDir 記憶體支援捲上,SizeLimit 作為值。例如,buildkit-root-folder-memory=6G |
節點選擇器 | CSV 字串 | 設定 Pod 的 nodeSelector 標籤。請參閱節點分配。 | |
annotations | CSV 字串 | 在部署和 Pod 上設定額外的註解。 | |
labels | CSV 字串 | 在部署和 Pod 上設定額外的標籤。 | |
容忍度 | CSV 字串 | 配置 Pod 的汙點容忍度。請參閱節點分配。 | |
服務帳戶 | 字串 | 設定 Pod 的 serviceAccountName 。 | |
排程器名稱 | 字串 | 設定負責排程 Pod 的排程器。 | |
超時 | 時間 | 120秒 | 設定超時限制,用於確定 Buildx 在構建前等待 Pod 預置的時間。 |
無根 | 布林值 | false | 以非 root 使用者執行容器。請參閱無根模式。 |
負載均衡 | 字串 | 粘性 | 負載均衡策略(sticky 或 random )。如果設定為 sticky ,則使用上下文路徑的雜湊值選擇 Pod。 |
qemu.install | 布林值 | false | 安裝 QEMU 模擬以支援多平臺。請參閱QEMU。 |
qemu.image | 字串 | tonistiigi/binfmt:latest | 設定 QEMU 模擬映象。請參閱QEMU。 |
擴充套件 BuildKit
Kubernetes 驅動程式的主要優點之一是,您可以根據構建負載的增加來向上或向下擴充套件構建器副本的數量。擴充套件可以透過以下驅動程式選項進行配置
副本數=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 驅動程式允許您使用 nodeSelector
和 tolerations
驅動程式選項來控制 BuildKit Pod 的排程。如果您想使用自定義排程器,還可以設定 schedulername
選項。
您可以使用 annotations
和 labels
驅動程式選項將額外的元資料應用於託管構建器的部署和 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
標誌並指定您想要輸出到的平臺。
例如,構建一個用於 amd64
和 arm64
的 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*
您現在可以透過在構建命令中同時指定這些平臺來構建多架構的 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
的 Pod。
需要 Kubernetes 1.19 或更高版本。建議使用 Ubuntu 作為主機核心。
示例:在 Kubernetes 中建立 Buildx 構建器
本指南向您展示如何
- 為您的 Buildx 資源建立一個名稱空間
- 建立一個 Kubernetes 構建器。
- 列出可用的構建器
- 使用您的 Kubernetes 構建器構建映象
先決條件
- 您有一個現有的 Kubernetes 叢集。如果您還沒有,可以透過安裝 minikube 來學習。
- 如果您需要,可以透過
kubectl
命令訪問您想要連線的叢集,並適當設定KUBECONFIG
環境變數。
建立一個
buildkit
名稱空間。建立一個單獨的名稱空間有助於將您的 Buildx 資源與叢集中的其他資源分開。
$ kubectl create namespace buildkit namespace/buildkit created
使用 Kubernetes 驅動程式建立一個新的構建器
$ docker buildx create \ --bootstrap \ --name=kube \ --driver=kubernetes \ --driver-opt=namespace=buildkit
注意請記住在驅動程式選項中指定名稱空間。
使用
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
使用
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
)中建立必要的資源,同時將您的驅動程式配置保留在本地。在執行 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 參考。