本頁面說明如何使用垂直 Pod 自動調度資源功能,分析及最佳化資源分配,進而提升 Google Kubernetes Engine (GKE) 的工作負載效率。分析工作負載的資源用量變化趨勢,取得最佳化建議,並自動調整 Pod 中容器的 CPU 和記憶體要求與限制。
本頁面說明垂直 Pod 自動調度資源的運作方式、優點和限制、使用最佳做法,以及 VerticalPodAutoscaler 自訂資源和相關類型的 API 參考資料。
本頁面適用於佈建及設定雲端資源、部署工作負載,以及管理應用程式擴充的運算子和開發人員。如要進一步瞭解常見角色,請參閱「常見的 GKE 使用者角色和工作」。
閱讀本頁面之前,請先熟悉 Kubernetes 中的資源要求和限制。
如要因應資源用量突然增加而快速調度資源,請使用水平 Pod 自動配置器。
如要瞭解自動調度資源的最佳做法,請參閱「在 GKE 上執行最具成本效益的 Kubernetes 應用程式的最佳做法」。
垂直自動調度 Pod 資源的運作方式
垂直自動調度 Pod 資源功能可供您分析及設定 Pod 要求的 CPU 和記憶體資源。您不必為 Pod 中的容器設定最新的CPU 要求和限制,以及記憶體要求和限制,而是可以設定垂直自動調度 Pod 資源功能,提供建議的 CPU 和記憶體要求與限制值,然後手動更新 Pod,也可以設定垂直自動調度 Pod 資源功能,自動更新這些值。
Autopilot 叢集預設會啟用垂直 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 來減少服務中斷。雖然這種模式不能保證零中斷,但它可以幫助減少中斷,同時也能受益於垂直 Pod 自動擴充。
若要使用 InPlaceOrRecreate 模式,請在 VerticalPodAutoscaler 物件中將 spec.updatePolicy.updateMode 欄位設為 "InPlaceOrRecreate"。
如果垂直 Pod 自動擴縮容確定無法進行就地更新,則會恢復到 Auto 模式行為,即驅逐並重新建立 Pod 以套用變更。
InPlaceOrRecreate 模式適用於 Kubernetes 版本 1.34.0-gke.2011000 及更高版本。
有關 InPlaceOrRecreate 模式的行為和現有限制的更多詳細信息,請參閱 Kubernetes 公告 就地更新。
Off 模式
在 Off 模式下,垂直 Pod 自動擴縮容不會自動將任何變更套用到 Pod。
您仍然可以查看基於歷史使用情況的 CPU 和記憶體請求及限制的建議值,但這些建議不會應用到您身上。如有需要,您可以手動將建議值套用到您的 Pods 中。
優點
垂直 Pod 自動擴縮容具有以下優點:
- 為工作負載設定合適的資源請求和限制,可提高穩定性和成本效益。如果您的 Pod 資源大小小於工作負載所需,則您的應用程式可能會受到限制,或者由於記憶體不足錯誤而失敗。如果您的資源規模過大,就會造成浪費,從而導致更高的帳單。
- 叢集節點利用率很高,因為 Pod 只使用它們需要的資源。
- Pod 會被安排到具有適當節點的資源上。
- 您不必執行耗時的基準化任務來決定 CPU 和記憶體要求的正確值。
- 由於自動擴縮容程序可以隨時調整 CPU 和記憶體請求,而無需您進行任何操作,因此可以減少維護時間。
與 GKE 垂直 Pod 自動擴縮容相比,它具有以下優勢:Kubernetes open source autoscaler :
- 在決定建議目標時,會考慮最大節點大小和資源配額。
- 通知 叢集自動擴縮器 調整叢集容量。
- 使用歷史數據,提供在啟用垂直 Pod 自動擴縮器之前收集的指標。
- 將垂直 Pod 自動擴縮器 Pod 作為 控制平面 程序運行,而不是部署在您的 工作節點 上。
限制
- 若要將垂直 Pod 自動擴縮容與 水平 Pod 自動擴縮容 結合使用,請使用 多維 Pod 自動擴縮容。 您也可以對 custom 和 external 指標使用垂直 Pod 自動擴縮容和水平 Pod 自動擴縮容。
- 由於對工作負載的實際記憶體使用缺乏可見性,垂直 Pod 自動擴縮容尚不適用於基於 JVM 的工作負載。
- 垂直 Pod 自動擴縮容的預設設定是 Deployment 至少有兩個副本,用於取代資源值已修改的 Pod。在 GKE 版本 1.22 及更高版本中,您可以透過在 PodUpdatePolicy 欄位中為
minReplicas指定值來覆寫此設定。 - 如果您使用垂直 Pod 自動擴縮容的
InPlaceOrRecreate更新模式,且無法進行就地更新(例如,當 Pod 擴縮容超出節點容量時),則垂直 Pod 自動擴縮容會驅逐並重新建立 Pod 以套用建議。即使 Pod 的規格中設定了resizePolicy以避免重新創建,也會發生驅逐和重新創建的情況。對於自動駕駛調整大小請求,包括套用 最小資源和 CPU:記憶體比率限制 時,都會出現此行為。 - 垂直 Pod 自動擴縮容需要一個管理 Pod 的工作負載對象,例如 Deployment、StatefulSet、ReplicaSet 或 ReplicationControllers。獨立 Pod 不能使用垂直 Pod 自動擴縮容,因為需要工作負載控制器來管理 Pod 重新建立流程。
最佳做法
- 限制
VerticalPodAutoscaler对象的数量。 為避免叢集更新中斷,我們建議您將每個叢集的VerticalPodAutoscaler物件數量保持在 1,000 以下。 - 垂直 Pod 自動擴縮容最適合長時間運作的同構工作負載。
- 長時間運作: 運作至少 24 小時的工作負載。垂直 Pod 自動擴縮容需要大量的歷史資料來產生高置信度的建議。在
Auto或Recreate模式下,更新通常在 Pod 至少運行 24 小時後發生,這有助於防止 Pod 頻繁重新啟動和變更。 - 同構: 單一
VerticalPodAutoscaler物件所針對的 Pod(例如 Deployment 中的所有副本)應表現出相似的資源消耗模式。垂直 Pod 自動擴縮器透過匯總所有目標 Pod 的使用資料來產生建議。如果您的副本使用情況各不相同,例如某些 Pod 處於空閒狀態,而其他 Pod 則負載很重,則垂直 Pod 自動擴縮器可能會建議對空閒的 Pod 進行過度配置,或者對繁忙的 Pod 進行配置不足。
- 長時間運作: 運作至少 24 小時的工作負載。垂直 Pod 自動擴縮容需要大量的歷史資料來產生高置信度的建議。在
- 對於需求突然激增的工作負載,請使用水平 Pod 自動擴縮容。 垂直 Pod 自動擴縮容旨在實現穩定狀態下的資源合理化,但無法解決突然出現的、短暫的資源激增問題。 對於流量或 CPU 或記憶體需求快速波動的工作負載,請改用 水平 Pod 自動擴縮器。
- 利用記憶體溢位保護。 雖然垂直 Pod 自動擴縮器是被動的,但它確實包含了對記憶體不足 (OOM) 事件的自動保護。如果 Pod 為
OOMKilled,垂直 Pod 自動擴縮器會立即觀察到該事件,並將記憶體建議增加約 20%(或 100 MB,以較大者為準),以提高 Pod 重新建立時的穩定性。
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 |
指定在啟動容器時是否套用建議的更新,以及在容器的生命週期內是否套用建議的更新。可選值為“關閉”和“自動”。 如果不指定值,則預設值為「自動」。 |
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 |
個別容器的資源建議系列。 |
RecommendationContainerResources v1 autoscaling.k8s.io
| 欄位 | |
|---|---|
containerName |
建議套用的容器名稱。 |
target |
容器的建議 CPU 要求和記憶體要求。 |
lowerBound |
容器的最小建議 CPU 要求和記憶體要求。此數量不足以使應用程式穩定。若使用較小的 CPU 和記憶體要求來執行,可能會對效能或可用性產生重大影響。 |
upperBound |
容器的最大建議 CPU 要求和記憶體要求。高於這些值的 CPU 和記憶體要求可能會被浪費。 |
uncappedTarget |
根據實際資源使用情況,自動擴縮器計算的最新資源建議,不考慮容器資源策略。如果實際資源使用情況導致目標違反了 ContainerResourcePolicy,這可能與有界建議不同。此欄位不影響實際資源分配。它僅用作狀態指示。 |
VerticalPodAutoscalerCondition v1 autoscaling.k8s.io
| 欄位 | |
|---|---|
type |
已說明的條件類型。可能的值為「RecommendationProvided」、「LowConfidence」、「NoPodsMatched」和「FetchingHistory」。 |
status |
條件的狀態。可能的值為「True」、「False」和「Unknown」。 |
lastTransitionTime |
條件最近一次從一個狀態轉變為另一個狀態的時間。 |
reason |
上次從一種狀態轉換到另一種狀態的原因。 |
message |
人類可讀的字串,提供有關從一個狀態到另一個狀態最後一次轉換的詳情。 |
後續步驟
- 學習如何配置垂直 Pod 自動擴縮容。
- 瞭解更多水平 Pod 自動擴縮容。
- 進一步瞭解叢集自動配置器。
- 瞭解如何設定水平 Pod 自動調度資源。
- 學習如何基於指標優化 Pod 自動擴縮容。