學習路徑:可擴充的應用程式 - 擴充

IT 管理員和營運人員可以透過這個系列的教學課程,瞭解如何部署、執行及管理 Google Kubernetes Engine (GKE) 中運作的現代化應用程式環境。在本系列教學課程中,您將瞭解如何設定監控和快訊、擴充工作負載,以及模擬失敗,所有操作都使用 Cymbal Bank 範例微服務應用程式:

  1. 建立叢集並部署範例應用程式
  2. 使用 Google Cloud Managed Service for Prometheus 進行監控
  3. 調度工作負載資源 (本教學課程)
  4. 模擬失敗情形
  5. 集中管理變更

總覽和目標

Cymbal Bank 等消費者應用程式的使用者人數通常會隨時間而異。理想情況下,網站應能應付流量暴增的情況,不會變慢或發生其他問題,但機構不必花錢購買實際不需要的雲端資源。自動調度功能可提供這項解決方案。Google Cloud

在本教學課程中,您將瞭解如何在 GKE 叢集中設定叢集和工作負載,以便使用內建的 Kubernetes 指標,以及 Cloud Monitoring 和 Cloud Trace 的自訂指標來調整資源配置。您將瞭解如何完成下列工作:

  • 在 Cloud Monitoring 中啟用 Trace 的自訂指標。
    • 自訂指標可讓您使用 Kubernetes 叢集以外的額外監控資料或外部輸入內容 (例如網路流量或 HTTP 回應碼) 進行調整。
  • 設定水平 Pod 自動配置器,這項 GKE 功能可根據指定指標,自動增加或減少工作負載的 Pod 數量。
  • 模擬應用程式負載,並查看叢集自動配置器和水平 Pod 自動配置器的回應。

設定自訂指標收集

您可以設定水平 Pod 自動調度器,使用 Kubernetes 內建的基本 CPU 和記憶體指標,也可以使用 Cloud Monitoring 的自訂指標,例如每秒 HTTP 要求數或 SELECT 陳述式數量。自訂指標不需變更應用程式,就能讓叢集更深入瞭解應用程式的整體效能和需求。在本教學課程中,您將瞭解如何使用內建和自訂指標。

  1. 如要允許水平 Pod 自動調度器從 Monitoring 讀取自訂指標,您必須在叢集中安裝自訂指標 - Stackdriver 轉接器

    將自訂指標 Stackdriver 轉接器部署至叢集:

    kubectl apply -f https://raw.githubusercontent.com/GoogleCloudPlatform/k8s-stackdriver/master/custom-metrics-stackdriver-adapter/deploy/production/adapter.yaml
    
  2. 如要允許 Stackdriver 轉接器從叢集取得自訂指標,請使用 GKE 適用的工作負載身分聯盟。這個方法會使用具有讀取監控指標權限的 IAM 服務帳戶。

    roles/monitoring.viewer 角色授予 IAM 服務帳戶:

    gcloud projects add-iam-policy-binding PROJECT_ID \
        --member "serviceAccount:scalable-apps@PROJECT_ID.iam.gserviceaccount.com" \
        --role roles/monitoring.viewer
    
  3. 設定 Stackdriver 介面卡,使用 GKE 適用的工作負載身分聯盟,以及有權讀取監控指標的 IAM 服務帳戶:

    gcloud iam service-accounts add-iam-policy-binding scalable-apps@PROJECT_ID.iam.gserviceaccount.com \
        --role roles/iam.workloadIdentityUser \
        --member "serviceAccount:PROJECT_ID.svc.id.goog[custom-metrics/custom-metrics-stackdriver-adapter]"
    
  4. Kubernetes 內建服務帳戶系統,可在叢集內提供存取權。如要讓應用程式向 Google Kubernetes Engine 叢集外部的服務和資源 (例如 Monitoring) 進行驗證,請使用 GKE 適用的工作負載身分聯盟。這種做法會設定 Kubernetes 服務帳戶,以使用 GKE 的 IAM 服務帳戶。

    為介面卡使用的 Kubernetes 服務帳戶加上註解:

    kubectl annotate serviceaccount custom-metrics-stackdriver-adapter \
        --namespace=custom-metrics \
        iam.gke.io/gcp-service-account=scalable-apps@PROJECT_ID.iam.gserviceaccount.com
    
  5. 重新啟動 Stackdriver 轉接器 Deployment,以套用變更:

    kubectl rollout restart deployment custom-metrics-stackdriver-adapter \
        --namespace=custom-metrics
    

設定水平 Pod 自動配置器

GKE Autopilot 可透過幾種不同方式進行擴充。在本教學課程中,您將瞭解如何使用下列方法調度叢集資源:

  • 水平 Pod 自動調度器:調整工作負載的 Pod 數量。
  • 叢集自動配置器:調整叢集中可用的節點資源。

這兩種方法可以搭配運作,因此當應用程式的 Pod 數量變更時,支援這些 Pod 的節點資源也會變更。

