使用 CPU 啟動加速功能加快應用程式啟動速度

本文說明如何在 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 角色:

如要進一步瞭解如何授予角色,請參閱「管理專案、資料夾和組織的存取權」。

您或許也能透過自訂角色或其他預先定義的角色,取得必要權限。

啟用 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
      

      詳情請參閱「設定容器層級的提升」。

後續步驟