關於 GKE 叢集自動調度資源


本頁面說明 Google Kubernetes Engine (GKE) 如何依據工作負載需求,自動調整 Standard 叢集的節點集區大小。當需求過高時,叢集自動配置器會在節點集區中新增節點。如要瞭解如何設定叢集自動調度器,請參閱自動調度叢集的資源

這個頁面適用於管理員、架構師和營運人員,可協助他們規劃容量和基礎架構需求,並最佳化系統架構和資源,為公司或業務部門爭取最低的總持有成本。如要進一步瞭解我們在 Google Cloud 內容中提及的常見角色和範例工作,請參閱「常見的 GKE Enterprise 使用者角色和工作」。

使用 Autopilot 叢集時,您不必擔心佈建節點或管理節點集區,因為系統會透過節點自動佈建自動佈建節點集區,並自動調整節點集區大小,以符合工作負載需求。

閱讀本頁面之前,請先熟悉基本的 Kubernetes 概念,以及資源要求和限制的運作方式。

最佳做法

與貴機構的管理員、架構師、開發人員,或負責實作及維護應用程式的其他團隊合作,規劃及設計叢集設定。

使用叢集自動配置器的原因

GKE 的叢集自動配置器會依據工作負載需求,自動調整指定節點集區中的節點數量。當需求較低時,叢集自動配置器會縮減叢集資源,降至您指定的最小大小。這有助於在需要時提高工作負載的可用性,同時控制成本。您不需要手動新增或移除節點,也不必超額佈建節點集區。您只需要指定節點集區的大小上下限,其餘部分會由系統自動處理。

在自動調度叢集資源的過程中,當系統刪除或移動資源時,您的工作負載可能會暫時中斷。舉例來說,假設您的工作負載包含一個具有單一備用資源的控制器,當系統刪除目前的節點時,便可能在不同的節點上重新排定該備用資源的 Pod。啟用叢集自動調度器之前,請先設計工作負載,確保能容忍可能發生的中斷情況,或確保重要 Pod 不會中斷。

最佳做法

如要提高工作負載的中斷容忍度,請使用具有多個副本的控制器 (例如 Deployment) 部署工作負載。

您可以透過映像檔串流功能提升叢集自動調度資源效能,這項功能會從符合資格的容器映像檔遠端串流處理必要的映像檔資料,同時在本地快取映像檔,讓新節點上的工作負載能更快啟動。

叢集自動配置器的運作方式

叢集自動配置器會依節點集區運作。使用叢集自動調度器設定節點集區時,請指定節點集區的最小和最大大小。

叢集自動調度器會透過在節點集區的基礎 Compute Engine 代管執行個體群組 (MIG) 中新增或移除虛擬機器 (VM) 執行個體,自動增加或減少節點集區的大小。叢集自動調度器會根據在該節點集區節點上執行的 Pod 資源要求 (而非實際資源使用率),做出這些調度決策。這項服務會定期檢查 Pod 和節點的狀態,並採取行動:

  • 如果 Pod 無法排程至任何目前的節點,叢集自動調整器會新增節點,最多可達節點集區的大小上限。如要進一步瞭解叢集自動配置器何時會變更叢集大小,請參閱「叢集自動配置器何時會變更叢集大小?」一文。
  • 如果 GKE 決定在節點集區中新增節點,叢集自動調度器會視需要新增節點,但不得超過每個節點集區或每個叢集的限制。
  • 叢集自動配置器不會等待一個節點啟動,才建立下一個節點。GKE 決定要建立的節點數量後,就會平行建立節點。目標是盡量縮短無法排程的 Pod 成為 Active 的時間。
  • 如果配額用盡而導致部分節點無法建立,叢集自動調整器會等待,直到資源可順利排程為止。
  • 如果節點使用率過低,且即使節點集區中的節點數量較少,所有 Pod 仍可排程,叢集自動調度器就會移除節點,直到節點集區達到最小大小為止。如果節點上的 Pod 無法移至叢集中的其他節點,叢集自動配置器就不會嘗試縮減該節點。如果 Pod 可以移至其他節點,但節點在逾時時間 (目前為 10 分鐘) 後無法正常排除,則強制終止節點。寬限期不適用於 GKE 叢集。如要進一步瞭解縮減作業的運作方式,請參閱叢集自動配置器說明文件

