水平自動調度 Pod 資源

本頁面將簡要介紹水平自動調度 Pod 資源功能,並說明這項功能在 Google Kubernetes Engine (GKE) 中的運作方式。您也可以參閱這篇文章,瞭解如何設定及使用叢集的水平自動調度 Pod 資源功能。

水平 Pod 自動配置器會根據工作負載的 CPU 或記憶體用量,或根據 Kubernetes 內部回報的自訂指標,或根據叢集外部來源的外部指標,自動增減 Pod 數量,調整 Kubernetes 工作負載的規模。

水平自動調度 Pod 資源不會變更 GKE 叢集中的節點數量。如要根據 Pod 數量變化自動調整叢集中的節點數量,可以使用叢集自動配置器。

首次將工作負載部署至 Kubernetes 叢集時,您可能不確定其資源需求。這些需求也可能會隨時間變動,視使用模式、外部依附元件或其他因素而定。水平 Pod 自動調度資源功能可確保工作負載在不同情況下都能穩定運作,並讓您只在需要時支付額外容量的費用,進而控管成本。

要預測工作負載資源不足或未充分利用的指標並不容易。水平 Pod 自動配置器可根據下列一或多個類型的指標,自動調整工作負載中的 Pod 數量:

  • 實際資源用量:當特定 Pod 的 CPU 或記憶體用量超過門檻時,這可以表示為原始值,或 Pod 對該資源的要求量的百分比。

  • 自訂指標:根據叢集中 Kubernetes 物件回報的任何指標,例如每秒的用戶端要求率或每秒的 I/O 寫入次數。

    如果應用程式容易發生網路瓶頸,而非 CPU 或記憶體瓶頸,這項功能就非常實用。

  • 外部指標:以叢集外部應用程式或服務的指標為準。

    舉例來說,從 Pub/Sub 等管道擷取大量要求時,工作負載可能需要更多 CPU。您可以建立佇列大小的外部指標,並設定水平 Pod 自動調度器,在佇列大小達到指定門檻時自動增加 Pod 數量,在佇列大小縮減時減少 Pod 數量。

您可以結合水平 Pod 自動配置器和垂直 Pod 自動配置器,但有一些限制。

水平自動調度 Pod 資源的運作方式

每個設定的水平 Pod 自動調度器都會使用控制迴路運作。每個工作負載都有專屬的水平 Pod 自動配置器。每個水平 Pod 自動調度器都會定期檢查指定工作負載的指標是否達到您設定的目標門檻,並自動變更工作負載的形狀。

每個 Pod 的資源

如果是依 Pod 分配的資源 (例如 CPU),控制器會查詢 Pod 中執行的每個容器的資源指標 API。

  • 如果您指定 CPU 或記憶體的原始值,系統會使用該值。
  • 如果您為 CPU 或記憶體指定百分比值,水平 Pod 自動調度器會計算平均使用率值,做為該 Pod CPU 或記憶體要求的百分比。
  • 自訂和外部指標會以原始值或平均值表示。

控制器會使用回報指標的平均值或原始值產生比率,並使用該比率自動調度工作負載資源。如要瞭解水平 Pod 自動調度演算法的說明,請參閱 Kubernetes 專案說明文件。

回應多項指標

如果您將工作負載設為依據多項指標自動調度資源,水平 Pod 自動配置器會分別評估各項指標,並使用調度演算法,根據每項指標決定新的工作負載規模。系統會為自動調度動作選取最大規模。

如果因某種原因導致一或多個指標無法使用,水平 Pod 自動配置器仍會根據計算出的最大大小向上擴充,但不會縮減。

防止輾轉現象

Thrashing 是指工作負載尚未完成對先前自動調度資源動作的回應,水平 Pod 自動配置器就嘗試執行後續自動調度資源動作的情況。為避免輾轉現象,水平 Pod 自動配置器會從指定的穩定期中,選擇最大的建議。這項行為是由 HPA behavior 規格中的 scaleDown.stabilizationWindowSeconds 欄位控制,在 GKE 中預設為 300 秒 (五分鐘)。

為避免微幅波動造成不必要的調度事件,水平 Pod 自動調度器會使用 10% 的容許值。如果目前指標值與目標指標值的比例在 1.0 的 10% 範圍內,系統就不會針對指定目標採取任何縮放動作。

從零開始調度資源,以及調度至零