您也可以使用垂直 Pod 自動調度器,調整 Pod 的 CPU 和記憶體要求,而非 Pod 數量。

在本教學課程中,您將使用內建指標為 userservice Deployment 設定水平 Pod 自動配置器,並使用自訂指標為 frontend Deployment 設定水平 Pod 自動配置器。

如果是您自己的應用程式,請與應用程式開發人員和平台工程師合作,瞭解他們的需求,並設定 Horizontal Pod Autoscaler 規則。

調整 userservice Deployment 的資源配置

當 Cymbal Bank 範例應用程式的使用者人數增加時,userservice 服務會消耗更多 CPU 資源。您可以使用 HorizontalPodAutoscaler 物件,控管應用程式對負載的回應方式。在 HorizontalPodAutoscaler 的 YAML 資訊清單中,您可以定義要讓水平 Pod 自動配置器調度哪些 Deployment 資源、要監控哪些指標,以及要執行的備用資源數量下限和上限。

  1. 查看 userservice Deployment 的 HorizontalPodAutoscaler範例資訊清單:

    # Copyright 2022 Google LLC
    #
    # Licensed under the Apache License, Version 2.0 (the "License");
    # you may not use this file except in compliance with the License.
    # You may obtain a copy of the License at
    #
    #      http://www.apache.org/licenses/LICENSE-2.0
    #
    # Unless required by applicable law or agreed to in writing, software
    # distributed under the License is distributed on an "AS IS" BASIS,
    # WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
    # See the License for the specific language governing permissions and
    # limitations under the License.
    
    ---
    apiVersion: autoscaling/v2
    kind: HorizontalPodAutoscaler
    metadata:
      name: userservice
    spec:
      behavior:
        scaleUp:
          stabilizationWindowSeconds: 0
          policies:
            - type: Percent
              value: 100
              periodSeconds: 5
          selectPolicy: Max
      scaleTargetRef:
        apiVersion: apps/v1
        kind: Deployment
        name: userservice
      minReplicas: 5
      maxReplicas: 50
      metrics:
        - type: Resource
          resource:
            name: cpu
            target:
              type: Utilization
              averageUtilization: 60
    

    這個資訊清單會執行下列操作:

    • 將擴充期間的備用資源數量上限設為 50
    • 將縮減期間的執行個體數量下限設為 5
    • 使用內建的 Kubernetes 指標來決定資源調度。在這個範例中,指標是 CPU 使用率,目標使用率為 60%,可避免過度使用和使用不足。
  2. 將資訊清單套用至叢集:

    kubectl apply -f extras/postgres-hpa/hpa/userservice.yaml
    

調整 frontend Deployment 的資源配置

在上一節中,您已根據 CPU 使用率的內建 Kubernetes 指標,在 Deployment 上設定水平 Pod 自動配置器。userservice對於「部署」frontend,您可能想改為根據傳入的 HTTP 要求數量進行調整。這個方法會使用 Stackdriver 介面卡,從 Monitoring 讀取 HTTP(S) 負載平衡器 Ingress 物件的自訂指標。

  1. 查看 frontend Deployment 的 HorizontalPodAutoscaler 資訊清單:

    # Copyright 2022 Google LLC
    #
    # Licensed under the Apache License, Version 2.0 (the "License");
    # you may not use this file except in compliance with the License.
    # You may obtain a copy of the License at
    #
    #      http://www.apache.org/licenses/LICENSE-2.0
    #
    # Unless required by applicable law or agreed to in writing, software
    # distributed under the License is distributed on an "AS IS" BASIS,
    # WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
    # See the License for the specific language governing permissions and
    # limitations under the License.
    
    ---
    apiVersion: autoscaling/v2
    kind: HorizontalPodAutoscaler
    metadata:
      name: frontend
    spec:
      behavior:
        scaleUp:
          stabilizationWindowSeconds: 0
          policies:
            - type: Percent
              value: 100
              periodSeconds: 5
          selectPolicy: Max
      scaleTargetRef:
        apiVersion: apps/v1
        kind: Deployment
        name: frontend
      minReplicas: 5
      maxReplicas: 25
      metrics:
        - type: External
          external:
            metric:
              name: loadbalancing.googleapis.com|https|request_count
              selector:
                matchLabels:
                  resource.labels.forwarding_rule_name: FORWARDING_RULE_NAME
            target:
              type: AverageValue
              averageValue: "5"
    

    這份資訊清單使用下列欄位:

    • spec.scaleTargetRef:要擴展的 Kubernetes 資源。
    • spec.minReplicas:備用資源數量下限,在本範例中為 5
    • spec.maxReplicas:副本數量上限,在本範例中為 25
    • spec.metrics.*:要使用的指標。在本範例中,這是每秒的 HTTP 要求數,也就是您部署的介面卡提供的 Monitoring 自訂指標。
    • spec.metrics.external.metric.selector.matchLabels:縮放時要篩選的特定資源標籤。
  2. frontend Ingress 負載平衡器找出轉送規則名稱:

    export FW_RULE=$(kubectl get ingress frontend -o=jsonpath='{.metadata.annotations.ingress\.kubernetes\.io/forwarding-rule}')
    echo $FW_RULE
    

    輸出結果會與下列內容相似:

    k8s2-fr-j76hrtv4-default-frontend-wvvf7381
    
  3. 在資訊清單中新增轉送規則:

    sed -i "s/FORWARDING_RULE_NAME/$FW_RULE/g" "extras/postgres-hpa/hpa/frontend.yaml"
    

    這個指令會將 FORWARDING_RULE_NAME 替換為您儲存的轉送規則。

  4. 將資訊清單套用至叢集:

    kubectl apply -f extras/postgres-hpa/hpa/frontend.yaml
    