叢集自動配置器檢查叢集內無法排程的 Pod 頻率,主要取決於叢集大小。在小型叢集中,檢查作業可能會每隔幾秒執行一次。無法確切指出檢查所需的時間範圍。

如果 Pod 要求或預設的資源不足,導致節點資源不足,叢集自動配置器將不會更正此情況。您可以為所有工作負載做出明確的資源要求,協助確保叢集自動配置器盡可能準確地運作。

請勿為叢集節點啟用 Compute Engine 的代管執行個體群組自動調度資源功能。GKE 的叢集自動配置器與 Compute Engine 自動調度資源功能不同。這可能會導致節點集區無法向上或向下擴充,因為 Compute Engine 自動調度器會與 GKE 的叢集自動調度器發生衝突。

作業條件

調整節點集區大小時,叢集自動調整器會做出下列假設:

  • 所有備用的 Pod 可在其他節點上重新啟動,並可能讓服務短暫中斷。
  • 使用者或管理員不手動管理節點。叢集自動調度器可能會覆寫您所執行的任何手動節點管理作業。
  • 單一節點集區中的所有節點具有一組相同的標籤。
  • 叢集自動調度資源功能會考量執行個體類型在不同集區中的相對成本,試著擴充成本最低的節點集區。不過,叢集自動調度器在執行這項操作時,會受到下列條件限制:
    • 叢集自動調整器會考量含有 Spot VM (先占 VM) 的節點集區所減少的費用。不過,叢集自動配置器也會考量每個可用區的資源可用性,因此可能會選擇較昂貴但可用的資源。
    • 如果多個節點集區使用 Spot VM,叢集自動調整功能不會自動選取最低成本的選項。為盡量使用高成本效益的 Spot VM,並避免發生這種情況,建議您使用自訂運算類別
  • 叢集自動調度器會在排定 Pod 前,考量 init 容器要求。初始容器要求可以使用節點上任何未分配的資源,這可能會導致 Pod 無法排程。叢集自動配置器會遵循 Kubernetes 使用的相同要求計算規則。詳情請參閱使用 Init 容器的 Kubernetes 說明文件
  • 系統不會追蹤一開始建立叢集或節點集區之後手動新增的標籤。由叢集自動配置器建立的節點會被指派在建立節點集區時以 --node-labels 指定的標籤。
  • 在 GKE 1.21 版或更早版本中,叢集自動配置器會考量節點集區中現有節點的 taint 資訊,以代表整個節點集區。從 GKE 1.22 版開始,叢集自動配置器會結合叢集和節點集區中現有節點的資訊。叢集自動配置器也會偵測您對節點和節點集區所做的手動變更。
最佳做法

如果應用程式無法容忍中斷,請勿啟用叢集自動調度資源功能。

跨區域平衡

如果節點集區包含具有相同執行個體類型的多個代管執行個體群組,則叢集自動調度器將會「在資源調度時」嘗試保持這些代管執行個體群組大小的平衡。這有助於防止節點集區中多區域代管執行個體群組中不均勻的節點分佈。GKE 在縮減資源時不會考量自動調度資源政策。

叢集自動調度資源功能僅在擴充事件期間跨區域進行平衡。叢集自動調度資源功能會縮減未充分利用的節點,而不管節點集區中基礎代管執行個體群組的相對大小,這可能導致不平均的跨區域節點分佈。

位置政策

從 GKE 1.24.1-gke.800 版開始,您可以變更叢集自動調整程式的位置政策。您可以指定 location_policy 標記,並使用下列任一值,控管叢集自動調度器分配政策:

  • BALANCED:叢集自動調度資源會考量 Pod 需求和每個可用區的資源可用性。這不保證類似的節點群組大小完全相同,因為叢集自動配置器會考量許多因素,包括特定區域的可用容量,以及觸發向上擴充的 Pod 的區域親和性。
  • ANY:叢集自動配置器會優先使用未使用的預留項目,並考量目前的可用資源限制。
最佳做法

如果您使用 Spot VM,或想使用各可用區不相等的 VM 預留資源,請使用 ANY 政策。

保留項目

從 GKE 1.27 版開始,叢集自動調度器在決定擴充資源時,一律會考量預留項目。選擇要擴充的節點集區時,系統會優先選擇有相符未使用預留項目的節點集區,即使該節點集區並非最有效率的節點集區也一樣。此外,在平衡多區域擴充作業時,系統一律會優先使用未使用的預留項目。

