本頁面說明如何使用垂直 Pod 自動調度資源功能,分析及最佳化資源分配,進而提升 Google Kubernetes Engine (GKE) 的工作負載效率。分析工作負載的資源用量變化趨勢,取得最佳化建議,並自動調整 Pod 中容器的 CPU 和記憶體要求與限制。
本頁面說明垂直 Pod 自動調度資源的運作方式、優點和限制、使用最佳做法,以及 VerticalPodAutoscaler
自訂資源和相關類型的 API 參考資料。
本頁面適用於佈建及設定雲端資源、部署工作負載,以及管理應用程式擴縮的運算子和開發人員。如要進一步瞭解常見角色,請參閱「常見的 GKE Enterprise 使用者角色和工作」。
閱讀本頁面之前,請先熟悉 Kubernetes 中的資源要求和限制。
如要因應資源用量突然增加而快速調度資源,請使用水平 Pod 自動配置器。
如要瞭解自動調度資源的最佳做法,請參閱「在 GKE 上執行最具成本效益的 Kubernetes 應用程式的最佳做法」。
垂直自動調度 Pod 資源的運作方式
垂直自動調度 Pod 資源功能可供您分析及設定 Pod 要求的 CPU 和記憶體資源。您不必為 Pod 中的容器設定最新的CPU 要求和限制,以及記憶體要求和限制,而是可以設定垂直自動調度 Pod 資源功能,提供建議的 CPU 和記憶體要求與限制值,然後手動更新 Pod,也可以設定垂直自動調度 Pod 資源功能,自動更新這些值。
Autopilot 叢集預設會啟用垂直 Pod 自動調度資源功能。
自動模式下的垂直 Pod 自動調度資源
由於 Kubernetes 的限制,若要修改執行中 Pod 資源要求,唯一方式就是重新建立 Pod。如果您建立的 VerticalPodAutoscaler
物件 updateMode
為 Auto
,則 VerticalPodAutoscaler
會在需要變更 Pod 的資源要求時移除 Pod。
如要限制 Pod 重新啟動的次數,請使用 Pod 中斷預算設定。 如要確保叢集可以處理新的工作負載規模,請使用叢集自動配置器和節點自動佈建功能。
垂直自動調度 Pod 資源功能會在更新之前通知叢集自動調度器,並在重新建立工作負載之前提供工作負載大小調整後所需的資源,以盡量縮短中斷時間。
優點
垂直 Pod 自動調度資源提供以下優勢:
- 為工作負載設定適當的資源要求和限制,可提升穩定性和成本效益。如果 Pod 資源大小小於工作負載需求,應用程式可能會受到節流,或因記憶體不足錯誤而失敗。如果資源過大,就會造成浪費,因此帳單金額也會較高。
- 叢集節點將可有效運用,因為 Pod 所使用的節點正是它們所需要的。
- Pod 會被安排到具有適當節點的資源上。
- 您不必執行耗時的基準化任務來決定 CPU 和記憶體要求的正確值。
- 縮短維護時間,因為自動配置器可以隨時間調整 CPU 和記憶體要求,您無需執行任何操作。
相較於 Kubernetes 開放原始碼自動調度器,GKE 垂直 Pod 自動調度資源功能具有下列優點:
- 判斷建議目標時,會將節點大小上限和資源配額納入考量。
- 通知叢集自動配置器調整叢集容量。
- 使用歷來資料,提供您啟用垂直 Pod 自動調度器前收集的指標。
- 以控制層程序的形式執行垂直 Pod 自動調度資源 Pod,而不是在工作站節點上部署。
限制
- 如要搭配水平 Pod 自動調度資源使用垂直 Pod 自動調度資源,請使用多維度 Pod 自動調度資源。您也可以在自訂和外部指標中,搭配水平 Pod 自動調度資源使用垂直 Pod 自動調度資源。
- 由於工作負載的實際記憶體用量瀏覽權限受到限制,因此針對與 JVM 型工作負載搭配使用,垂直自動調度 Pod 資源功能尚未準備就緒。
- 垂直 Pod 自動調度資源功能會為 Deployment 設定兩個備用資源下限,以取代資源值經過修訂的 Pod。在 GKE 1.22 以上版本中,您可以在 PodUpdatePolicy 欄位中指定
minReplicas
的值,藉此覆寫這項設定。
最佳做法
- 為避免叢集更新中斷,建議您將每個叢集的
VerticalPodAutoscaler
物件數量維持在 1,000 個以下。 - 垂直自動調度 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 的生命週期內是否套用建議的更新。可能的值為「Off」(關)、「Initial」(初始)、「Recreate」(重新建立) 和「Auto」(自動)。 如未指定值,預設為「自動」。 |
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 |
人類可讀的字串,提供有關從一個狀態到另一個狀態最後一次轉換的詳情。 |