在 GKE 1.37 版或更新版本中,您可以設定水平 Pod 自動調度器,在沒有需求時將工作負載縮減至 0 個副本,並在需求恢復時自動調度工作負載。縮減至零和從零擴充包含下列行為:

  • 容許值略過:當工作負載達到 0 個副本時,GKE 會略過標準指標容許值檢查 (比率為 0.9 至 1.1)。只要指標值大於零 (例如佇列中有一則訊息),就會立即觸發擴充作業,至少增加 1 個副本,不會等待超過容許值門檻。
  • 穩定期:擴充預設為 0 秒 (scaleUp.stabilizationWindowSeconds: 0),可立即啟用;縮減預設為 300 秒 (scaleDown.stabilizationWindowSeconds: 300),有助於確保在縮減至 0 個副本前,需求量連續五分鐘為零。
  • 狀態條件:當 HPA 將副本數量擴展至 0 時,控制器會回報 ScaledToZero: True 條件,同時保持有效 (ScalingActive: True)。如果工作負載在 HPA 外部手動擴展至 0 個副本 (例如使用 kubectl scale 指令),自動調整功能會暫停 (ScalingActive: False),直到工作負載縮減至 1 個以上的副本。

如需逐步說明,請參閱「使用 HPA 將 GKE 工作負載擴展至零或從零擴展」。

限制

  • 除非您搭配使用 HPA 適當調整大小功能和 VPA (預先發布版),否則請勿在 CPU 或記憶體上同時使用水平自動調度 Pod 資源和標準垂直自動調度 Pod 資源。您可以搭配使用水平和垂直 Pod 自動調度器,調度其他指標,或設定多維度 Pod 自動調度器,同時水平調度 CPU 和垂直調度記憶體。
  • 如果您有 Deployment,請勿在支援該 Deployment 的 ReplicaSet 或 Replication Controller 上設定水平自動調度 Pod 資源。對 Deployment 或複製控制器執行滾動式更新時,系統會以新的複製控制器取代。請改為在 Deployment 本身設定水平自動調度 Pod 資源。
  • 您無法對無法調度資源的工作負載 (例如 DaemonSet) 使用水平自動調度 Pod 資源功能。
  • 水平自動調度 Pod 資源會將指標公開為 Kubernetes 資源,這會對指標名稱設下限制,例如不得使用大寫或「/」字元。指標介面卡可能允許重新命名。舉例來說,請參閱 prometheus-adapter as 運算子。
  • 如果水平 Pod 自動配置器設定要監控的任何指標無法使用,就不會縮減規模。如要檢查是否有無法使用的指標,請參閱「查看水平 Pod 自動配置器的詳細資料」。

擴充性

雖然水平 Pod 自動調度器支援的 HPA 物件數量沒有硬性限制,但隨著數量增加,效能可能會受到影響。具體來說,HPA 重新計算的時間間隔可能會超過標準的 15 秒。

  • 在 GKE 子版本 1.31 或 1.32 中,如果設定效能 HPA 設定檔,重新計算週期應保持在 15 秒內,最多可有 1,000 個 HPA 物件。瞭解如何設定效能 HPA 設定檔。
  • 在 GKE 子版本 1.33 以上,如果設定效能 HPA 設定檔,重新計算週期應在 15 秒內,最多可有 5,000 個 HPA 物件。如果叢集符合需求條件,系統會預設啟用 Performance HPA 設定檔。
  • 如果未設定效能 HPA 設定檔,重新計算週期應維持在 15 秒內,最多可有 300 個 HPA 物件。

下列因素也可能影響效能:

  • 根據多項指標調整規模: 每項指標都會新增擷取呼叫,以計算建議,這會影響重新計算的週期。
  • 自訂指標堆疊的延遲時間:回應時間超過約 50 毫秒,會比標準 Kubernetes 指標通常觀察到的時間更長,進而影響重新計算週期。

與 HorizontalPodAutoscaler 物件互動

您可以為工作負載設定水平 Pod 自動配置器,並前往 Google Cloud 控制台的「Workloads」(工作負載) 頁面,取得自動調度資源事件和事件原因的相關資訊。

每個水平 Pod 自動配置器都會以 HorizontalPodAutoscaler 物件的形式存在於叢集中。您可以使用 kubectl get hpa 或 kubectl describe hpa HPA_NAME 等指令與這些物件互動。

您也可以使用 kubectl autoscale 指令建立 HorizontalPodAutoscaler 物件。

後續步驟