AutoScaling - Vertical Pod AutoScaler
什麼是 Vertical Pod Autoscaler?
Vertical Pod Autoscaler(VPA) 是 Kubernetes 提供的一種資源自動調整機制,主要用於 動態調整 Pod 的 CPU 和記憶體資源,以確保應用程式能夠獲得適當的資源,提升效能並降低不必要的資源浪費。 與 Horizontal Pod Autoscaler(HPA) 不同,VPA 是透過 調整單個 Pod 的資源限制(CPU / Memory Requests & Limits) 來最佳化資源使用。
VPA 的核心功能
- 自動調整 Pod 資源分配
- 根據實際負載,動態調整 CPU 和記憶體的
requests和limits,減少過多配置造成的浪費,或避免資源不足導致的效能問題。
- 根據實際負載,動態調整 CPU 和記憶體的
- 避免 OOM(Out of Memory)問題
- 如果 Pod 需要的記憶體超出當前配置,VPA 會根據需求增加
requests,防止因為記憶體不足而導致 Pod Crash。
- 如果 Pod 需要的記憶體超出當前配置,VPA 會根據需求增加
- 提供資源建議(Recommendation Mode)
- VPA 可以運行在 推薦模式(Recommend Only),提供合適的資源配置建議,而不會自動調整 Pod 配置,讓使用者自行決定是否採納建議。
- 與 HPA 搭配使用
- 雖然 VPA 和 HPA 主要解決不同層面的資源管理問題,但它們可以搭配使用,例如:VPA 負責調整個別 Pod 的資源請求,而 HPA 負責擴展 Pod 的數量,以確保應用的高可用性和擴展性。
VPA 的運作方式
VPA 由三個主要元件組成:
- Recommender(建議器)
- 負責監控 Pod 的資源使用情況,並根據歷史數據計算出最佳的 CPU/記憶體需求,提供建議值。
- Updater(更新器)
- 負責檢查現有的 Pod 是否需要調整資源分配。若需要,會重新建立新的 Pod(因為 Kubernetes 不允許直接修改 Pod 的
requests和limits)。
- 負責檢查現有的 Pod 是否需要調整資源分配。若需要,會重新建立新的 Pod(因為 Kubernetes 不允許直接修改 Pod 的
- Admission Controller(准入控制器)
- 在 Pod 創建時,自動為其設定適當的資源限制,確保新創建的 Pod 符合 VPA 的建議配置。
VPA 配置範例
這個 VPA 物件會 自動調整 CPU 和記憶體的 Requests:
apiVersion: autoscaling.k8s.io/v1
kind: VerticalPodAutoscaler
metadata:
name: hamster-vpa
namespace: default
spec:
targetRef:
apiVersion: apps/v1
kind: Deployment
name: hamster
updatePolicy:
updateMode: 'Auto' # 可選 "Off"、"Initial"、"Recreate" 或 "Auto"
resourcePolicy:
containerPolicies:
- containerName: hamster
minAllowed:
cpu: 50m
memory: 20Mi
maxAllowed:
cpu: 2
memory: 1Gi
controlledResources: ['cpu', 'memory']
VPA 指標類型
spec.updatePolicy.updateMode
updateMode 控制 VPA 如何調整 Pod 的 requests,它有四種模式:
| 模式 | 行為 |
|---|---|
"Off" | VPA 只提供建議,不會自動調整 Pod。需要手動查詢 VPA 建議值。 |
"Initial" | 只會在 Pod 啟動時調整 requests,之後不再更新。適合對變動不大的應用。 |
"Recreate" | 調整 requests 需要刪除並重新建立 Pod,因此會有停機時間。適合 無法動態調整 requests 的應用。 |
"Auto" | 自動調整 requests,並盡量避免重啟 Pod(適用於支援動態資源變更的應用)。 |
應用場景
"Off"→ 只想查看 VPA 的建議值,而不讓它自動調整。"Initial"→ 適合批次工作(Batch Jobs),只在啟動時設定合適的requests。"Recreate"→ 適合 無法動態變更requests的應用,例如某些基於 Java 的應用。"Auto"→ 推薦選擇,適合大部分應用,能動態調整requests而不影響運行。
spec.resourcePolicy.containerPolicies
containerPolicies 用來 設定 VPA 允許調整的資源範圍,細分如下:
| 欄位 | 功能 |
|---|---|
containerName | 指定要調整的容器名稱。可以是特定名稱或 "*"(代表所有容器)。 |
minAllowed | VPA 允許的最小 requests 限制,低於此值不會調整。 |
maxAllowed | VPA 允許的最大 requests 限制,超過此值不會調整。 |
controlledResources | 指定要調整的資源類型,可以是 "cpu"、"memory",或 ["cpu", "memory"]。 |
controlledValues | (選填)可選 "RequestsAndLimits" 或 "RequestsOnly",預設為 "RequestsOnly"。 |
VPA 適用場景
- 機器學習 / 批次處理應用:這些應用對 CPU 和記憶體有較高需求,VPA 能夠確保它們獲得足夠的資源。
- 長時間運行的應用:對於一些長時間運行的應用(如資料庫、後台服務),VPA 能夠根據歷史負載逐步調整資源配置,提升效能。
- 預算受限的應用:當需要節省資源成本時,VPA 可以幫助減少不必要的 CPU/記憶體配置,避免浪費。
VPA 使用限制
- VPA 需要重啟 Pod
- 由於 Kubernetes 不允許動態修改 Pod 的
requests和limits,所以 VPA 在調整資源時會刪除舊 Pod 並重新創建新 Pod,可能會導致短暫的停機時間。
- 由於 Kubernetes 不允許動態修改 Pod 的
- 與 HPA 可能衝突
- 如果 HPA 依據 CPU/記憶體來擴展 Pod 數量,而 VPA 同時調整 CPU/記憶體的請求值,可能會產生資源配置衝突,因此通常 HPA 會基於自定義指標(如請求數量)運行,而 VPA 負責 CPU/Memory 的最佳化。
- 無法適用於 Request 量變化大但資源需求小的應用
- 例如 Web 伺服器流量高峰時,VPA 可能無法應對突發負載,而 HPA 透過 Pod 水平擴展更適合這種場景。