本頁面說明如何準備工作負載,以便在 GKE Standard 叢集的 Arm 節點上排程。如要進一步瞭解如何使用 Autopilot 排定 Arm 工作負載,請參閱「在 Arm 架構上部署 Autopilot 工作負載」。
如要成功將工作負載排程至 Arm 節點,您必須具備下列項目:
- 與 Arm 相容的容器映像檔。如需瞭解如何檢查,請參閱「我的工作負載是否適用於 Arm?」一文。
- Arm 節點,可排定與 Arm 相容的工作負載。如要建立必要資源,請參閱「建立含有 Arm 節點的叢集和節點集區」。
- 叢集位於有可用 Arm 虛擬機器 (VM) 的 Google Cloud 區域或可用區。如需可篩選的機型和平台表格,請參閱「適用區域與可用區」。
總覽
根據預設,GKE 只會將工作負載排程至 x86 型節點 (搭載 Intel 或 AMD 處理器的 Compute Engine 機器系列),方法是在所有 Arm 節點上放置污點 (kubernetes.io/arch=arm64:NoSchedule)。這個污點可防止 x86 相容工作負載不小心排程至 Arm 節點。如要將 x86 相容工作負載排定在 Arm 節點上,而不需對應的容忍,可以選擇移除這項預設污點。詳情請參閱「設定預設 Arm 架構污點」。
如要將工作負載部署至具有預設污點的 Arm 節點,請使用本文所述的欄位,引導排程器將工作負載傳送至要求的節點類型。
請使用下列其中一個欄位:
使用節點選取器或節點親和性規則時,只有在您宣告工作負載的容器映像檔可在節點架構上執行時,GKE 才會排定與 Arm 相容的工作負載。
如果您使用節點選取器或使用節點親和性規則排定與 Arm 相容的工作負載 (如下列各節所述),GKE 會自動在工作負載設定中新增容忍度,讓 Pod 可以在 Arm 節點上執行。
根據預設,新增至工作負載的容忍度會與新增至所有 Arm 節點的污點 (kubernetes.io/arch=arm64:NoSchedule) 相符,以便在 Arm 節點上排定工作負載。
在某些情況下,例如您有多架構映像檔可在任何節點上執行,您可能需要手動將這個容忍度新增至工作負載設定。如需操作說明,請參閱「使用容忍度將多架構工作負載排程至任何架構」。
使用節點選取器排定 Arm 工作負載
在規格中新增下列節點選取器:
nodeSelector:
kubernetes.io/arch: arm64
節點選取器會指定這項工作負載只能排程至具有 arm64 標籤的節點,GKE 叢集上的所有 Arm 節點都具有該標籤。
如果工作負載設定包含這個節點選取器,GKE 會新增容忍度來比對污點,允許在 Arm 節點上排定工作負載。
使用節點親和性規則排定 Arm 工作負載
您也可以使用節點親和性來排定工作負載。
將工作負載排定至單一架構
在規格中新增下列節點親和性:
affinity:
nodeAffinity:
requiredDuringSchedulingIgnoredDuringExecution:
nodeSelectorTerms:
- matchExpressions:
- key: kubernetes.io/arch
operator: In
values:
- arm64
節點親和性規則指定工作負載只能排程至具有 arm64 標籤的節點,GKE 叢集上的所有 Arm 節點都具有該標籤。
如果工作負載設定包含這項節點親和性規則,GKE 會新增容忍度來比對 taint,允許在 Arm 節點上排定工作負載。
將工作負載排定至 x86 和 Arm 架構
如要排定 x86 (Intel 和 AMD 處理器) 和 Arm 架構的工作負載,且 Arm 節點集區使用預設的污點行為,您可以透過不同方式指定。下列操作說明假設 Arm 節點集區使用預設污點。
使用容忍度,將多架構工作負載排定至任何架構
如果您有多架構映像檔,且想排定在 Standard 叢集中的任何可用架構類型上執行,只要在工作負載規格中新增容忍度即可。您不需要使用本頁所述的節點選取器或節點親和性規則,因為工作負載可以排定至所有架構類型。
新增容忍:
tolerations:
- key: kubernetes.io/arch
operator: Equal
value: arm64
effect: NoSchedule
使用這項容忍度後,GKE 就能將工作負載排定至任何架構類型的節點。
舉例來說,假設您有一個叢集,其中包含下列節點集區:
- my-c4a-node-pool,使用 c4a-standard-16 VM (
arm64)。 - my-c2-node-pool,使用 c2-standard-8 VM (
amd64)。 - my-t2d-node-pool,使用 t2-standard-48 VM (
amd64)。
如果您將使用多架構映像檔和工作負載設定中 arm64 容忍度的工作負載部署至這個叢集,GKE 可能會跨所有節點集區排定工作負載。
使用節點相似度規則,將多架構工作負載排程至任何架構
如要將工作負載排定在不同架構類型 (包括 x86 和 Arm) 的節點上,也可以使用節點親和性規則。您可以使用節點親和性規則,指定要將工作負載排定在哪些架構類型上。如要在 Autopilot 叢集上排定工作負載,建議採用這種做法。詳情請參閱「在 Arm 架構上部署 Autopilot 工作負載」。
如果是 x86 工作負載,則不需要這些節點選取器、節點相依性規則或容忍度,即可排定工作負載。如果只想將映像檔排程至 x86 型節點,則不必使用這些欄位。
如要將工作負載排定至任何架構類型,請在節點親和性欄位的 values 部分,同時列出 arm64 和 amd64。amd64 包含使用 x86 處理器的任何節點。
以下範例指定這項工作負載可排定在搭載 Arm 處理器或 x86 處理器的節點上:
affinity:
nodeAffinity:
requiredDuringSchedulingIgnoredDuringExecution:
nodeSelectorTerms:
- matchExpressions:
- key: kubernetes.io/arch
operator: In
values:
- arm64
- amd64
各架構類型的標籤如下:
arm64:適用於使用 Arm 處理器的節點 (例如 C4A)。amd64:適用於使用 AMD 處理器的節點 (例如 Tau T2D) 或使用 Intel 處理器的節點 (例如 C2)。
舉例來說,假設叢集具有下列節點集區和指定的節點親和性規則:
- my-c4a-node-pool,使用 c4a-standard-16 VM (
arm64)。 - my-c2-node-pool,使用 c2-standard-8 VM (
amd64)。 - my-t2d-node-pool,使用 t2-standard-48 VM (
amd64)。
如果您將使用多架構映像檔的工作負載部署至這個叢集,且節點相依性與 values 清單中包含的 arm64 相關,GKE 會在工作負載設定中新增容忍度,並可能在所有節點集區中排定工作負載。
設定預設 Arm 架構 taint
根據預設,GKE 會使用 kubernetes.io/arch=arm64:NoSchedule 污點對所有 Arm 節點加上污點。這個污點可防止僅與 x86 架構相容,但不與 Arm 架構相容的工作負載排定至 Arm 節點。如果工作負載與 x86 和 Arm 相容,您可以停用這個污點,讓 GKE 在 Arm 節點上排定這些工作負載,而不必設定與污點對應的容忍度。
只有在 GKE 叢集的 Standard 節點集區中,且控制層執行 1.35.0-gke.2141000 以上版本,或節點是為自訂 ComputeClass 建立時,才能更新預設行為。詳情請參閱「設定預設 Arm 架構污點」。更新 taint 行為不適用於使用 Autopilot 部署 Arm 工作負載。詳情請參閱「在 Arm 架構上部署 Autopilot 工作負載」。
使用 Standard 節點集區時,您可以在下列情況設定這項行為:
- 建立叢集時,為預設 Standard 節點集區
- 建立或更新 Standard 節點集區時
如果叢集中有任何與 Arm 不相容的工作負載,請勿移除預設污點,因為不相容的工作負載可能會排定至未受污點影響的 Arm 節點。
如要設定 Arm 節點的預設節點污點,請選取下列其中一個選項:
gcloud CLI
如要使用 gcloud CLI 設定 taint 行為,請在執行下列任一作業時,使用 --node-architecture-taint-behavior 旗標:
使用
gcloud container cluster create指令,為預設節點集區建立具有特定 taint 行為的標準叢集:gcloud container cluster create CLUSTER_NAME --location=CONTROL_PLANE_LOCATION \ --node-architecture-taint-behavior=BEHAVIOR使用
gcloud container node-pools create指令建立標準節點集區:gcloud container node-pools create POOL_NAME \ --cluster=CLUSTER_NAME \ --location=CONTROL_PLANE_LOCATION \ --node-architecture-taint-behavior=BEHAVIOR使用
gcloud container node-pools update指令更新 Standard 節點集區:gcloud container node-pools update POOL_NAME \ --cluster=CLUSTER_NAME \ --location=CONTROL_PLANE_LOCATION \ --node-architecture-taint-behavior=BEHAVIOR
請替換下列指令:
CLUSTER_NAME:叢集名稱。CONTROL_PLANE_LOCATION:叢集控制層的 Compute Engine 位置。提供區域叢集的區域,或可用區叢集的可用區。POOL_NAME:節點集區的名稱。BEHAVIOR:下列其中一項設定:none:GKE 會省略kubernetes.io/arch=arm64:NoSchedule的預設污點。arm:明確設定預設行為,為 Arm 節點集區中的所有節點新增kubernetes.io/arch=arm64:NoSchedule污點。
修改 Standard 節點集區的節點架構污點行為時,GKE 會立即更新污點,不必重新建立節點。
Terraform
在 node_config 中新增下列 taint_config 區塊,設定架構汙點行為:
taint_config {
architecture_taint_behavior = "BEHAVIOR"
}
將 BEHAVIOR 替換為下列其中一項設定:
NONE:GKE 會省略kubernetes.io/arch=arm64:NoSchedule的預設污點。ARM:明確設定預設行為,為 Arm 節點集區中的所有節點新增kubernetes.io/arch=arm64:NoSchedule污點。
包含這個區塊的 Standard 節點集區完整 node_config 如下所示:
resource "google_container_node_pool" "primary_preemptible_nodes" {
name = "NODE_POOL_NAME"
location = "NODE_POOL_LOCATION"
cluster = google_container_cluster.primary.name
node_count = 1
node_config {
preemptible = true
machine_type = "ARM_MACHINE_TYPE"
# Google recommends custom service accounts that have cloud-platform scope and permissions granted via IAM Roles.
service_account = google_service_account.default.email
oauth_scopes = [
"https://www.googleapis.com/auth/cloud-platform"
]
taint_config {
architecture_taint_behavior = "BEHAVIOR"
}
}
}
在本例中,NODE_POOL_NAME 代表節點集區的名稱,NODE_POOL_LOCATION 則代表叢集控制層的位置。
部署工作負載
指定 Arm 相容工作負載的排程位置後,即可部署工作負載。
將工作負載部署至 GKE 叢集時,各種架構類型的操作說明都相同。只要完成必要步驟,就能像部署其他工作負載一樣,部署與 Arm 相容的工作負載。如要查看部署工作負載的範例,請參閱下列頁面:
疑難排解
如需常見錯誤和疑難排解資訊,請參閱「排解 Arm 工作負載問題」。