本頁面說明如何使用垂直 Pod 自動調度資源,分析及調整 Google Kubernetes Engine (GKE) 叢集中容器的 CPU 要求和記憶體要求。
您可以透過 Google Cloud 控制台手動調度容器資源、使用 VerticalPodAutoscaler
物件分析資源,或使用直向 Pod 自動調度功能設定自動調度。
事前準備
開始之前,請確認你已完成下列工作:
- 啟用 Google Kubernetes Engine API。 啟用 Google Kubernetes Engine API
- 如要使用 Google Cloud CLI 執行這項工作,請安裝並初始化 gcloud CLI。如果您先前已安裝 gcloud CLI,請執行
gcloud components update
,取得最新版本。
分析資源要求
垂直 Pod 自動調度器會自動分析容器,並提供建議的資源要求。您可以使用Google Cloud 控制台、Cloud Monitoring 或 Google Cloud CLI 查看這些資源要求。
控制台
如要在 Google Cloud 控制台中查看建議的資源要求,您必須部署至少 24 小時的工作負載。部分建議可能不適用於特定工作負載或與其無關,例如過去 24 小時內建立的工作負載、獨立的 Pod 和以 Java 編寫的應用程式。
前往 Google Cloud 控制台的「Workloads」(工作負載) 頁面。
在工作負載清單中,按一下要調整規模的工作負載名稱。
依序點選 list「動作」>「調度資源」>「編輯資源要求」。
「分析資源用量資料」部分會顯示歷史用量資料,垂直 Pod 自動調度控制器會分析這些資料,並在「調整資源要求和限制」部分中,提供建議的資源要求。
Cloud Monitoring
如要在 Cloud Monitoring 中查看建議的資源要求,您必須先部署現有工作負載。
前往 Google Cloud 控制台的「Metrics Explorer」頁面。
按一下「設定」。
展開「選取指標」選單。
在「Resource」(資源) 選單中,選取「Kubernetes Scale」(Kubernetes 規模)。
在「指標類別」選單中,選取「自動調度器」。
在「指標」選單中,選取「建議每個副本要求位元組」和「建議每個副本要求核心」。
按一下 [套用]。
gcloud CLI
如要查看建議的資源要求,您必須建立 VerticalPodAutoscaler
物件和 Deployment。
如果是 Standard 叢集,請為叢集啟用垂直 Pod 自動調度資源功能。如為 Autopilot 叢集,垂直 Pod 自動調度資源功能預設為啟用。
gcloud container clusters update CLUSTER_NAME --enable-vertical-pod-autoscaling
將
CLUSTER_NAME
替換為叢集名稱。將下列資訊清單儲存為
my-rec-deployment.yaml
:apiVersion: apps/v1 kind: Deployment metadata: name: my-rec-deployment spec: replicas: 2 selector: matchLabels: app: my-rec-deployment template: metadata: labels: app: my-rec-deployment spec: containers: - name: my-rec-container image: nginx
此資訊清單描述的
Deployment
沒有 CPU 或記憶體要求。my-rec-deployment
的containers.name
值指定 Deployment 中的所有 Pod 都屬於VerticalPodAutoscaler
。將資訊清單套用至叢集:
kubectl create -f my-rec-deployment.yaml
將下列資訊清單儲存為
my-rec-vpa.yaml
:apiVersion: autoscaling.k8s.io/v1 kind: VerticalPodAutoscaler metadata: name: my-rec-vpa spec: targetRef: apiVersion: "apps/v1" kind: Deployment name: my-rec-deployment updatePolicy: updateMode: "Off"
這個資訊清單說明
VerticalPodAutoscaler
。Off
的updateMode
值表示在建立 Pod 時,垂直 Pod 自動調度資源控制器會分析容器的 CPU 和記憶體需求,並在資源的status
欄位中記錄這些建議。Vertical Pod Autoscaler 控制器不會自動更新執行中容器的資源要求。將資訊清單套用至叢集:
kubectl create -f my-rec-vpa.yaml
過一段時間後,請查看
VerticalPodAutoscaler
:kubectl get vpa my-rec-vpa --output yaml
輸出結果會與下列內容相似:
... recommendation: containerRecommendations: - containerName: my-rec-container lowerBound: cpu: 25m memory: 262144k target: cpu: 25m memory: 262144k upperBound: cpu: 7931m memory: 8291500k ...
輸出內容會顯示建議的 CPU 和記憶體要求。
手動設定 Pod 資源要求
您可以使用 Google Cloud 主控台 或 kubectl 手動設定 Pod 資源要求。設定容器資源要求和限制時,請採用下列最佳做法:
- 記憶體:將要求和限制設為相同的記憶體量。
- CPU:根據您自己的 SLO,為要求指定確保正確運作所需的最低 CPU。設定無上限的 CPU 限制。
控制台
前往 Google Cloud 控制台的「Workloads」(工作負載) 頁面。
在工作負載清單中,按一下要調整規模的工作負載名稱。
依序點選 list「動作」>「調度資源」>「編輯資源要求」。
- 「調整資源要求和限制」部分會顯示每個容器目前的 CPU 和記憶體要求,以及建議的 CPU 和記憶體要求。
按一下「套用最新建議」,即可查看每個容器的建議要求。
按一下 [儲存變更]。
按一下「確認」。
kubectl
盡可能減少服務中斷情形,垂直擴充工作負載
從 Kubernetes 1.33 版開始,您可以使用 kubectl patch
指令更新指派給容器的資源,垂直擴充工作負載,不必重新建立 Pod。如需更多資訊 (包括限制),請參閱 Kubernetes 說明文件,瞭解如何調整 CPU 和記憶體資源大小。
如要使用 kubectl patch
指令,請在 --patch
標記下方指定更新後的資源要求。舉例來說,如要將 my-app
擴展至 800 mCPU,請執行下列指令:
kubectl patch pod my-app --subresource resize --patch \
'{"spec":{"containers":[{"name":"pause", "resources":{"requests":{"cpu":"800m"}, "limits":{"cpu":"800m"}}}]}}'
垂直調度工作負載資源
如要為 Pod 設定資源要求,請在 Deployment 資訊清單中設定 requests.cpu 和 memory.cpu 值。在本範例中,您會使用建議的資源要求,手動修改在「分析資源要求」中建立的 Deployment。
將下列範例資訊清單儲存為
my-adjusted-deployment.yaml
:apiVersion: apps/v1 kind: Deployment metadata: name: my-rec-deployment spec: replicas: 2 selector: matchLabels: app: my-rec-deployment template: metadata: labels: app: my-rec-deployment spec: containers: - name: my-rec-container image: nginx resources: requests: cpu: 25m memory: 256Mi
這個資訊清單說明含有兩個 Pod 的部署。每個 Pod 各有一個要求 25 milliCPU 和 256 MiB 記憶體的容器。
將資訊清單套用至叢集:
kubectl apply -f my-adjusted-deployment.yaml
自動設定 Pod 資源要求
當 updateMode
為 Auto
時,垂直自動調度 Pod 資源功能會使用 VerticalPodAutoscaler
物件,自動在 Pod 上設定資源要求。您可以使用 gcloud CLI 或Google Cloud 控制台設定 VerticalPodAutoscaler
。
控制台
如要自動設定資源要求,您必須擁有已啟用垂直 Pod 自動調度資源功能的叢集。Autopilot 叢集預設會啟用垂直 Pod 自動調度資源功能。
啟用垂直自動調度 Pod 資源功能
前往 Google Cloud 控制台的「Google Kubernetes Engine」頁面。
在叢集清單中,按一下您要修改的叢集名稱。
在「Automation」(自動化) 區段中,找到「Vertical Pod Autoscaling」(垂直自動調度 Pod 資源) 選項,然後按一下 edit「Edit」(編輯)。
勾選「Enable Vertical Pod Autoscaling」(啟用垂直自動調度 Pod 資源功能) 核取方塊。
按一下 [儲存變更]。
設定垂直 Pod 自動調度資源
前往 Google Cloud 控制台的「Workloads」(工作負載) 頁面。
在工作負載清單中,按一下要設定 Pod 垂直自動調度功能的 Deployment 名稱。
依序點選 list「動作」>「自動調度資源」>「垂直自動調度 Pod 資源」。
選擇自動調度資源模式:
- 自動模式:垂直自動調度 Pod 資源功能會在 Pod 的生命週期內更新 CPU 和記憶體要求。
- 初始模式:垂直 Pod 自動調度資源功能只會在建立 Pod 時指派資源要求,之後不會再變更。
(選用) 設定容器政策。這個選項可確保建議值不會高於或低於指定的資源要求。
- 按一下「新增政策」expand_more。
- 選取「編輯容器模式」的「自動」。
- 在「受控資源」中,選取要自動調整容器大小的資源。
- 按一下「新增規則」,為容器的資源要求設定一或多個上下限範圍:
- 允許的記憶體下限:容器應一律擁有的記憶體下限,以 MiB 為單位。
- 允許的 CPU 下限:容器應一律擁有的 CPU 數量下限,以 mCPU 為單位。
- 允許的最大記憶體:容器應一律擁有的最大記憶體量,以 MiB 為單位。
- 允許的 CPU 上限:容器應一律擁有的 CPU 數量上限,以 mCPU 為單位。
按一下 [完成]。
按一下 [儲存]。
gcloud
如要自動設定資源要求,您必須使用已啟用垂直 Pod 自動調度資源功能的叢集。Autopilot 叢集預設會啟用這項功能。
如果是標準叢集,請為叢集啟用垂直 Pod 自動調度資源功能:
gcloud container clusters update CLUSTER_NAME --enable-vertical-pod-autoscaling
將
CLUSTER_NAME
替換為叢集名稱。將下列資訊清單儲存為
my-auto-deployment.yaml
:apiVersion: apps/v1 kind: Deployment metadata: name: my-auto-deployment spec: replicas: 2 selector: matchLabels: app: my-auto-deployment template: metadata: labels: app: my-auto-deployment spec: containers: - name: my-container image: registry.k8s.io/ubuntu-slim:0.14 resources: requests: cpu: 100m memory: 50Mi command: ["/bin/sh"] args: ["-c", "while true; do timeout 0.5s yes >/dev/null; sleep 0.5s; done"]
這個資訊清單說明含有兩個 Pod 的部署。每個 Pod 各有一個要求 100 milliCPU 和 50 MiB 記憶體的容器。
將資訊清單套用至叢集:
kubectl create -f my-auto-deployment.yaml
列出執行中的 Pod:
kubectl get pods
輸出結果會顯示
my-deployment
中的 Pod 名稱:NAME READY STATUS RESTARTS AGE my-auto-deployment-cbcdd49fb-d6bf9 1/1 Running 0 8s my-auto-deployment-cbcdd49fb-th288 1/1 Running 0 8s
將下列資訊清單儲存為
my-vpa.yaml
:apiVersion: autoscaling.k8s.io/v1 kind: VerticalPodAutoscaler metadata: name: my-vpa spec: targetRef: apiVersion: "apps/v1" kind: Deployment name: my-auto-deployment updatePolicy: updateMode: "Auto"
這份資訊清單說明具有下列屬性的
VerticalPodAutoscaler
:targetRef.name
:指定任何由名為my-deployment
的部署所控管之 Pod,都屬於這個VerticalPodAutoscaler
。updateMode: Auto
:指定垂直 Pod 自動調度資源控制器可以刪除 Pod、調整 CPU 和記憶體要求,然後啟動新的 Pod。
您也可以使用
updateMode: "Initial"
設定垂直 Pod 自動調度資源功能,只在建立 Pod 時指派資源要求。將資訊清單套用至叢集:
kubectl create -f my-vpa.yaml
請稍候幾分鐘,然後再次查看執行中的 Pod:
kubectl get pods
輸出結果會顯示 Pod 名稱已變更:
NAME READY STATUS RESTARTS AGE my-auto-deployment-89dc45f48-5bzqp 1/1 Running 0 8s my-auto-deployment-89dc45f48-scm66 1/1 Running 0 8s
如果 Pod 名稱尚未變更,請耐心等候一段時間,然後再次查看執行中的 Pod。
查看垂直 Pod 自動調度器相關資訊
如要查看垂直 Pod 自動調度器詳細資料,請執行下列操作:
取得其中一個執行中 Pod 的詳細資訊:
kubectl get pod POD_NAME --output yaml
將
POD_NAME
替換為您在上一個步驟中擷取的其中一個 Pod 名稱。輸出結果會與下列內容相似:
apiVersion: v1 kind: Pod metadata: annotations: vpaUpdates: 'Pod resources updated by my-vpa: container 0: cpu capped to node capacity, memory capped to node capacity, cpu request, memory request' ... spec: containers: ... resources: requests: cpu: 510m memory: 262144k ...
這項輸出內容顯示 Vertical Pod Autoscaler 控制器的記憶體要求為 262144k,CPU 要求為 510 milliCPU。
取得「
VerticalPodAutoscaler
」的詳細資訊:kubectl get vpa my-vpa --output yaml
輸出結果會與下列內容相似:
... recommendation: containerRecommendations: - containerName: my-container lowerBound: cpu: 536m memory: 262144k target: cpu: 587m memory: 262144k upperBound: cpu: 27854m memory: "545693548"
這項輸出結果會顯示建議的 CPU 和記憶體要求,並包含下列屬性:
target
:指定容器應要求 587 milliCPU 和 262144 KB 記憶體,才能達到最佳執行效果。lowerBound
和upperBound
:垂直 Pod 自動調度資源功能會使用這些屬性,判斷是否要刪除 Pod 並替換為新的 Pod。如果 Pod 的要求小於下限值或大於上限值,則垂直 Pod 自動配置器會刪除這個 Pod,並使用符合目標屬性的 Pod 取而代之。
選擇不顯示特定容器
您可以使用 gcloud CLI 或 Google Cloud 控制台,停用特定容器的垂直 Pod 自動調度功能。
控制台
如要停用特定容器的垂直 Pod 自動調度資源功能,您必須擁有已啟用垂直 Pod 自動調度資源功能的叢集。Autopilot 叢集預設會啟用垂直 Pod 自動調度資源功能。
啟用垂直自動調度 Pod 資源功能
前往 Google Cloud 控制台的「Google Kubernetes Engine」頁面。
在叢集清單中,按一下您要修改的叢集名稱。
在「Automation」(自動化) 區段中,找到「Vertical Pod Autoscaling」(垂直自動調度 Pod 資源) 選項,然後按一下 edit「Edit」(編輯)。
勾選「Enable Vertical Pod Autoscaling」(啟用垂直自動調度 Pod 資源功能) 核取方塊。
按一下 [儲存變更]。
設定垂直 Pod 自動調度資源
前往 Google Cloud 控制台的「Workloads」(工作負載) 頁面。
在工作負載清單中,按一下要設定垂直 Pod 自動調度功能的 Deployment 名稱。
依序點選 list「動作」>「自動調度資源」>「垂直自動調度 Pod 資源」。
選擇自動調度資源模式:
- 自動模式:垂直自動調度 Pod 資源功能會在 Pod 的生命週期內更新 CPU 和記憶體要求。
- 初始模式:垂直 Pod 自動調度資源功能只會在建立 Pod 時指派資源要求,之後不會再變更。
按一下「新增政策」expand_more。
選取要停用的容器。
在「Edit container mode」(編輯容器模式) 中選取「Off」(關閉)。
按一下 [完成]。
按一下 [儲存]。
gcloud
如要停用特定容器的垂直 Pod 自動調度資源功能,請執行下列步驟:
將下列資訊清單儲存為
my-opt-vpa.yaml
:apiVersion: autoscaling.k8s.io/v1 kind: VerticalPodAutoscaler metadata: name: my-opt-vpa spec: targetRef: apiVersion: "apps/v1" kind: Deployment name: my-opt-deployment updatePolicy: updateMode: "Auto" resourcePolicy: containerPolicies: - containerName: my-opt-sidecar mode: "Off"
這個資訊清單說明
VerticalPodAutoscaler
。mode: "Off"
值會關閉容器my-opt-sidecar
的建議。將資訊清單套用至叢集:
kubectl apply -f my-opt-vpa.yaml
將下列資訊清單儲存為
my-opt-deployment.yaml
:apiVersion: apps/v1 kind: Deployment metadata: name: my-opt-deployment spec: replicas: 1 selector: matchLabels: app: my-opt-deployment template: metadata: labels: app: my-opt-deployment spec: containers: - name: my-opt-container image: nginx - name: my-opt-sidecar image: busybox command: ["sh","-c","while true; do echo Doing sidecar stuff!; sleep 60; done"]
將資訊清單套用至叢集:
kubectl apply -f my-opt-deployment.yaml
過一段時間後,查看垂直 Pod 自動配置器:
kubectl get vpa my-opt-vpa --output yaml
輸出結果會顯示建議的 CPU 和記憶體要求:
... recommendation: containerRecommendations: - containerName: my-opt-container ...
在這個輸出內容中,只有一個容器的建議。找不到適合「
my-opt-sidecar
」的建議。垂直 Pod 自動調度器絕不會更新已停用容器的資源。稍待幾分鐘後,Pod 會重新建立,但只有一個容器更新了資源要求。
找出沒有資源要求或限制的工作負載
您可能想找出未設定資源要求和限制的工作負載,因為 GKE 建議為所有工作負載設定資源要求和限制,這是最佳做法,可避免節點資源壓力過大時 Pod 突然終止,並提高費用分配準確率。定義 BestEffort Pod 或具有 Burstable 記憶體的 Pod,可能會在節點受到記憶體壓力時導致可靠性問題。設定容器資源要求和限制時,請採用下列最佳做法:
- 記憶體:將要求和限制設為相同的記憶體量。
- CPU:根據您自己的 SLO,為要求指定確保正確運作所需的最低 CPU。設定無上限的 CPU 限制。
GKE 會針對未設定資源要求和限制的工作負載,產生深入分析資訊和建議。
下表說明 GKE 偵測到的資源設定情境,以及各情境的條件。
洞察子類型 | 缺少設定情境 | 詳細資料 |
---|---|---|
REQUEST_OR_LIMIT_NOT_SET |
未設定記憶體要求和限制。
(MEMORY_REQUEST_AND_LIMIT_NOT_SET )
|
Pod 正在運作,容器沒有記憶體要求,也未設有限制。GKE 無法限制記憶體用量。如果節點受到記憶體壓力,可能會突然終止這類 Pod,這可能會產生可靠性問題。 |
REQUEST_OR_LIMIT_NOT_SET |
未設定記憶體限制。
(MEMORY_LIMIT_NOT_SET )
|
Pod 正在運作,容器未設有記憶體限制。 如果節點受到記憶體壓力,且 Pod 的記憶體用量超過要求,GKE 就無法限制記憶體用量,可能會突然終止這類 Pod,進而導致可靠性問題。您應為要求和限制設定相同大小的記憶體,以免 Pod 使用的記憶體超出要求大小。 |
REQUEST_OR_LIMIT_NOT_SET |
未設定 CPU 要求和限制。
(CPU_REQUEST_AND_LIMIT_NOT_SET )
|
Pod 正在運作,容器未設有 CPU 要求與限制。 這會提高節點資源耗盡的可能性,當節點 CPU 使用率接近上限時,Pod 較有可能受到限制,並可能導致效能問題。 |
如要進一步瞭解這些洞察資料,請按照操作說明查看洞察資料和建議。
手動檢查資源要求和限制
您可能需要手動檢查缺少哪些資源要求和限制,並為特定工作負載指定這些項目,以便根據建議更新設定。
如要查看或更新特定工作負載的資源要求和限制設定,請按照下列步驟操作:
前往 Google Cloud 控制台的「Workloads」(工作負載) 頁面。
在工作負載清單中,按一下要檢查的工作負載名稱。
依序點選 list「動作」>「調度資源」>「編輯資源要求」。
- 「調整資源要求和限制」部分會顯示每個容器目前的 CPU 和記憶體要求。