模擬負載

在本節中,您會使用負載產生器模擬流量尖峰,並觀察副本數量和節點數量如何擴充,以因應負載隨時間增加的情況。然後停止產生流量,觀察副本和節點數量是否隨之減少。

  1. 開始前,請檢查水平 Pod 自動配置器的狀態,並查看目前使用的副本數量。

    取得 HorizontalPodAutoscaler 資源的狀態:

    kubectl get hpa
    

    輸出內容會與下列內容類似,顯示有 1 個 frontend 副本和 5 個 userservice 副本:

    NAME                     REFERENCE                            TARGETS             MINPODS   MAXPODS   REPLICAS   AGE
    frontend                 Deployment/frontend                  <unknown>/5 (avg)   5         25        1          34s
    userservice              Deployment/userservice               0%/60%              5         50        5          4m56s
    
  2. Cymbal Bank 範例應用程式包含 loadgenerator 服務。這項服務會持續傳送模仿使用者的要求至前端,並定期建立新帳戶,以及模擬這些帳戶之間的交易。

    在本機公開 loadgenerator 網頁介面。您可以使用這個介面模擬 Cymbal Bank 範例應用程式的負載:

    kubectl port-forward svc/loadgenerator 8080
    

    如果看到錯誤訊息,請在 Pod 執行時重試。

  3. 在電腦的瀏覽器中開啟負載產生器網頁介面:

    • 如果您使用本機殼層,請開啟瀏覽器並前往 http://127.0.0.1:8080。
    • 如果您使用 Cloud Shell,請按一下 「Web preview」(網頁預覽),然後按一下「Preview on port 8080」(透過以下通訊埠預覽:8080)
  4. 在負載產生器網頁介面中,如果「Failures」(失敗) 值顯示 100%,請完成下列步驟來更新測試設定:

    1. 按一下失敗率計數器旁的「停止」按鈕。
    2. 在「狀態」下方,點選「新測試」選項。
    3. 將「Host」值更新為 Cymbal Bank 進入點的 IP 位址。
    4. 按一下「Start Swarming」
  5. 在負載產生器網頁介面中,按一下「圖表」分頁標籤,即可觀察一段時間內的效能。查看要求數量和資源用量。

  6. 開啟新的終端機視窗,並監控 frontenduserservice Pod 的副本數量:

    kubectl get hpa -w
    

    負載增加時,備用資源數量也會增加。叢集會辨識設定的指標達到定義的門檻,並使用水平 Pod 自動調度器調度 Pod 數量,因此 scaleUp 動作可能需要約十分鐘。

    以下範例輸出內容顯示,隨著負載產生器執行,副本數量會增加:

    NAME                     REFERENCE                            TARGETS          MINPODS   MAXPODS   REPLICAS
    frontend                 Deployment/frontend                  5200m/5 (avg)    5         25        13
    userservice              Deployment/userservice               71%/60%          5         50        17
    
  7. 開啟另一個終端機視窗,然後檢查叢集中的節點數量:

    gcloud container clusters list \
        --filter='name=scalable-apps' \
        --format='table(name, currentMasterVersion, currentNodeVersion, currentNodeCount)' \
        --location="CONTROL_PLANE_LOCATION"
    

    CONTROL_PLANE_LOCATION 替換為叢集控制層的 Compute Engine 位置。為地區叢集提供地區,或為區域叢集提供區域。

    節點數量也從初始數量增加,以容納新的副本。節點數量增加是由 GKE Autopilot 驅動。您不需要為這個節點規模設定任何項目。

  8. 開啟負載產生器介面,然後按一下「停止」結束測試。

  9. 再次檢查副本數量和節點數量,並觀察數字是否隨著負載減少而降低。縮減作業可能需要一段時間,因為 Kubernetes HorizontalPodAutoscaler 資源中副本的預設穩定時間範圍為五分鐘。

在實際環境中,環境中的節點和 Pod 數量會自動擴充和縮減,與這個模擬負載相同。Cymbal Bank 範例應用程式的設計可因應這類擴充需求。請與應用程式營運人員和網站可靠性工程 (SRE) 或應用程式開發人員確認,瞭解他們的工作負載是否能從這些擴充功能獲益。