不過,叢集自動調度器只會檢查自身專案中的預留項目。因此,如果叢集自有專案中提供較便宜的節點選項,自動調度器可能會選取該選項,而非共用預留項目。如要在專案之間共用預留項目,請考慮使用自訂運算類別,設定叢集自動調度器用於調度節點的優先順序,包括共用預留項目。

預設值

如果是先占 VM 節點集區,預設的叢集自動調度資源分配政策為 ANY。這項政策可降低 Spot VM 遭到搶占的風險。

對於不可搶占的節點集區,預設的叢集自動調度資源分配政策為 BALANCED

節點集區大小的上限與下限

建立新節點集區時,您可以為叢集中的每個節點集區指定大小上限和下限,叢集自動調度器便會在這些界線內進行重新調整資源的決策。如要更新最小值,請在指定新最小值後,手動將叢集大小調整至新限制內。叢集自動配置器會根據新限制做出重新調度決策。

目前的節點集區大小 叢集自動配置器動作 資源調度限制
低於您指定的下限 叢集自動調度器會擴充資源,佈建擱置中的 Pod。縮減功能已停用。 節點集區不會縮減至您指定的值以下。
介於您指定的最小和最大尺寸之間 叢集自動調整程式會根據需求擴充或縮減資源。 節點集區會維持在您指定的大小限制內。
大於您指定的上限 叢集自動配置器只會縮減可安全移除的節點。已停用擴充功能。 節點集區不會擴充超過您指定的值。

在 Standard 叢集上,叢集自動配置器絕不會自動將叢集縮減至零個節點。叢集中必須隨時有一或多個節點可用來執行系統 Pod。此外,如果節點數量因手動移除節點而為零,叢集自動配置器和節點自動佈建功能可以從零節點叢集向上擴充。

如要進一步瞭解自動配置器的決策,請參閱叢集自動配置器限制

自動調度資源限制

您可以設定叢集自動配置器在調度節點集區時使用的節點數量下限和上限。使用 --min-nodes--max-nodes 旗標,設定每個可用區的節點數量下限和上限

從 GKE 1.24 版開始,您可以使用 --total-min-nodes--total-max-nodes 標記建立新叢集。這些標記會設定所有區域中節點集區的節點總數下限和上限。

節點數量下限和上限範例

下列指令會建立自動調度資源的多區域叢集,其中包含三個區域共六個節點,每個區域至少要有一個節點,最多可有四個節點:

gcloud container clusters create example-cluster \
    --num-nodes=2 \
    --location=us-central1-a \
    --node-locations=us-central1-a,us-central1-b,us-central1-f \
    --enable-autoscaling --min-nodes=1 --max-nodes=4

在本例中,叢集的總大小可以是分散在三個區域的 3 到 12 個節點。如果其中一個區域故障,叢集的總大小會變成 2 到 8 個節點。

節點總數範例

下列指令適用於 GKE 1.24 以上版本,可建立自動調度資源的多區域叢集,其中包含三個區域共六個節點,所有區域的節點集區至少要有三個節點,最多可有十二個節點:

gcloud container clusters create example-cluster \
    --num-nodes=2 \
    --location=us-central1-a \
    --node-locations=us-central1-a,us-central1-b,us-central1-f \
    --enable-autoscaling --total-min-nodes=3 --total-max-nodes=12

在這個範例中,無論節點分散在哪些區域,叢集的總大小都介於 3 到 12 個節點之間。

自動調度資源設定檔

綜合評估使用率的最佳化成效與資源可用性,藉此判斷移除節點的時間點。移除使用率偏低的節點可提高叢集使用率,但新的工作負載可能需要等到資源重新佈建後才能開始處理。

進行決策時,您可以指定要使用的自動調度資源設定檔。可用的設定檔如下:

  • balanced:預設設定檔,優先確保有更多資源可供傳入的 Pod 使用,因此可縮短標準叢集啟動 Pod 的時間。balanced 設定檔不適用於 Autopilot 叢集。
  • optimize-utilization:比起在叢集中保留備用資源,優先考量最佳化使用率。啟用這個設定檔後,叢集自動配置器會更積極縮減叢集資源,GKE 可以移除更多節點,移除速度也會加快。GKE 會優先在已大量分配 CPU、記憶體或 GPU 的節點中排程 Pod。不過,其他因素會影響排程,例如屬於相同 Deployment、StatefulSet 或 Service 的 Pod 在節點間的分布。

