準備在標準叢集中部署 Arm 工作負載

本頁面說明如何準備工作負載,以便在 GKE Standard 叢集的 Arm 節點上排程。如要進一步瞭解如何使用 Autopilot 排定 Arm 工作負載,請參閱「在 Arm 架構上部署 Autopilot 工作負載」。

如要順利將工作負載排定至 Arm 節點,您必須具備下列條件:

總覽

根據預設,GKE 只會將工作負載排給 x86 型節點 (搭載 IntelAMD 處理器的 Compute Engine 機器系列),方法是在所有 Arm 節點上放置汙點 (kubernetes.io/arch=arm64:NoSchedule)。這個污點可避免將 x86 相容的工作負載,無意中排定至 Arm 節點。如果您希望 x86 相容的工作負載排給 Arm 節點,且不需要對應的容許條件,可以選擇移除這個預設汙點。詳情請參閱「設定預設 Arm 架構汙染」。

如要將工作負載部署至具有預設汙點的 Arm 節點,請使用本文所述的欄位,引導排程器將工作負載傳送至所要求的節點類型。

請使用下列其中一個欄位:

使用節點選取器或節點親和性規則時,您必須先宣告工作負載的容器映像檔可在節點架構上執行,GKE 才會排定與 Arm 相容的工作負載。

如果您使用節點選取器節點相依性規則排程與 Arm 相容的工作負載 (如以下各節所述),GKE 會自動在工作負載設定中新增容許條件,讓 Pod 可以在 Arm 節點上執行。

新增至工作負載的這項容許條件,會與預設新增至所有 Arm 節點的 taint (kubernetes.io/arch=arm64:NoSchedule) 相符,讓工作負載可排程至 Arm 節點。

某些情況下,例如當您有多重架構映像檔可在任何節點上執行時,您可能需要手動將這項容許條件新增至工作負載設定。如需相關操作說明,請參閱「使用容許條件,將多架構工作負載排程至任何架構」。

使用節點選取器排定 Arm 工作負載

在規格中新增下列節點選取器:

nodeSelector:
    kubernetes.io/arch: arm64

節點選取器會指定這項工作負載只能排程至具有 arm64 標籤的節點,而 GKE 叢集上的所有 Arm 節點都有這個標籤。

在工作負載設定中加入這個節點選取器後,GKE 會新增容許條件來比對 taint,允許工作負載排定在 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 節點集區使用預設汙點。

使用容許度,將多架構工作負載排程至任何架構

如果您有多架構映像檔,且想在標準叢集中排定任何可用架構類型,只需要將容許度新增至工作負載規格。由於工作負載可排程至所有架構類型,因此您不需要本頁所述的節點選取器或節點親和性規則。

新增容許條件:

  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 區段中,列出 arm64amd64amd64 包含使用 x86 處理器的任何節點。

以下範例指定這項工作負載可排程在搭載 Arm 處理器或 x86 處理器的節點上:

  affinity:
    nodeAffinity:
      requiredDuringSchedulingIgnoredDuringExecution:
        nodeSelectorTerms:
        - matchExpressions:
          - key: kubernetes.io/arch
            operator: In
            values:
            - arm64
            - amd64

各架構類型的標籤如下:

舉例來說,假設您有一個叢集,其中包含下列節點集區和指定的節點親和性規則:

  • 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 清單中,GKE 會在工作負載設定中新增容許條件,並可能在所有節點集區中排定工作負載。arm64

設定預設的 Arm 架構汙點

根據預設,GKE 會使用 kubernetes.io/arch=arm64:NoSchedule 汙點,汙染所有 Arm 節點。這項汙點可防止僅與 x86 架構相容,但不與 Arm 架構相容的工作負載排程至 Arm 節點。如果工作負載同時與 x86 和 Arm 相容,您可以停用這項 taint,讓 GKE 將這些工作負載排給 Arm 節點,而不需對應 taint 的容許條件。

只有在控制層執行 1.35.0-gke.2141000 以上版本的 GKE 叢集,或為自訂 ComputeClass 建立節點時,才能更新 Standard 節點集區的預設行為。詳情請參閱「設定預設 Arm 架構的汙染」。更新汙點行為不適用於使用 Autopilot 部署 Arm 工作負載。詳情請參閱「在 Arm 架構上部署 Autopilot 工作負載」。

在下列情況中,您可以透過標準節點集區設定這項行為:

  • 建立叢集時,針對預設的 Standard 節點集區
  • 建立或更新標準節點集區時

如果叢集中有任何與 Arm 不相容的工作負載,請勿移除預設的汙點,因為不相容的工作負載可能會排定至未汙染的 Arm 節點。

如要設定 Arm 節點的預設節點汙點,請選取下列其中一個選項:

gcloud CLI

如要使用 gcloud CLI 設定汙點行為,請在執行下列任一作業時使用 --node-architecture-taint-behavior 旗標:

  • 使用 gcloud container cluster create 指令,為預設節點集區建立具有特定汙點行為的 Standard 叢集:

    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 指令更新標準節點集區:

    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 汙點。

修改標準節點集區的節點架構 taint 行為時,GKE 會立即更新 taint,不必重新建立節點。

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 工作負載問題」。

後續步驟