本頁說明如何使用垂直 Pod 自動調度資源功能,分析及調整資源分配,進而提升 Google Kubernetes Engine (GKE) 的工作負載效率。分析工作負載的資源用量變化趨勢,取得最佳化建議,並自動調整 Pod 中容器的 CPU 和記憶體要求與限制。
本頁面說明垂直 Pod 自動調度資源的運作方式、優點和限制、使用最佳做法,以及存取 VerticalPodAutoscaler 自訂資源和相關類型的 API 參考資料。
本頁內容適用於負責佈建及設定雲端資源、部署工作負載,以及管理應用程式擴充的運算子和開發人員。如要進一步瞭解常見角色,請參閱「常見的 GKE 使用者角色和工作」。
閱讀本頁面之前,請務必先熟悉 Kubernetes 中的資源要求和限制。
如要因應資源用量突然增加而快速調度資源,請使用水平 Pod 自動配置器。
如要瞭解自動調度資源的最佳做法,請參閱「在 GKE 上執行最具成本效益的 Kubernetes 應用程式的最佳做法」。
為何要使用垂直自動調度 Pod 資源功能
垂直 Pod 自動調度資源具有下列優點:
- 為工作負載設定適當的資源要求和限制,可提升穩定性並提高成本效益。如果 Pod 資源大小小於工作負載需求,應用程式可能會受到節流,或因記憶體不足錯誤而失敗。如果資源過大,就會造成浪費,因此帳單金額也會較高。
- 叢集節點將可有效運用,因為 Pod 所使用的節點正是它們所需要的。
- Pod 會被安排到具有適當節點的資源上。
- 您不必執行耗時的基準化任務來決定 CPU 和記憶體要求的正確值。
- 您可以縮短維護時間,因為自動配置器可以隨時間調整 CPU 和記憶體要求,您無需執行任何操作。
- 垂直自動調度 Pod 資源功能最適合長時間執行的同質工作負載。
相較於開放原始碼 Kubernetes 自動調度器,GKE 垂直 Pod 自動調度資源具有下列優勢:
- 決定建議目標時,會將節點大小上限和資源配額納入考量。
- 通知叢集自動配置器調整叢集容量。
- 使用歷來資料,包括啟用 VerticalPodAutoscaler 前收集的指標。
- 以控制層程序的形式執行 VerticalPodAutoscaler Pod,而不是在工作站節點上部署。
垂直自動調度 Pod 資源的運作方式
垂直自動調度 Pod 資源功能可供您分析及設定 Pod 要求的 CPU 和記憶體資源。您不必為 Pod 中的容器設定最新的CPU 要求和限制,以及記憶體要求和限制,而是可以設定垂直自動調度 Pod 資源功能,提供建議的 CPU 和記憶體要求與限制值,然後手動更新 Pod,也可以設定垂直自動調度 Pod 資源功能,自動更新這些值。
Autopilot 叢集預設會啟用垂直 Pod 自動調度資源功能。
與 Kubernetes 開放原始碼 VerticalPodAutoscaler 的關係
GKE 垂直 Pod 自動調度資源功能是以 Kubernetes 開放原始碼的 VerticalPodAutoscaler API 為基礎,但這是 GKE 獨有的獨立實作方式。GKE 實作項目專為大規模作業設計,並提供專屬的建議工具,但仍維持與開放原始碼版本相同的 VerticalPodAutoscaler API 種類和欄位。
詳情請參閱 Kubernetes 垂直自動調度 Pod 資源說明文件。
垂直自動調度 Pod 資源模式
您可以套用不同的更新模式,設定垂直 Pod 自動調度資源功能套用資源變更的方式。
Auto (Recreate) 模式
在 Recreate 模式下,垂直 Pod 自動調度資源功能會在需要變更 Pod 的資源要求時移除 Pod。由於 Kubernetes 1.33 之前的版本有相關限制,若要修改執行中 Pod 的資源要求,唯一方式就是重新建立 Pod,因此必須執行驅逐作業。
如要限制 Pod 重新建立的次數,請使用 Pod 中斷預算。如要確保叢集可以處理新的工作負載規模,請使用叢集自動配置器和節點自動佈建功能。
垂直自動調度 Pod 資源功能會在更新之前通知叢集自動調度器,並在重新建立工作負載之前提供工作負載大小調整後所需的資源,以盡量縮短中斷時間。
Initial模式
啟用 Initial 後,垂直 Pod 自動調度資源功能只會在建立 Pod 時指派資源要求,之後就不會再變更。
InPlaceOrRecreate模式
InPlaceOrRecreate 模式會嘗試更新 Pod 資源,但不重新建立 Pod,以減少服務中斷。
如要使用 InPlaceOrRecreate 模式,請在 VerticalPodAutoscaler 物件中將 spec.updatePolicy.updateMode 欄位設為 "InPlaceOrRecreate"。這個模式會根據工作負載資訊清單中定義的 resizePolicy 欄位,判斷資源變更是否需要重新啟動。如果未定義 resizePolicy 欄位,CPU 和記憶體預設為 NotRequired,表示系統會嘗試就地更新。
如果容器因 OOM (記憶體不足) 事件而終止,InPlaceOrRecreate 模式的垂直自動調度 Pod 資源功能會與 Auto 模式類似,都會從失敗中學習。在因當機而觸發後續的 Pod 重新建立作業時,垂直 Pod 自動調度功能會套用包含安全緩衝區的建議 (通常是額外 20% 的記憶體或 100 MB,取較大者),以防止立即重複發生 OOM 錯誤。
Kubernetes 1.34.0-gke.2201000 以上版本才支援 InPlaceOrRecreate 模式。
InPlaceOrRecreate 模式的備用情境
如果垂直 Pod 自動調整功能判斷無法就地更新,就會改用 Recreate 模式行為,也就是移除並重新建立 Pod 來套用變更。垂直 Pod 自動調度資源功能會還原為重新建立的常見情況包括:
- 節點容量不足:更新後的資源要求超出目前節點的可分配容量,且無法就地排定更新作業 (「不可行」或「延後」狀態超過逾時時間)。
- QoS 類別變更:資源更新會變更 Pod 的服務品質 (QoS) 類別,例如從
Burstable變更為Guaranteed。 RestartContainer政策:對於垂直 Pod 自動調度資源功能嘗試變更的資源,Pod 的resizePolicy欄位會設為RestartContainer。- 逾時:就地更新要求待處理的時間過長。
Off模式
在 Off 模式下,垂直 Pod 自動調度資源功能不會自動對 Pod 套用任何變更。
您仍可根據過往用量查看建議的 CPU 和記憶體要求與限制值,但系統不會為您套用這些建議。如有需要,您可以手動將建議值套用至 Pod。
資源政策
您可以透過 ContainerResourcePolicy 自訂垂直 Pod 自動調整功能,為特定容器產生建議。這項政策可讓您設定限制,並控管要擴充哪些資源。
最低和最高限額
您可以為容器指定資源的最小值 (minAllowed) 和最大值 (maxAllowed)。
minAllowed:垂直 Pod 自動調度資源不會建議低於此限制的值。這項限制有助於確保基本效能或滿足應用程式的特定需求。maxAllowed:垂直 Pod 自動調度資源不會建議高於此限制的值。這項限制有助於控管成本,或防止單一容器耗用過多節點資源。
受控資源
根據預設,垂直 Pod 自動調度資源功能會計算 CPU 和記憶體的建議值。您可以使用 controlledResources 欄位指定要自動調度資源。舉例來說,您可以設定自動配置器,只提供記憶體建議,CPU 要求則維持不變。
限制
- 如要搭配水平 Pod 自動調度資源使用垂直 Pod 自動調度資源,請使用多維度 Pod 自動調度資源。您也可以在自訂和外部指標中,搭配水平 Pod 自動調度資源使用垂直 Pod 自動調度資源。
- 由於工作負載的實際記憶體用量瀏覽權限受到限制,因此針對與 JVM 型工作負載搭配使用,垂直 Pod 自動調度功能尚未準備就緒。
- 垂直 Pod 自動調度資源功能會為 Deployment 設定兩個備用資源下限,以利替換資源值經過修訂的 Pod。在 GKE 1.22 以上版本中,您可以在 PodUpdatePolicy 欄位中指定
minReplicas欄位的值,藉此覆寫這項設定。 - 如果您使用垂直 Pod 自動調度資源的
InPlaceOrRecreate更新模式,且無法進行就地更新 (例如,將 Pod 向上擴充至超出節點容量),垂直 Pod 自動調度資源就會移除並重新建立 Pod,以套用建議。即使 Pod 在規格中設定了resizePolicy欄位,避免重新建立,系統仍會逐出並重新建立 Pod。Autopilot 調整大小要求會發生這種情況,包括套用最低資源和 CPU:記憶體比例限制時。 - 垂直自動調度 Pod 資源功能需要管理 Pod 的工作負載物件,例如 Deployment、StatefulSet、ReplicaSet 或 ReplicationController。您無法搭配獨立 Pod 使用垂直 Pod 自動調度功能,因為需要工作負載控制器來管理 Pod 重新建立程序。
最佳做法
- 限制
VerticalPodAutoscaler物件的數量。為避免叢集更新中斷,建議每個叢集的VerticalPodAutoscaler物件數量不要超過 1,000 個。 - 垂直自動調度 Pod 資源功能最適合長時間執行的同質工作負載。
- 長時間執行:至少執行 24 小時的工作負載。垂直自動調度 Pod 資源功能需要大量歷來資料,才能產生高信賴度的建議。在
Auto或Recreate模式下,更新通常會在 Pod 至少存在 24 小時後進行,有助於避免 Pod 頻繁重新啟動和流失。 - 同質:單一
VerticalPodAutoscaler物件 (例如 Deployment 中的所有副本) 所指定的 Pod 應呈現類似的資源耗用模式。垂直 Pod 自動調度器會匯總所有目標 Pod 的用量資料,然後產生建議。如果副本的使用情況不一,例如有些 Pod 閒置,有些則負載過重,垂直 Pod 自動配置器可能會建議為閒置 Pod 過度配置資源,或為忙碌 Pod 配置的資源不足。
- 長時間執行:至少執行 24 小時的工作負載。垂直自動調度 Pod 資源功能需要大量歷來資料,才能產生高信賴度的建議。在
- 針對需求突然暴增的工作負載,使用水平 Pod 自動調度資源功能。垂直自動調度 Pod 資源功能的設計目的是為了在穩定狀態下調整資源大小,不適用於突然出現的短期資源用量尖峰。如果工作負載的流量或 CPU/記憶體需求量快速波動,請改用水平 Pod 自動調度器。
- 善用 OOM 防護機制。雖然垂直 Pod 自動調度資源功能是反應式,但確實包含自動防護機制,可防範記憶體不足 (OOM) 事件。如果 Pod
OOMKilled,垂直 Pod 自動調度器會立即觀察到該事件,並將記憶體建議增加約 20% (或 100 MB,以較大者為準),以便在重新建立 Pod 時提升穩定性。如要進一步瞭解 OOM 事件,請參閱「排解 OOM 事件」。
API 參考資料
這是 v1 API 參考資料。我們強烈建議您使用這個版本的 API。
VerticalPodAutoscaler v1 autoscaling.k8s.io
| 欄位 | |
|---|---|
|
API 群組、版本和種類。 |
metadata |
標準物件中繼資料。 |
spec |
|
status |
最近一次觀察到的 |
VerticalPodAutoscalerSpec v1 autoscaling.k8s.io
| 欄位 | |
|---|---|
targetRef |
參考管理 Pod 組合的控制器以便自動配置器進行控制 (例如部署或 StatefulSet)。
您可以將 |
updatePolicy |
指定在啟動 Pod 時是否套用建議的更新,以及在 Pod 的生命週期內是否套用建議的更新。 |
resourcePolicy |
指定有關如何針對個別容器調整 CPU 和記憶體要求的政策。資源政策可用於針對個別容器的建議設定限制。如未指定,自動調度器會計算 Pod 中所有容器的建議資源,不會有額外限制。 |
recommenders |
負責為這個 VPA 物件生成建議的推薦工具。如要使用 GKE 提供的預設建議工具,請將此處留空。否則,清單只能包含一個使用者提供的替代建議項目。 自 GKE 1.22 起支援。 |
VerticalPodAutoscalerList v1 autoscaling.k8s.io
| 欄位 | |
|---|---|
|
API 群組、版本和種類。 |
metadata |
標準物件中繼資料。 |
items |
|
PodUpdatePolicy v1 autoscaling.k8s.io
| 欄位 | |
|---|---|
updateMode |
指定在啟動 Pod 時是否套用建議的更新,以及在 Pod 的生命週期內是否套用建議的更新。可能的值如下:
|
minReplicas |
嘗試剔除 Pod 時,必須保持運作的副本數量下限 (待處理其他檢查,例如 Pod 中斷預算)。只能輸入正值。預設值為 |
PodResourcePolicy v1 autoscaling.k8s.io
| 欄位 | |
|---|---|
containerPolicies |
個別容器的資源政策陣列。 每個具名容器最多只能有一個項目,也可以選擇使用 `containerName = '*'` 的單一萬用字元項目,處理沒有個別政策的所有容器。 |
ContainerResourcePolicy v1 autoscaling.k8s.io
| 欄位 | |
|---|---|
containerName |
政策套用的容器名稱。若未指定,該政策將作為預設政策使用。 |
mode |
指定在啟動容器時是否套用建議的更新,以及在容器的生命週期內是否套用建議的更新。可能的值為「Off」(關閉) 和「Auto」(自動)。 如未指定值,預設為「自動」。 |
minAllowed |
指定容器允許的最小 CPU 要求和記憶體要求。預設無下限。 |
maxAllowed |
指定容器允許的最大 CPU 要求和記憶體要求。預設沒有上限。 |
ControlledResources |
指定 |
VerticalPodAutoscalerRecommenderSelector v1 autoscaling.k8s.io
| 欄位 | |
|---|---|
name |
負責為這個物件產生建議的推薦者名稱。 |
VerticalPodAutoscalerStatus v1 autoscaling.k8s.io
| 欄位 | |
|---|---|
recommendation |
最近建議的 CPU 和記憶體要求。 |
conditions |
描述 |
RecommendedPodResources v1 autoscaling.k8s.io
| 欄位 | |
|---|---|
containerRecommendation |
個別容器的資源建議系列。 |
RecommendedContainerResources v1 autoscaling.k8s.io
| 欄位 | |
|---|---|
containerName |
建議套用的容器名稱。 |
target |
容器的建議 CPU 要求和記憶體要求。 |
lowerBound |
容器的最小建議 CPU 要求和記憶體要求。此數量不足以使應用程式穩定。若使用較小的 CPU 和記憶體要求來執行,可能會對效能或可用性產生重大影響。 |
upperBound |
容器的最大建議 CPU 要求和記憶體要求。高於這些值的 CPU 和記憶體要求可能會被浪費。 |
uncappedTarget |
由自動配置器所計算的最新資源建議,僅根據實際資源使用情況計算,並未考慮 ContainerResourcePolicy。如果實際資源使用率導致目標違反 ContainerResourcePolicy,這個值可能與受限的建議不同。這個欄位不會影響實際的資源分配。僅用於指示狀態。 |
VerticalPodAutoscalerCondition v1 autoscaling.k8s.io
| 欄位 | |
|---|---|
type |
已說明的條件類型。可能的值為「RecommendationProvided」、「LowConfidence」、「NoPodsMatched」和「FetchingHistory」。 |
status |
條件的狀態。可能的值為「True」、「False」和「Unknown」。 |
lastTransitionTime |
條件最近一次從一個狀態轉變為另一個狀態的時間。 |
reason |
上次從一種狀態轉換到另一種狀態的原因。 |
message |
人類可讀的字串,提供有關從一個狀態到另一個狀態最後一次轉換的詳情。 |
後續步驟
- 瞭解如何設定垂直 Pod 自動調度資源。
- 進一步瞭解水平 Pod 自動調度資源。
- 進一步瞭解叢集自動配置器。
- 瞭解如何設定水平 Pod 自動調度資源。
- 瞭解如何根據指標調整 Pod 自動調度資源。