optimize-utilization 自動調度資源設定檔可協助叢集自動調度器識別並移除使用率偏低的節點。為實現這項最佳化,GKE 會將 Pod 規格中的排程器名稱設為 gke.io/optimize-utilization-scheduler。指定自訂排程器的 Pod 不會受到影響。

下列指令會在現有叢集中啟用 optimize-utilization 自動調度資源設定檔:

gcloud container clusters update CLUSTER_NAME \
    --autoscaling-profile optimize-utilization

考慮 Pod 的排程與服務中斷

叢集自動配置器在縮減資源時,會遵循 Pod 上的排程和移除規則。這些限制可能會讓自動配置器無法刪除節點。如果節點包含的 Pod 具有下述任一情況,將無法刪除節點:

  • Pod 的相依性或反相依性規則會阻止重新排程。
  • Pod 並非由控制器 (如 Deployment、StatefulSet、Job 或 ReplicaSet) 所管理。
  • Pod 有本機儲存空間,且 GKE 控制層版本低於 1.22。在控制層版本為 1.22 以上的 GKE 叢集中,具有本機儲存空間的 Pod 不會再阻礙縮減作業。
  • Pod 具有 "cluster-autoscaler.kubernetes.io/safe-to-evict": "false" 註解。
  • 刪除節點會超過設定的 PodDisruptionBudget

如要進一步瞭解叢集自動配置器並防範中斷,請參閱叢集自動配置器常見問題中的下列問題:

在 GKE 中自動調度 TPU

GKE 支援 Tensor Processing Unit (TPU),可加快機器學習工作負載的速度。單一主機 TPU 配量節點集區多主機 TPU 配量節點集區都支援自動調度資源和自動佈建。

在 GKE 叢集上使用 --enable-autoprovisioning 標記時,GKE 會建立或刪除單一主機或多主機 TPU 配量節點集區,並使用符合待處理工作負載需求的 TPU 版本和拓撲。

使用 --enable-autoscaling 時,GKE 會根據節點集區類型調整節點集區大小,如下所示:

  • 單一主機 TPU 配量節點集區:GKE 會在現有節點集區中新增或移除 TPU 節點。節點集區可包含任意數量的 TPU 節點,介於零和節點集區大小上限之間,而節點集區大小上限是由 --max-nodes--total-max-nodes 旗標決定。節點集區擴充時,節點集區中的所有 TPU 節點都會具有相同的機器類型和拓撲。如要進一步瞭解如何建立單一主機 TPU 節點集區,請參閱「建立節點集區」。

  • 多主機 TPU 配量節點集區:GKE 會將節點集區從零原子擴展至滿足 TPU 拓撲所需的節點數量。舉例來說,如果 TPU 節點集區的機器類型為 ct5lp-hightpu-4t,拓撲為 16x16,則節點集區會包含 64 個節點。GKE 自動調度器會確保這個節點集區的節點數為 0 或 64。縮減時,GKE 會排除所有排定的 Pod,並將整個節點集區排除至零。如要進一步瞭解如何建立多主機 TPU 節點集區,請參閱「建立節點集區」。

Spot VM 和叢集自動調度器

由於叢集自動配置器偏好擴充成本最低的節點集區,因此在工作負載和資源可用性允許的情況下,叢集自動配置器會在擴充時新增 Spot VM。

不過,即使叢集自動配置器偏好新增 Spot VM,這項偏好設定也無法保證大多數 Pod 都會在這類 VM 上執行。Spot VM 可能會遭到先占。因此,Spot VM 上的 Pod 較有可能遭到搶占。遭驅逐時,他們只有 15 秒的時間終止

舉例來說,假設您有 10 個 Pod,以及混合使用的隨選和 Spot VM:

  • 您一開始是在隨選 VM 上執行 10 個 Pod,因為 Spot VM 無法使用。
  • 您不需要全部 10 個 Pod,因此叢集自動調度器會移除兩個 Pod,並關閉額外的隨選 VM。
  • 當您再次需要 10 個 Pod 時,叢集自動配置器會新增 Spot VM (因為比較便宜),並在這些 VM 上排定兩個 Pod。其他八個 Pod 仍會保留在隨選 VM 上。
  • 如果叢集自動調度器需要再次縮減資源,Spot VM 可能會優先遭到先占,讓大多數 Pod 在隨選 VM 上執行。

