使用自訂指標自動調整部署規模

本教學課程示範如何依據 Kubernetes Pod 匯出到 Stackdriver 的自訂指標,自動調整 GKE 工作負載的資源配置。如要瞭解如何依據 Stackdriver 中的其他可用指標,自動調整工作負載的資源配置,請造訪使用外部指標自動調整部署規模

目標

若要在 GKE 中使用自訂指標設定自動調度資源,您必須:

  1. 部署自訂指標 Stackdriver 轉接器。
  2. 將自訂指標匯出至 Stackdriver。
  3. 部署 HorizontalPodAutoscaler (HPA) 資源,以依據自訂指標調整部署的資源配置。

事前準備

請依照下列步驟啟用 Kubernetes Engine API:
  1. 造訪 Google Cloud Platform 主控台的 Kubernetes Engine 頁面
  2. 建立或選取專案。
  3. 等待 API 和相關服務完成啟用。這可能需要幾分鐘的時間。
  4. 請確認您已啟用 Google Cloud Platform 專案的計費功能。

    瞭解如何啟用計費功能

請安裝下列指令列工具,我們將在本教學課程中使用這些工具:

  • gcloud 可用來建立和刪除 Kubernetes Engine 叢集。gcloud 包含於 Google Cloud SDK 中。
  • kubectl 可用於管理 Kubernetes,這是 Kubernetes Engine 使用的叢集自動化調度管理系統。您可以使用 gcloud 來安裝 kubectl
    gcloud components install kubectl

設定 gcloud 指令列工具的預設設定

為了節省您在 gcloud 指令列工具中輸入專案 IDCompute Engine zone 選項的時間,建議您採用以下預設設定:
gcloud config set project [PROJECT_ID]
gcloud config set compute/zone us-central1-b

建立叢集及設定監控

選擇自訂指標

使用自訂指標自動調度資源的方法有兩種:

  • 您可以從部署中的每個 Pod 匯出一個自訂指標,然後指定每個 Pod 的平均值。
  • 您可以從部署以外的單一 Pod 匯出一個自訂指標,然後指定總值。

在指定的限制範圍內,部署可依據指標值來調整複製的 Pod 資源配置。您應一律定義具有總目標值的指標,這樣資源調度就能將指標值調整到更接近目標值。

例如,請考慮將每秒查詢數指標做為前端應用程式資源配置的依據。當指標值增加時,應隨著調高 Pod 的數量,讓每個 Pod 所處理的流量大小與之前類似。匯出每個 Pod 的每秒查詢數值並設定所需的目標平均值,可用來產生想要的行為。但在此情況下,針對這個指標匯出每秒查詢數的總數及設定總目標值,並不會產生想要的行為,因為增加 Pod 數量並不會減少總流量。

其他指標 (例如,平均要求延遲時間) 可以直接與總目標值一起使用,視用途調整部署的資源配置。

步驟 1:部署自訂指標 Stackdriver 轉接器

若要授予 GKE 物件權限以存取儲存在 Stackdriver 中的指標,您必須部署自訂指標 Stackdriver 轉接器。若要執行自訂指標轉接器,您必須執行下列指令以授予使用者權限,使其能夠建立必要的授權角色:

kubectl create clusterrolebinding cluster-admin-binding \
    --clusterrole cluster-admin --user "$(gcloud config get-value account)"

若要在叢集中部署轉接器,請執行下列指令:

kubectl create -f https://raw.githubusercontent.com/GoogleCloudPlatform/k8s-stackdriver/master/custom-metrics-stackdriver-adapter/deploy/production/adapter.yaml

步驟 2:將指標匯出至 Stackdriver

您可以直接從應用程式將指標匯出至 Stackdriver,或使用 Prometheus 格式公開指標,並將 Prometheus 對 Stackdriver 轉接器新增至 Pod 容器。

您可以在 Metrics Explorer 中透過搜尋 custom/[METRIC_NAME] (例如 custom/foo) 的方式來查看匯出的指標。

