本文說明如何搭配使用 HPA 適當調整功能、垂直自動調度 Pod 資源 (VPA) 和水平自動調度 Pod 資源 (HPA),在 Google Kubernetes Engine (GKE) 擴充工作負載副本時,自動最佳化容器 CPU 要求和限制。
一般來說,如果同時使用水平 Pod 自動配置器 (HPA) 和垂直 Pod 自動配置器 (VPA) 處理同一項指標 (例如 CPU),會產生資源調度衝突。發生這項衝突的原因是,VPA 設定 Pod CPU 要求時,會變更 HPA 設定的使用量基準,這可能會導致非預期的調度資源行為和過度佈建。
透過 VPA 調整 HPA 大小,可讓兩個自動配置器在同一個工作負載上協同運作。HPA 會繼續透過調整 Pod 副本數量,處理短期流量高峰。同時,VPA 會使用最適規模邏輯,考量工作負載在一段時間內的匯總歷來資源需求。這項功能會考量 HPA 設定 (例如副本數量下限、副本數量上限和目標 CPU 使用率),調整容器 CPU 要求,確保工作負載在流量低時符合成本效益,在需求高時保持彈性。
資源處理和規模限制
設定 HPA 適當調整功能時,請考量下列需求和限制:
- 資源規模調整計算僅適用於 CPU。如果您在 VPA 設定中加入記憶體,VPA 會使用標準 VPA 邏輯調整記憶體要求和限制。
- HPA 適當調整功能支援具有一個主要容器的 Pod。如果 Pod 也執行 Sidecar,則與主要容器相比,Sidecar 的 CPU 使用率必須微不足道,而且您必須在容器政策中設定
mode: "Off",將 Sidecar 從 VPA 中排除。HPA 必須使用Resource指標類型來表示 CPU;ContainerResource指標類型僅支援具有單一容器的 Pod。 - 在單一叢集中,您最多可以為所有工作負載中的 60,000 個容器設定 HPA 適當調整功能。
- 單一 VerticalPodAutoscaler 最多可指定 1,000 個容器。
- VPA 只會針對容器層級的資源要求和限制 (
spec.containers[].resources) 產生建議並套用更新。垂直自動調度 Pod 資源不支援Pod 層級資源規格 (spec.resources)。
事前準備
- 登入 Google Cloud 帳戶。如果您未曾使用過 Google Cloud,歡迎 建立帳戶,親自體驗實際使用我們產品的成效。新客戶還能獲得價值 $300 美元的免費抵免額,用於執行、測試及部署工作負載。
-
安裝 Google Cloud CLI。
-
若您採用的是外部識別資訊提供者 (IdP),請先 使用聯合身分登入 gcloud CLI。
-
執行下列指令,初始化 gcloud CLI:
gcloud init -
選取或建立專案所需的角色
- 選取專案:選取專案時不需要特定 IAM 角色,只要您獲派某個專案的角色,即可選取該專案。
-
建立專案:如要建立專案,您必須具備專案建立者角色 (
roles/resourcemanager.projectCreator),其中包含resourcemanager.projects.create權限。瞭解如何授予角色。
-
建立 Google Cloud 專案:
gcloud projects create PROJECT_ID
將
PROJECT_ID替換為您要建立的 Google Cloud 專案名稱。 -
選取您建立的 Google Cloud 專案:
gcloud config set project PROJECT_ID
將
PROJECT_ID替換為 Google Cloud 專案名稱。
啟用 Google Kubernetes Engine API (如果尚未啟用):
啟用 API 所需的角色
您必須具備
serviceusage.services.enable權限,才能啟用 API。如果您建立了專案,可能已透過「擁有者」角色 (roles/owner) 取得這項權限。否則,您可以透過「Service Usage 管理員」角色 (roles/serviceusage.serviceUsageAdmin) 取得這項權限。瞭解如何授予角色。gcloud services enable container.googleapis.com
-
安裝 Google Cloud CLI。
-
若您採用的是外部識別資訊提供者 (IdP),請先 使用聯合身分登入 gcloud CLI。
-
執行下列指令,初始化 gcloud CLI:
gcloud init -
選取或建立專案所需的角色
- 選取專案:選取專案時不需要特定 IAM 角色,只要您獲派某個專案的角色,即可選取該專案。
-
建立專案:如要建立專案,您必須具備專案建立者角色 (
roles/resourcemanager.projectCreator),其中包含resourcemanager.projects.create權限。瞭解如何授予角色。
-
建立 Google Cloud 專案:
gcloud projects create PROJECT_ID
將
PROJECT_ID替換為您要建立的 Google Cloud 專案名稱。 -
選取您建立的 Google Cloud 專案:
gcloud config set project PROJECT_ID
將
PROJECT_ID替換為 Google Cloud 專案名稱。
啟用 Google Kubernetes Engine API (如果尚未啟用):
啟用 API 所需的角色
您必須具備
serviceusage.services.enable權限,才能啟用 API。如果您建立了專案,可能已透過「擁有者」角色 (roles/owner) 取得這項權限。否則,您可以透過「Service Usage 管理員」角色 (roles/serviceusage.serviceUsageAdmin) 取得這項權限。瞭解如何授予角色。gcloud services enable container.googleapis.com
-
將角色授予使用者帳戶。針對下列各個 IAM 角色執行下列指令一次:
roles/container.admin, roles/container.developergcloud projects add-iam-policy-binding PROJECT_ID --member="user:USER_IDENTIFIER" --role=ROLE
更改下列內容:
PROJECT_ID:專案 ID。USER_IDENTIFIER:使用者帳戶 ID。 例如:myemail@example.com。ROLE:授予使用者帳戶的 IAM 角色。
- 確認叢集執行的是 GKE
1.36.3-gke.1630000以上版本。 -
確認叢集已啟用垂直自動調度 Pod 資源功能。Autopilot 叢集預設會啟用垂直自動調度 Pod 資源功能。如要建立新的 Autopilot 叢集,請參閱「建立 Autopilot 叢集」。
如果您使用的是 Standard 叢集,請執行下列任一指令,啟用垂直自動調度 Pod 資源功能:
- 如要建立已啟用垂直自動調度 Pod 資源功能的新 Standard 叢集,請執行下列指令:
gcloud container clusters create CLUSTER_NAME \ --enable-vertical-pod-autoscaling \ --location=LOCATION
- 如要在現有的 Standard 叢集啟用垂直自動調度 Pod 資源功能,請執行下列指令:
gcloud container clusters update CLUSTER_NAME \ --enable-vertical-pod-autoscaling \ --location=LOCATION
更改下列內容:
CLUSTER_NAME:叢集名稱。LOCATION:叢集的 Compute Engine 區域或可用區,例如us-central1-a。
- 如要建立已啟用垂直自動調度 Pod 資源功能的新 Standard 叢集,請執行下列指令:
使用 HPA 和 VPA 適當調整功能部署工作負載
如要使用 VPA 設定 HPA 適當調整功能,請部署工作負載、建立指定 CPU 使用率的 HorizontalPodAutoscaler,並使用適當調整政策註解設定 VerticalPodAutoscaler。
如要讓垂直 Pod 自動配置器有時間收集用量資料,並在不修改執行中 Pod 的情況下建立準確的建議,請採用分階段部署方法:
- 部署工作負載並設定 HPA。
- 部署 VerticalPodAutoscaler,並將
updateMode欄位設為"Off",即可查看建議。如果是新的工作負載或非正式環境重要工作負載,可以略過這個步驟。 - 觀察幾天後,請將
updateMode欄位更新為"InPlaceOrRecreate"或"Recreate",啟用自動調整大小功能。VPA 會在幾分鐘內產生初步建議,但建議觀察至少 24 小時到幾天,讓 VPA 擷取完整的流量週期。
部署範例工作負載和 HPA
將下列 Deployment 資訊清單範例儲存為
sample-app.yaml:apiVersion: apps/v1 kind: Deployment metadata: name: sample-app spec: replicas: 2 selector: matchLabels: app: sample-app template: metadata: labels: app: sample-app spec: containers: - name: sample-app image: nginx resources: requests: cpu: 250m memory: 256Mi執行下列指令,將資訊清單套用至叢集:
kubectl apply -f sample-app.yaml將下列 HorizontalPodAutoscaler 資訊清單儲存為
sample-app-hpa.yaml:apiVersion: autoscaling/v2 kind: HorizontalPodAutoscaler metadata: name: sample-app-hpa spec: scaleTargetRef: apiVersion: apps/v1 kind: Deployment name: sample-app minReplicas: 2 maxReplicas: 10 metrics: - type: Resource resource: name: cpu target: type: Utilization averageUtilization: 70執行下列指令,將 HPA 資訊清單套用至叢集:
kubectl apply -f sample-app-hpa.yaml
在關閉模式下觀察建議
如要讓 VerticalPodAutoscaler 物件分析歷來資源需求並產生建議,但不調整 Pod 大小,請以「Off」模式部署。如果是新的工作負載或非正式環境關鍵工作負載,您可以略過本節,改為部署 VerticalPodAutoscaler,並將 updateMode 欄位設為 "InPlaceOrRecreate" 或 "Recreate"。
將下列資訊清單儲存為
sample-app-vpa.yaml:apiVersion: autoscaling.k8s.io/v1 kind: VerticalPodAutoscaler metadata: name: sample-app-vpa annotations: gke.io/autoscaling-hpa-rightsizing-mode: "gke-hpa-rightsizing-mode-policy" spec: targetRef: apiVersion: apps/v1 kind: Deployment name: sample-app updatePolicy: updateMode: "Off" resourcePolicy: containerPolicies: - containerName: sample-app controlledResources: ["cpu", "memory"] minAllowed: cpu: 100m memory: 200Mi maxAllowed: cpu: 1000m memory: 1024Mi這個資訊清單會設定下列重要設定:
metadata.annotations欄位:包含gke.io/autoscaling-hpa-rightsizing-mode: "gke-hpa-rightsizing-mode-policy",可啟用 HPA 適當調整功能。spec.updatePolicy.updateMode欄位:設為"Off",即可產生建議,而不更新容器資源要求。spec.resourcePolicy.containerPolicies[].controlledResources欄位:指定"cpu"(以及非必要的"memory")。spec.resourcePolicy.containerPolicies[].minAllowed和maxAllowed欄位:定義邊界限制,防止 VPA 調整容器大小時超出所選資源限制。
執行下列指令,套用 VPA 資訊清單:
kubectl apply -f sample-app-vpa.yaml讓工作負載在一般流量模式下執行幾天,以便 VPA 收集足夠的指標,產生高可信度的建議。部署 VerticalPodAutoscaler 後,VPA 會在幾分鐘內產生初始建議,並在收集工作負載流量週期的指標時,進一步調整建議。
啟用自動調整大小功能
查看建議並確認符合應用程式需求後,請啟用自動調整大小功能。
在
sample-app-vpa.yaml中,將spec.updatePolicy.updateMode欄位更新為"InPlaceOrRecreate":# ...other fields omitted for clarity... spec: updatePolicy: updateMode: "InPlaceOrRecreate""InPlaceOrRecreate"模式會更新 CPU 要求,不會中斷 Pod 運作,也不必重新啟動 Pod。如果工作負載也會管理記憶體,且應用程式執行階段需要重新啟動才能套用記憶體變更,請在容器規格中新增resizePolicy(restartPolicy: RestartContainer代表記憶體)。或者,您也可以將updateMode: "Recreate"設為在每次資源更新時重新建立 Pod。執行下列指令,套用更新後的資訊清單:
kubectl apply -f sample-app-vpa.yaml
VPA 會根據工作負載需求,自動將容器的 CPU 要求調整至最佳層級,而 HPA 則會繼續動態調度副本數量。
調整多容器工作負載
如果工作負載在每個 Pod 中執行多個容器 (例如主要應用程式容器和一或多個 sidecar),HPA 會評估整個 Pod 的 CPU 使用率,而 VPA 只會調整主要容器的大小。如要讓 HPA 適當調整大小功能正常運作,HPA 測量的 Pod CPU 使用率必須與 VPA 調整大小的主要容器 CPU 使用率相符。為符合這項要求,請按照下列方式設定工作負載:
- 與主要容器相比,sidecar 的 CPU 使用率應保持在極低水準,以免影響 HPA 評估的 Pod 使用率。只有在 sidecar 的 CPU 用量微不足道時,HPA 適當調整大小功能才支援 sidecar。
- 在 HPA 中,請使用
Resource指標類型做為 CPU,如「部署範例工作負載和 HPA」所示。如果 Pod 有多個容器,HPA 適當調整功能不支援ContainerResource指標類型。如果 HPA 使用ContainerResource,且 Pod 有多個容器,VPA 就不會為工作負載產生 CPU 建議。 將 VPA 限制在主要容器。如要防止 VPA 評估 sidecar,請將
spec.resourcePolicy.containerPolicies中每個 sidecar 的mode欄位設為"Off":resourcePolicy: containerPolicies: - containerName: PRIMARY_CONTAINER_NAME controlledResources: ["cpu"] - containerName: SIDECAR_CONTAINER_NAME mode: "Off"更改下列內容:
PRIMARY_CONTAINER_NAME:主要應用程式容器的名稱。SIDECAR_CONTAINER_NAME:要從適當調整作業中排除的邊車容器名稱。為每個 sidecar 新增一個項目。
驗證建議
執行下列指令,檢查 VPA 產生的建議:
kubectl describe vpa VPA_NAME
將 VPA_NAME 替換為 VerticalPodAutoscaler 的名稱,例如 sample-app-vpa。
輸出內容會包含「Recommendation」部分,如下所示:
Recommendation:
Container Recommendations:
Container Name: sample-app
Lower Bound:
Cpu: 100m
Memory: 200Mi
Target:
Cpu: 350m
Memory: 256Mi
Uncapped Target:
Cpu: 350m
Memory: 256Mi
Upper Bound:
Cpu: 1
Memory: 1024Mi
在輸出內容中,找出下列欄位:
Target:啟用自動更新時,VPA 套用的建議 CPU 和記憶體要求。Lower Bound:VPA 計算出的資源要求建議下限。Upper Bound:VPA 計算出的資源要求建議值上限。Uncapped Target:VPA 在套用minAllowed或maxAllowed限制前計算出的原始建議。
如需更詳細的診斷記錄,您可以在 Cloud Logging 中查看 VPA 決策記錄。如需操作說明,請參閱「查看垂直自動調度 Pod 資源事件和決策記錄」。
最佳做法和注意事項
搭配使用 VPA 和 HPA 適當調整功能時,請考量下列最佳做法:
- 如果您使用 Argo CD 等持續推送軟體更新工具,該工具可能會嘗試將 VPA 對資源所做的變更還原為資訊清單值。部分工具支援設定,可忽略這類變更,例如 Argo CD 具有
ignoreDifferences屬性。 - 如果工作負載在初始啟動期間會出現 CPU 尖峰 (例如 Java 應用程式),您可以結合最適化建議和 VPA CPU 啟動提升功能,在啟動期間暫時分配額外的 CPU,而不影響穩態最適化建議計算。
- 如果 Pod 含有 sidecar,請在 HPA 使用
Resource指標類型,並將 sidecar CPU 用量維持在可忽略的程度。詳情請參閱「調整多容器工作負載的大小」。 - 如要停用工作負載的 HPA 適當調整功能,請刪除 VerticalPodAutoscaler,或將
spec.updatePolicy.updateMode欄位設為"Off"。請勿只移除gke.io/autoscaling-hpa-rightsizing-mode註解,而將updateMode欄位設為"InPlaceOrRecreate"或"Recreate"。如果只移除註解,VPA 會還原為標準 VPA 行為,這可能會導致 HPA 和 VPA 競爭,並造成調度資源不穩定。
後續步驟
- 進一步瞭解水平 Pod 自動配置器概念。
- 進一步瞭解垂直 Pod 自動配置器概念。
- 瞭解如何查看垂直自動調度 Pod 資源事件和決策記錄。