如要優先使用 Spot VM,並避免上述情況,建議您使用自訂運算類別。自訂運算類別可讓您建立優先順序規則,在擴充期間優先使用 Spot VM,優先順序高於隨選節點。如要進一步提高 Pod 在 Spot VM 支援節點上執行的可能性,請設定主動遷移

以下範例說明如何使用自訂運算類別,優先使用 Spot VM:

apiVersion: cloud.google.com/v1
kind: ComputeClass
metadata:
  name: prefer-l4-spot
spec:
  priorities:
  - machineType: g2-standard-24
    spot: true
    gpu:
      type: nvidia-l4
      count: 2
  - machineType: g2-standard-24
    spot: false
    gpu:
      type: nvidia-l4
      count: 2
  nodePoolAutoCreation:
    enabled: true
  activeMigration:
    optimizeRulePriority: true

在上述範例中,優先順序規則會聲明偏好使用 g2-standard-24 機器類型和 Spot VM 建立節點。如果 Spot VM 無法使用,GKE 會改用隨選 VM。這個運算級別也會啟用 activeMigration,讓叢集自動調度器在容量可用時,將工作負載遷移至 Spot VM。

如果無法使用自訂運算類別,請新增節點親和性、汙染或容忍度。舉例來說,下列節點親和性規則會聲明偏好在以 Spot VM 為基礎的節點上排程 Pod (GKE 會自動將 cloud.google.com/gke-spot=true 標籤新增至這類節點):

affinity:
  nodeAffinity:
    preferredDuringSchedulingIgnoredDuringExecution:
    - weight: 1
    preference:
      matchExpressions:
      - key: cloud.google.com/gke-spot
        operator: Equal
        values:
        - true

如要進一步瞭解如何使用節點親和性、Taint 和容許條件排程 Spot VM,請參閱「Running a GKE application on spot nodes with on-demand nodes as fallback」網誌。

ProvisioningRequest CRD

ProvisioningRequest 是命名空間的自訂資源,可讓使用者向叢集自動調度器要求一組 Pod 的容量。對於具有互連 Pod 的應用程式來說,這項功能特別實用,因為這些 Pod 必須排定為單一單元。

支援的佈建類別

系統支援三種 ProvisioningClass:

  • queued-provisioning.gke.io:這個 GKE 專屬類別會與動態工作負載排程器整合,讓您將要求加入佇列,並在資源可用時完成要求。非常適合批次工作或可容許延遲的工作負載。請參閱「使用動態工作負載排程器部署 GPU,以執行批次和 AI 工作負載」,瞭解如何在 GKE 中使用佇列佈建。 Standard 叢集須搭載 GKE 1.28.3-gke.1098000 以上版本,Autopilot 叢集則須搭載 GKE 1.30.3-gke.1451000 以上版本。

  • check-capacity.autoscaling.x-k8s.io:這個開放原始碼類別會先驗證資源可用性,再嘗試排定 Pod。支援 GKE 1.30.2-gke.1468000 以上版本。

  • best-effort-atomic.autoscaling.x-k8s.io:這個開放原始碼類別會嘗試一併為要求中的所有 Pod 佈建資源。如果無法為所有 Pod 佈建足夠的資源,系統就不會佈建任何資源,且整個要求都會失敗。 支援 GKE 1.31.27 以上版本。

如要進一步瞭解 CheckCapacity 和 BestEffortAtomicScaleUp 類別,請參閱開放原始碼說明文件

使用 ProvisioningRequest 的限制

  • GKE 叢集自動配置器在每個 ProvisioningRequest 中僅支援 1 個 PodTemplate。
  • GKE 叢集自動配置器一次只能擴充 1 個節點集區。如果 ProvisioningRequest 需要多個節點集區的資源,您必須為每個節點集區建立個別的 ProvisioningRequest。

