本文說明如何在 Google Kubernetes Engine (GKE) 中,搭配垂直 Pod 自動調度器 (VPA) 使用 CPU 啟動加速功能,在 Pod 的初始化階段暫時增加分配給 Pod 的 CPU 資源。
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 值必須與 Deployment 規格中容器的 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 許可網路鉤會插入容器範圍的註解,追蹤每個容器在提升到期時應還原的原始資源。如要檢查這些註解,請執行下列指令:
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 Updater 已就地調整 Pod 大小。這會確認 CPU 要求已恢復基準值,且容器未重新啟動。 - 取消升級失敗:升級應該過期很久了,但 Pod 仍有
vpaCpuStartupBoost/CONTAINER_NAME註解,且沒有InPlaceResizedByVPA事件。
最佳做法和限制
使用 CPU 啟動加速功能時,請注意下列事項。
與水平自動調度 Pod 資源的互動
如果您使用水平 Pod 自動配置器 (HPA) 搭配 CPU 啟動加速功能,請遵循下列準則:
- 定義健康狀態探查:您必須為工作負載定義
readinessProbe。 - 設定延遲時間:您必須將
durationSeconds參數設為0。這項設定可避免 HPA 在啟動期間因 CPU 使用率過高而過早擴展應用程式。
叢集自動調度器和驅逐迴圈
如果您在 GKE Standard 叢集上使用叢集自動配置器,請注意下列節點行為:
- 可能出現的逐出迴圈:暫時提升 CPU 可能會觸發節點擴充。Pod 準備就緒並縮減後,利用率不足可能會觸發節點縮減作業並逐出 Pod,導致無窮迴圈。
- 緩解措施:強烈建議使用 GKE Autopilot,緩解節點重組和逐出迴圈問題。
容器重新啟動
請查看下列行為,瞭解容器重新啟動對 CPU 啟動加速的影響:
- 僅在建立 Pod 時:CPU 啟動加速僅適用於 Pod 的初始建立階段。
- 重新啟動時不會提升:如果容器重新啟動 (例如因 OOMKill 事件而重新啟動),但 Pod 仍處於啟用狀態,GKE 不會再次套用提升。發生這種情況的原因是,Pod 准入 Webhook 只會在初始 Pod 建立程序期間觸發。
清除所用資源
由於您是在現有工作負載上設定 CPU 啟動加速,請注意下列事項,以免工作負載中斷:
- 您不需要刪除任何 Kubernetes 資源。
- 如果仍需使用 VerticalPodAutoscaler 物件或工作負載控制器 (例如 Deployments 或 StatefulSets) 進行穩定狀態作業,請勿刪除這些物件。
如果不需要 CPU 啟動加速功能,可以根據範圍使用下列其中一種方法,只停用加速功能:
- 停用整個工作負載的加速功能:從 VerticalPodAutoscaler 物件規格中刪除
startupBoost區塊,然後將更新後的資訊清單套用至叢集。 停用特定容器的加速功能:如要從 Pod 層級的加速功能排除特定容器,請在
containerPolicies部分下方新增容器政策,並將 CPU 乘數設為 1。startupBoost: cpu: type: "Factor" factor: 1詳情請參閱「設定容器層級的提升」。
- 停用整個工作負載的加速功能:從 VerticalPodAutoscaler 物件規格中刪除