設定垂直 pod 自動調度資源功能

本頁面說明如何在 Google Kubernetes Engine 叢集中設定垂直 pod 自動調度資源功能。垂直 pod 自動調度資源功能會調整 Pod 的 CPU 和記憶體要求。

總覽

您可以透過 VerticalPodAutoscaler 自訂資源來分析容器的 CPU 要求記憶體要求,並加以調整。您可以設定 VerticalPodAutoscaler 以提供建議的 CPU 和記憶體要求,或是將其設為可自動變更 CPU 和記憶體要求。

事前準備

如要準備這項工作,請執行下列步驟:

  • 確認您已啟用 Google Kubernetes Engine API。
  • 啟用 Google Kubernetes Engine API
  • 確認您已安裝 Cloud SDK
  • 設定預設的專案 ID
    gcloud config set project [PROJECT_ID]
  • 如果您使用區域叢集,請設定預設的運算區域
    gcloud config set compute/zone [COMPUTE_ZONE]
  • 如果您使用地區叢集,請設定預設的運算地區
    gcloud config set compute/region [COMPUTE_REGION]
  • gcloud 更新到最新版本:
    gcloud components update

API 版本注意事項

本指南假設您已在 Google Kubernetes Engine 叢集中安裝 v1beta2 版的垂直 Pod 自動配置器 API;這項工具自 1.11.8 版開始提供。

我們強烈建議您使用這個 API。如需從舊版 API 遷移的操作說明,請參閱遷移指南

為叢集啟用垂直 pod 自動調度資源功能

如要建立啟用垂直 pod 自動調度資源功能的新叢集,請輸入以下指令:

gcloud beta container clusters create [CLUSTER_NAME] --enable-vertical-pod-autoscaling

其中 [CLUSTER_NAME] 是您為叢集選擇的名稱。

如要為現有叢集啟用垂直 pod 自動調度資源功能,請輸入以下指令:

cloud beta container clusters update [CLUSTER-NAME] --enable-vertical-pod-autoscaling

其中 [CLUSTER_NAME] 是叢集的名稱。

取得資源建議值

在本練習中,您需要建立 updateMode 為「Off」(關閉) 的 VerticalPodAutoscaler。接著,您要建立具有兩個 Pod 的部署,而每個 Pod 中各包含一個容器。Pod 建立完畢後,VerticalPodAutoscaler 就會分析容器的 CPU 和記憶體需求,然後在 status 欄位中記錄這些建議值。VerticalPodAutoscaler 不會採取任何動作來更新執行中容器的資源要求。

以下是 VerticalPodAutoscaler 的資訊清單:

apiVersion: autoscaling.k8s.io/v1beta2
kind: VerticalPodAutoscaler
metadata:
  name: my-rec-vpa
spec:
  targetRef:
    apiVersion: "extensions/v1beta1"
    kind:       Deployment
    name:       my-rec-deployment
  updatePolicy:
    updateMode: "Off"

將資訊清單儲存到名為 my-rec-vpa.yaml 的檔案,然後建立 VerticalPodAutoscaler:

kubectl create -f my-rec-vpa.yaml

以下是部署的資訊清單:

apiVersion: extensions/v1beta1
kind: Deployment
metadata:
  name: my-rec-deployment
spec:
  replicas: 2
  template:
    metadata:
      labels:
        app: my-rec-deployment
    spec:
      containers:
      - name: my-rec-container
        image: nginx

在資訊清單中,您可以看到沒有任何 CPU 或記憶體要求。此外,您也可以看見部署中的 Pod 指向 kind: Deploymentname: my-rec-deployment 的目標,因此這些 Pod 會屬於 VerticalPodAutoscaler。

將資訊清單複製到名為 my-rec-deployment.yaml 的檔案,然後建立部署:

kubectl create -f my-rec-deployment.yaml

請稍候幾分鐘,然後查看 VerticalPodAutoscaler:

kubectl get vpa my-rec-vpa --output yaml

輸出結果會顯示建議的 CPU 和記憶體要求:

...
  recommendation:
    containerRecommendations:
    - containerName: my-rec-container
      lowerBound:
        cpu: 25m
        memory: 262144k
      target:
        cpu: 25m
        memory: 262144k
      upperBound:
        cpu: 7931m
        memory: 8291500k
...