使用 ProvisioningRequest 的最佳做法

  • 請使用 total-max-nodes:,不要限制節點數量上限 (--max nodes),而是使用 --total-max-nodes 限制應用程式耗用的總資源。
  • 使用 location-policy=ANY:這項設定可讓 Pod 排程在任何可用位置,加快佈建速度並提升資源使用率。
  • (選用) 與 Kueue 整合:Kueue 可自動建立 ProvisioningRequest,簡化工作流程。詳情請參閱 Kueue 說明文件

輪詢間隔

如果節點建立錯誤 (例如配額不足或 IP 位址用盡),擴充作業可能會失敗。發生這些錯誤時,基礎代管執行個體群組 (MIG) 會在初始五分鐘的延遲後重試作業。如果錯誤持續發生,這個退避時間會以指數方式增加,最長為 30 分鐘。在這段期間,叢集自動調度器仍可擴充叢集中未發生錯誤的其他節點集區。

其他資訊

如要進一步瞭解叢集自動配置器,請參閱開放原始碼 Kubernetes 專案的自動調度資源常見問題

限制

叢集自動配置器有以下限制:

  • 叢集自動調度器不支援本機 PersistentVolume
  • 在 GKE 控制平面版本低於 1.24.5-gke.600 的情況下,當 Pod 要求臨時儲存空間時,叢集自動調整程式不支援擴充節點數為零的節點集區,該節點集區會使用本機 SSD 做為臨時儲存空間
  • 叢集大小限制:最多 15,000 個節點。 執行這類大小的叢集時,請考量其他叢集限制和我們的最佳做法
  • 縮減資源時,叢集自動配置器支援一個 10 分鐘的終止 Pod 的寬限期,在節點強制中斷前,將節點的 Pod 重新安排到其他節點上。
  • 有時,叢集自動配置器會無法完全縮減,且在縮減後會存在額外的節點。當所需的系統 Pod 被安排到不同節點時會發生這種情況,因為沒有任何觸發條件可以將任何這些 Pod 移動到不同的節點。請參閱我有幾個利用率低的節點,但它們並沒有縮減,為什麼會這樣?如要解決這項限制,您可以設定 Pod 中斷預算設定
  • 不支援使用變更後的篩選條件自訂時間安排。
  • 叢集自動配置器在決定為待處理的 Pod 佈建新節點時,會考量預設的 kube-scheduler 行為。系統不支援使用自訂排程器,這可能會導致非預期的調整行為。
  • 如果 Pod 的 PriorityClass 值低於 -10,節點就不會擴充。詳情請參閱「叢集自動配置器如何搭配 Pod 優先順序和搶占功能運作?」。
  • 叢集自動配置器可能沒有足夠的未分配 IP 位址空間,無法新增節點或 Pod,導致擴充失敗,這類失敗會以 eventResult 事件表示,原因為 scale.up.error.ip.space.exhausted。您可以擴充主要子網路,為節點新增更多 IP 位址,也可以使用不連續的多 Pod CIDR,為 Pod 新增 IP 位址。詳情請參閱「沒有足夠的 IP 空間可供 Pod 使用」。
  • GKE 叢集自動配置器與開放原始碼 Kubernetes 專案的叢集自動配置器不同。GKE 叢集自動調度資源功能的參數取決於叢集設定,且可能會變更。如要進一步控管自動調度行為,請停用 GKE 叢集自動配置器,並執行開放原始碼 Kubernetes 的叢集自動配置器。不過,開放原始碼 Kubernetes 不支援 Google Cloud 。
  • 刪除啟用自動調度的 GKE 節點集區時,節點會設定 NoSchedule 旗標,這些節點上的所有 Pod 會立即遭到撤銷。為減緩可用資源突然減少的情況,節點集區的自動調度器可能會在同一個節點集區中佈建新節點。這些新建立的節點可用於排程,遭撤銷的 Pod 則會重新排定至這些節點。最終,系統會刪除整個節點集區 (包括新佈建的節點和 Pod),這可能會導致服務中斷。 為避免自動配置器在刪除期間佈建新節點,請先停用節點集區的自動調度資源功能,再啟動刪除作業。

已知問題

  • 在 1.22 之前的 GKE 控制層版本中,GKE 叢集自動配置器會停止擴充空叢集 (零節點) 的所有節點集區。GKE 1.22 以上版本不會發生這種情況。

疑難排解

如需疑難排解建議,請參閱下列頁面:

後續步驟