從應用程式匯出指標

您可以建立自訂指標,並將指標從應用程式的程式碼直接匯出至 Stackdriver。詳情請參閱 Stackdriver Monitoring 說明文件的建立自訂指標。您也可以利用 Stackdriver 的自動建立自訂指標功能。

指標必須符合下列條件:

  • 指標種類必須是 GAUGE
  • 指標類型可以是 DOUBLEINT64
  • 指標名稱必須以 custom.googleapis.com/ 前置字串開頭,後接簡單名稱
  • 資源類型必須是 "gke_container"
  • 資源標籤必須包括:
    • pod_id 設為 Pod UID,您可以透過 下載 API 取得此值
    • container_name = ""
    • project_idzonecluster_name,可透過應用程式從中繼資料伺服器中取得。若要取得這些值,您可以使用 Google Cloud 的運算中繼資料用戶端。
    • namespace_idinstance_id,可以設為任何值。

下列資訊清單檔案所述的部署會執行 Go 應用程式的單個執行個體,使用 Stackdriver 用戶端程式庫匯出指標:

apiVersion: apps/v1
kind: Deployment
metadata:
  labels:
    run: custom-metric-sd
  name: custom-metric-sd
  namespace: default
spec:
  replicas: 1
  selector:
    matchLabels:
      run: custom-metric-sd
  template:
    metadata:
      labels:
        run: custom-metric-sd
    spec:
      containers:
      - command: ["./direct-to-sd"]
        args: ["--metric-name=foo", "--metric-value=40", "--pod-id=$(POD_ID)"]
        image: gcr.io/google-samples/sd-dummy-exporter:latest
        name: sd-dummy-exporter
        resources:
          requests:
            cpu: 100m
        env:
          - name: POD_ID
            valueFrom:
              fieldRef:
                apiVersion: v1
                fieldPath: metadata.uid

使用 Prometheus 匯出

您可以在應用程式中使用 Prometheus 格式公開指標並部署 Prometheus 對 Stackdriver 轉接器;這個轉接器可以剪輯指標並匯出至 Stackdriver。如需以 Prometheus 格式公開指標的範例,請參閱 Kubernetes 檢測設備測試指南

指標必須符合下列條件:

  • 指標類型必須是 Gauge
  • 指標名稱不得含有 custom.googleapis.com 前置字串

將 Prometheus-to-Stackdriver 轉接器部署為 Pod 中的容器,從中匯出指標,並將以下標記傳遞給容器:

  • pod-idnamespace-id:設為 Pod 和名稱空間 UID,您可以透過下載 API 取得此值
  • source=http://localhost:[PORT],其中 [PORT] 是用來公開指標的通訊埠。
  • stackdriver-prefix=custom.googleapis.com

下列資訊清單檔案說明使用 Go 應用程式的 Pod,使用 Prometheus 用戶端程式庫和轉接器容器來公開指標。

apiVersion: v1
kind: Pod
metadata:
  name: custom-metric-prometheus-sd
spec:
  containers:
  - command:
    - /bin/sh
    - -c
    - ./prometheus-dummy-exporter --metric-name=foo --metric-value=40 --port=8080
    image: gcr.io/google-samples/prometheus-dummy-exporter:latest
    imagePullPolicy: Always
    name: prometheus-dummy-exporter
    resources:
      requests:
        cpu: 100m
  - name: prometheus-to-sd
    image: gcr.io/google-containers/prometheus-to-sd:v0.2.3
    command:
    - /monitor
    - --source=:http://localhost:8080
    - --stackdriver-prefix=custom.googleapis.com
    - --pod-id=$(POD_ID)
    - --namespace-id=$(POD_NAMESPACE)
    env:
    - name: POD_ID
      valueFrom:
        fieldRef:
          apiVersion: v1
          fieldPath: metadata.uid
    - name: POD_NAMESPACE
      valueFrom:
        fieldRef:
          fieldPath: metadata.namespace