現在您已取得建議的 CPU 和記憶體要求,就可以選擇刪除部署並將 CPU 與記憶體要求新增至部署資訊清單,然後再次啟動部署。

自動更新資源要求

在本練習中,您需要建立有兩個 Pod 的部署,而每個 Pod 各有一個要求 100 milliCPU 和 50 MiB 記憶體的容器。然後,您要建立可自動調整 CPU 和記憶體要求的 VerticalPodAutoscaler。

以下是部署的資訊清單:

apiVersion: extensions/v1beta1
kind: Deployment
metadata:
  name: my-auto-deployment
spec:
  replicas: 2
  template:
    metadata:
      app: my-auto-deployment
    spec:
      containers:
      - name: my-container
        image: k8s.gcr.io/ubuntu-slim:0.1
        resources:
          requests:
            cpu: 100m
            memory: 50Mi
        command: ["/bin/sh"]
        args: ["-c", "while true; do timeout 0.5s yes >/dev/null; sleep 0.5s; done"]

將資訊清單複製到名為 my-deployment.yaml 的檔案,然後建立部署:

kubectl create -f my-deployment.yaml

列出執行中的 Pod:

kubectl get pods

輸出結果會顯示 my-deployment 中的 Pod 名稱:

NAME                            READY     STATUS             RESTARTS   AGE
my-deployment-cbcdd49fb-d6bf9   1/1       Running            0          8s
my-deployment-cbcdd49fb-th288   1/1       Running            0          8s

請記下 Pod 名稱,以供稍候使用。

部署要求的 CPU 和記憶體空間非常小,因此部署可能會因資源增加而受益。

以下是 VerticalPodAutoscaler 的資訊清單:

apiVersion: autoscaling.k8s.io/v1beta2
kind: VerticalPodAutoscaler
metadata:
  name: my-vpa
spec:
  targetRef:
    apiVersion: "extensions/v1beta1"
    kind:       Deployment
    name:       my-deployment
  updatePolicy:
    updateMode: "Auto"

在資訊清單中,targetRef 欄位表示任何由名為 my-deployment 的部署所控管之 Pod 都屬於這個 VerticalPodAutoscaler。

updateMode 欄位的值為 Auto,這表示 VerticalPodAutoscaler 可以在 Pod 的生命週期內更新 CPU 和記憶體要求。也就是說,VerticalPodAutoscaler 可以刪除 Pod 並調整 CPU 和記憶體要求,然後啟動新的 Pod。

將資訊清單複製到名為 my-vpa.yaml 的檔案,然後建立 VerticalPodAutoscaler:

kubectl create -f my-vpa.yaml

請稍候幾分鐘,然後再次查看執行中的 Pod:

kubectl get pods

請注意,Pod 名稱已有所變更。如果 Pod 名稱尚未變更,請耐心等候一段時間,然後再次列出執行中的 Pod。

取得其中一個執行中 Pod 的詳細資訊:

kubectl get pod [POD_NAME] --output yaml

其中 [POD_NAME] 是其中一個 Pod 的名稱。

在輸出結果中,您會看到 VerticalPodAutoscaler 增加了記憶體和 CPU 要求。此外,您也可以看見記錄更新內容的註解:

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
    ...

取得 VerticalPodAutoscaler 的詳細資訊:

kubectl get vpa my-vpa --output yaml

輸出結果會顯示三組建議的 CPU 和記憶體要求,包含下限值、目標值和上限值:

...
  recommendation:
    containerRecommendations:
    - containerName: my-container
      lowerBound:
        cpu: 536m
        memory: 262144k
      target:
        cpu: 587m
        memory: 262144k
      upperBound:
        cpu: 27854m
        memory: "545693548"

target 建議值表示在容器要求 587 milliCPU 和 262144 KB 記憶體的情況下,這個容器可以達到最佳執行效果。

VerticalPodAutoscaler 會透過 lowerBoundupperBound 建議值來判斷是否要刪除 Pod 並替換為新的 Pod。如果 Pod 的要求小於下限值或大於上限值,則 VerticalPodAutoscaler 會刪除這個 Pod,並使用具有目標建議值的 Pod 取而代之。

後續步驟

本頁內容對您是否有任何幫助?請提供意見:

傳送您對下列選項的寶貴意見...

這個網頁
Kubernetes Engine 說明文件