本文說明如何在 Google Kubernetes Engine (GKE) 中,搭配垂直 Pod 自動調度器 (VPA) 使用 CPU 啟動加速功能,在 Pod 的初始化階段暫時增加分配給 Pod 的 CPU 資源。
CPU 啟動加速功能可暫時提高初始化期間的 CPU 要求,並將其調整回基準層級,藉此加速啟動應用程式及提高成本效益。本文將說明啟動加速功能的要求、設定 (Pod 和容器層級)、驗證和最佳做法。
本文適用於 DevOps、平台工程師和應用程式開發人員,協助您在 GKE 中提升應用程式啟動效能。
優點
使用 CPU 啟動效能強化功能可享有以下好處:
- 啟動速度更快:加快資源密集型應用程式的初始化速度,例如以 Java、Node.js 或 Python 編寫的應用程式。
- 成本效益:避免為穩定狀態作業過度佈建 CPU,同時滿足啟動需求。穩定狀態作業是指應用程式完成初始化,且資源用量趨於穩定後的這段期間。
- 不會中斷服務:使用 Kubernetes 內建的 Pod 大小調整 (IPPR) 功能,將資源調回基準層級,不必重新啟動容器。
- 減少手動作業:減少資源浪費,並盡量減少手動調整工作負載大小所需的心力。
需求條件
如要使用 CPU 啟動加速功能,必須符合下列規定:
- GKE 版本:Standard 和 Autopilot 叢集都必須使用
1.36.0-gke.4447000以上版本。 - 已啟用 VPA:在 Standard 叢集上啟用垂直 Pod 自動調度資源功能。GKE 會在 Autopilot 叢集上預設啟用 VPA。您可以選擇特定更新模式,專門使用 VPA 提升 CPU 啟動速度。如要啟用及設定 VPA,請參閱「自動設定 Pod 資源要求」。
- 工作負載類型:使用控制器 (例如 Deployment 或 StatefulSet) 管理工作負載。
- 節點容量:確認標準叢集有足夠的容量,可供加速 Pod 使用。如果容量不足,GKE 會限制提升的 Pod 要求,以符合節點容量。
CPU 啟動加速功能的運作方式
如要進一步瞭解效能提升生命週期,以及 CPU 啟動效能提升如何計算資源增加量,請參閱「CPU 啟動效能提升的運作方式」。
事前準備
開始之前,請確認您已選取要提升叢集效能的 Cloud de Confiance by S3NS 專案,並完成下列工作:
- 啟用 Google Kubernetes Engine API。 啟用 Google Kubernetes Engine API
- 如要使用 Google Cloud CLI 執行這項工作,請安裝並初始化 gcloud CLI。如果您先前已安裝 gcloud CLI,請執行
gcloud components update指令,取得最新版本。較舊的 gcloud CLI 版本可能不支援執行本文件中的指令。
將 gcloud CLI 設為使用所選專案:
gcloud config set project PROJECT_ID將
PROJECT_ID替換為專案 ID。確認您有現有的 GKE 叢集。如果沒有,請參閱「建立叢集」。
必要的角色
如要取得啟用及使用 CPU 啟動加速功能所需的權限,請要求管理員在專案中授予您下列 IAM 角色:
- Kubernetes Engine 管理員 (
roles/container.admin) - Kubernetes Engine 開發人員 (
roles/container.developer)
如要進一步瞭解如何授予角色,請參閱「管理專案、資料夾和組織的存取權」。
啟用 CPU 啟動加速
如要啟用 CPU 啟動加速功能,請在 VerticalPodAutoscaler (VPA) 資訊清單中新增 startupBoost 設定區塊。您可以設定要套用至 Pod 中所有容器的提升幅度,也可以指定要提升的資源,並套用至個別容器。
設定 Pod 層級的增強功能
Pod 層級的加速功能會對工作負載中的每個容器套用相同的 CPU 資源增量。您可以設定 CPU 啟動加速,並選擇是否要搭配 VPA 的持續資源管理功能。
如要設定 Pod 層級的提升,請使用下列任一選項。
選項 A:已啟用啟動加速功能,且已停用 VPA 更新模式
使用這個選項可專門運用 VPA 的 CPU 啟動加速功能,而不實際執行一般的 VPA 建議。以下範例會套用 2 的 CPU 乘數,並在 Pod 達到 Ready 狀態後維持 10 秒:
apiVersion: "autoscaling.k8s.io/v1"
kind: VerticalPodAutoscaler
metadata:
name: example-vpa
spec:
targetRef:
apiVersion: "apps/v1"
kind: Deployment
name: example
updatePolicy:
updateMode: "Off"
startupBoost:
cpu:
type: "Factor"
factor: 2
durationSeconds: 10
選項 B:同時啟用啟動加速和 VPA 更新模式
如要讓 GKE 管理啟動加速功能,並根據持續用量自動調整 Pod 的資源要求,請使用這個選項。以下範例會套用啟動加速功能,並將 updateMode 欄位設為 InPlaceOrRecreate:
apiVersion: "autoscaling.k8s.io/v1"
kind: VerticalPodAutoscaler
metadata:
name: example-vpa
spec:
targetRef:
apiVersion: "apps/v1"
kind: Deployment
name: example
updatePolicy:
updateMode: "InPlaceOrRecreate"
startupBoost:
cpu:
type: "Factor"
factor: 2
durationSeconds: 10
設定容器層級的增強功能
如果工作負載包含不需要額外資源的 Sidecar 或其他容器,您可以在 resourcePolicy 區段中,指定要啟動加速的容器。containerName 值必須與部署規格中容器的 name 欄位相符。
如要設定容器層級的提升幅度,請使用下列其中一個選項。
選項 A:提升特定容器的優先順序 (停用 VPA 啟動)
使用這個選項可對單一容器套用提升效果,同時保留 Pod 的其餘資源要求。以下資訊清單範例會為名為 boosted-container-name 的容器,在基準要求中新增兩個 vCPU:
apiVersion: "autoscaling.k8s.io/v1"
kind: VerticalPodAutoscaler
metadata:
name: example-vpa
spec:
targetRef:
apiVersion: "apps/v1"
kind: Deployment
name: example
updatePolicy:
updateMode: "Off"
resourcePolicy:
containerPolicies:
- containerName: "boosted-container-name"
mode: "Off"
startupBoost:
cpu:
type: "Quantity"
quantity: "2"
選項 B:在 Pod 層級停用特定容器的加速功能
如果您已設定 Pod 層級的提升,但想排除特定容器,請使用這個選項。下列資訊清單範例會將 CPU 乘數 2 套用至整個 Pod,但會將名為 disable-cpu-boost-for-this-container 的容器的乘數設為 1,藉此停用該容器的加速功能:
apiVersion: "autoscaling.k8s.io/v1"
kind: VerticalPodAutoscaler
metadata:
name: example-vpa
spec:
targetRef:
apiVersion: "apps/v1"
kind: Deployment
name: example
updatePolicy:
updateMode: "InPlaceOrRecreate"
startupBoost:
cpu:
type: "Factor"
factor: 2
resourcePolicy:
containerPolicies:
- containerName: "disable-cpu-boost-for-this-container"
startupBoost:
cpu:
type: "Factor"
factor: 1
確認 CPU 啟動加速
如要確認 Pod 是否獲得提升,請檢查 VPA 設定、Pod 資源要求、Pod 註解和 VPA 事件。
驗證 VPA 設定
如要查看 VerticalPodAutoscaler 物件的詳細資料,請執行下列指令:
kubectl describe vpa VPA_NAME
將 VPA_NAME 替換為 VPA 物件的名稱。
檢查 Pod 的 CPU 提升要求
如要驗證 Pod 的目前資源要求,請執行下列指令:
kubectl describe pod POD_NAME
將 POD_NAME 替換為 Pod 的名稱。
使用 Pod 註解驗證 CPU 提升
VPA 許可控制器 Webhook 會插入容器範圍的註解,追蹤每個容器在加速到期時應還原的原始資源。如要檢查這些註解,請執行下列指令:
kubectl get pod POD_NAME --output yaml
在 metadata.annotations 區段下方,尋找格式為 vpaCpuStartupBoost/CONTAINER_NAME 的註解。例如:
metadata:
annotations:
vpaCpuStartupBoost/slow-starter: '{"requests":{"cpu":"50m","memory":"64Mi"},"limits":{"cpu":"200m","memory":"128Mi"}}'
指令輸出內容會顯示下列其中一個驗證結果:
- 成功提升:Pod 上有
vpaCpuStartupBoost/CONTAINER_NAME註解。 - 增幅未成功:完全缺少註解。這表示許可控制器忽略了提升要求,可能是因為節點容量限制或 Autopilot 資源限制。
檢查縮減事件
如要確認 GKE 是否已成功將 CPU 資源分配量調回基準,請執行下列指令,檢查叢集事件:
kubectl get events --field-selector reason=InPlaceResizedByVPA
指令輸出內容會顯示下列其中一個驗證結果:
- 成功取消升級:您會看到
InPlaceResizedByVPA事件,訊息指出 VPA 更新程式已就地調整 Pod 大小。這表示 CPU 要求已恢復基準值,且容器未重新啟動。 - 取消升級失敗:
vpaCpuStartupBoost/CONTAINER_NAME註解在升級到期後仍保留在 Pod 上,且沒有InPlaceResizedByVPA事件。
最佳做法和限制
使用 CPU 啟動加速時,請注意下列事項。
與水平 Pod 自動調度資源的互動
如果您搭配 CPU 啟動加速功能使用水平 Pod 自動調度資源 (HPA),請遵循下列準則:
- 定義健康狀態探測:您必須為工作負載定義
readinessProbe。 - 設定延遲時間:您必須將
durationSeconds參數設為0。這項設定可避免 HPA 在啟動期間因 CPU 使用率過高而過早擴大應用程式。
叢集自動調度器和逐出迴圈
如果您在 GKE Standard 叢集上使用叢集自動配置器,請注意下列節點行為:
- 可能出現的逐出迴圈:暫時的 CPU 提升可能會觸發節點擴充。Pod 就緒並縮減後,未充分運用可能會觸發節點縮減,並移出 Pod,導致無窮迴圈。
- 緩解措施:強烈建議使用 GKE Autopilot,緩解節點重組和逐出迴圈問題。
容器重新啟動
請查看下列行為,瞭解容器重新啟動對 CPU 啟動加速的影響:
- 僅在建立 Pod 時:CPU 啟動加速僅適用於 Pod 的初始建立階段。
- 重新啟動時不會提升:如果容器重新啟動 (例如因 OOMKill 事件而重新啟動),但 Pod 仍處於啟用狀態,GKE 不會再次套用提升。發生這種情況的原因是,Pod 許可網路鉤環只會在初始 Pod 建立程序期間觸發。
清除所用資源
由於您是在現有工作負載上設定 CPU 啟動加速,請注意下列事項,以免工作負載中斷:
- 您不需要刪除任何 Kubernetes 資源。
- 如果仍需使用 VerticalPodAutoscaler 物件或工作負載控制器 (例如 Deployment 或 StatefulSet) 執行穩定狀態作業,請勿刪除。
如果不需要 CPU 啟動加速功能,可以視範圍使用下列其中一種方法,單獨停用加速功能:
- 停用整個工作負載的提升功能:從 VerticalPodAutoscaler 物件規格中刪除
startupBoost區塊,然後將更新後的資訊清單套用至叢集。 停用特定容器的加速功能:如要從 Pod 層級的加速功能排除特定容器,請在
containerPolicies區段下方新增容器政策,並將 CPU 乘數設為 1。startupBoost: cpu: type: "Factor" factor: 1詳情請參閱「設定容器層級的提升」。
- 停用整個工作負載的提升功能:從 VerticalPodAutoscaler 物件規格中刪除