步驟 3:建立 HorizontalPodAutoscaler 物件

將指標匯出至 Stackdriver 後,您可以部署 HPA 以依據指標來調整部署的資源配置。

下列步驟取決於您選擇用來收集和匯出指標的方式。

依據所有 Pod 的指標自動調度資源

HPA 使用指標來計算平均值,並與目標平均值進行比較。

在應用程式對 Stackdriver 匯出範例中,部署含有匯出指標的 Pod。下列資訊清單檔案說明的 HorizontalPodAutoscaler 物件可依據指標的目標平均值來調整部署的資源配置:

apiVersion: autoscaling/v2beta1
kind: HorizontalPodAutoscaler
metadata:
  name: custom-metric-sd
  namespace: default
spec:
  scaleTargetRef:
    apiVersion: apps/v1beta1
    kind: Deployment
    name: custom-metric-sd
  minReplicas: 1
  maxReplicas: 5
  metrics:
  - type: Pods
    pods:
      metricName: foo
      targetAverageValue: 20

依據單一 Pod 的指標自動調度資源

HPA 會直接比較單一 Pod 所公開的值與指定的目標值。這個 Pod 不需要繫結至經過調整的工作流程。

在 Prometheus 對 Stackdriver 匯出範例中,單一 Pod 會匯出指標。下列資訊清單檔案說明的部署和 HPA 會依據指標的目標值來調整部署的資源配置:

apiVersion: apps/v1
kind: Deployment
metadata:
  name: dummy-deployment
spec:
  replicas: 2
  selector:
    matchLabels:
      k8s-app: dummy-deployment
  template:
    metadata:
      labels:
        k8s-app: dummy-deployment
    spec:
      containers:
      - name: long
        image: busybox
        command: ["/bin/sh",  "-c", "sleep 180000000"]
---
apiVersion: autoscaling/v2beta1
kind: HorizontalPodAutoscaler
metadata:
  name: dummy-deployment-hpa
  namespace: default
spec:
  scaleTargetRef:
    apiVersion: apps/v1beta1
    kind: Deployment
    name: dummy-deployment
  minReplicas: 1
  maxReplicas: 5
  metrics:
  - type: Object
    object:
      target:
        kind: Pod
        name: custom-metric-prometheus-sd
      metricName: foo
      targetValue: 20

清除所用資源

如要避免系統向您的 Google Cloud Platform 帳戶收取您在本教學課程中使用資源的相關費用:

執行下列指令以刪除 GKE 叢集:

gcloud container clusters delete [CLUSTER_NAME]

疑難排解

如果您在使用本教學課程時發生問題,請試著執行下列偵錯步驟:

  1. 執行 kubectl api-versions 並確認 custom.metrics.k8s.io/v1beta1 API 已註冊。如果清單中未列出這個 API,請確認自訂指標轉接器 (於步驟 1 中部署) 正在叢集中執行。
  2. 造訪 Metrics Explorer 並確認您的自訂指標是否正在匯出至 Stackdriver。尋找以 custom.googleapis.com/[NAME] 開頭的指標。如果該指標並未列出:

    • 確認匯出工具部署 (於步驟 2 中部署) 正在執行中。
    • 如果您是使用 --service-account 自訂節點的服務帳戶,請確認該帳戶具備監控指標寫入者 IAM 角色 (roles/monitoring.metricWriter)。
    • 如果您是使用 --scopes 自訂節點的範圍,請確認節點具有 monitoring 範圍。
  3. 執行 kubectl describe hpa [DEPLOYMENT_NAME] 並確認自訂指標是由 HPA 讀取。如果發生錯誤:

    • 確認目前執行的是經過調整的部署 (於步驟 2 中部署)。
    • 如果您是使用 --service-account 自訂節點的服務帳戶,請確認該帳戶具備監控檢視者 IAM 角色 (roles/monitoring.viewer)。

後續步驟

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

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

這個網頁
Kubernetes Engine 教學課程