Kubernetes 驅動程式
Kubernetes 驅動程式讓您能夠將本機開發或 CI 環境連接到 Kubernetes 叢集中的建置器,以存取更強大的運算資源,並可選擇支援多種原生架構。
概要
執行以下指令以建立一個名為 kube 的新建置器,它使用 Kubernetes 驅動程式
$ docker buildx create \
--bootstrap \
--name=kube \
--driver=kubernetes \
--driver-opt=[key=value,...]
下表說明了您可以傳遞給 --driver-opt 的可用驅動程式特定選項
| 參數 | 類型 | 預設值 | 描述 |
|---|---|---|---|
image | String | 設定用於執行 BuildKit 的映像檔。 | |
命名空間 | String | 目前 Kubernetes 語境中的命名空間 | 設定 Kubernetes 命名空間。 |
預設載入 | 布林值 | false | 自動將映像檔載入到 Docker Engine 映像檔儲存庫。 |
副本 | 整數 | 1 | 設定要建立的 Pod 副本數量。請參閱擴展 BuildKit |
requests.cpu | CPU 單位 | 設定以 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.cpu | CPU 單位 | 設定以 Kubernetes CPU 單位指定的限制 CPU 值。例如 requests.cpu=100m 或 requests.cpu=2 | |
limits.memory | 記憶體大小 | 設定以位元組或有效後綴指定的限制記憶體值。例如 requests.memory=500Mi 或 requests.memory=4G | |
limits.ephemeral-storage | 儲存空間大小 | 設定以位元組或有效後綴指定的限制暫存儲存空間值。例如 requests.ephemeral-storage=100M | |
buildkit-root-volume-memory | 記憶體大小 | 使用一般檔案系統 | 將 /var/lib/buildkit 掛載到一個以 emptyDir 記憶體支援的磁碟區上,並將 SizeLimit 作為值。例如,buildkit-root-folder-memory=6G |
nodeselector | CSV 字串 | 設定 Pod 的 nodeSelector 標籤。請參閱節點指派。 | |
annotations | CSV 字串 | 設定部署和 Pod 上的額外註釋。 | |
labels | CSV 字串 | 設定部署和 Pod 上的額外標籤。 | |
tolerations | CSV 字串 | 設定 Pod 的污點容忍度。請參閱節點指派。 | |
serviceaccount | String | 設定 Pod 的 serviceAccountName。 | |
schedulername | String | 設定負責排程 Pod 的排程器。 | |
逾時 | 時間 | 120 秒 | 設定逾時限制,該限制決定 Buildx 在建置之前將等待 Pod 佈建多長時間。 |
無根模式 | 布林值 | false | 以非 root 使用者身分執行容器。請參閱無根模式。 |
負載平衡 | String | 黏滯 | 負載平衡策略 (黏滯 或 隨機)。如果設定為 黏滯,則會使用語境路徑的雜湊值來選擇 Pod。 |
qemu.install | 布林值 | false | 安裝 QEMU 模擬以支援多平台。請參閱QEMU。 |
qemu.image | String | 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 Pods
$ docker buildx create \
--bootstrap \
--name=kube \
--driver=kubernetes \
--driver-opt=namespace=buildkit,replicas=4
列出 Pods,您會得到以下結果
$ 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=(黏滯|隨機) 選項來控制當有多個副本時的負載平衡行為。隨機 從節點池中選擇隨機節點,在副本之間提供均勻的工作負載分佈。黏滯(預設值)會嘗試將多次執行的相同建置每次都連接到同一個節點,以確保更好地利用本機快取。
有關可擴展性的更多資訊,請參閱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"
這些選項接受以 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 和 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 建置器建置映像檔
先決條件
建立一個
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 參考資料。