使用 Google Kubernetes Engine 進行分散式工作負載測試

本教學課程說明如何使用 Google Kubernetes Engine (GKE) 部署分散式工作負載測試架構,而這個架構會使用多個容器為簡易 REST 式 API 建立流量。本教學課程對部署至 App Engine 的網路應用程式進行工作負載測試;應用程式會公開 REST 基本端點,以便擷取傳入 HTTP POST 的要求。

您可以使用相同的模式,針對各種情境和應用程式建立工作負載測試架構,例如訊息系統、資料串流管理系統和資料庫系統。

目標

  • 定義環境變數來控制部署設定。
  • 建立 GKE 叢集。
  • 執行工作負載測試。
  • 視需要擴大使用者人數或將模式擴展至其他用途。

費用

本教學課程使用下列 Google Cloud Platform 計費元件:

  • Google Kubernetes Engine
  • App Engine
  • Cloud 版本
  • Cloud Storage

您可以使用 Pricing Calculator,根據您的預測使用量來產生預估費用。 初次使用 GCP 的使用者可能符合申請免費試用的資格。

事前準備

  1. 登入您的 Google 帳戶。

    如果您沒有帳戶,請申請新帳戶

  2. 選取或建立 Google Cloud Platform 專案。

    前往「Manage resources」(管理資源) 頁面

  3. 請確認您已啟用 Google Cloud Platform 專案的計費功能。

    瞭解如何啟用計費功能

  4. 啟用Cloud Build, Compute Engine, Container Analysis, and Container Registry API。

    啟用 API

完成此教學課程後,您可刪除已建立的資源以免繼續計費。詳情請參閱清除所用資源一節。

工作負載範例

下圖為要求從用戶端傳送到應用程式的工作範例。

從用戶端傳送到應用程式的要求。

如要對這類的互動建立模型,您可以使用 Locust (以 Python 為基礎的分散式工作負載測試工具,可將要求分配至多個目標路徑)。舉例來說,Locust 能夠將要求分配給 /login/metrics 的目標路徑。在 Locust 中,工作負載模型是以一組工作形式呈現。

架構

這個架構包含兩個主要元件:

  • Locust Docker 容器映像檔。
  • 容器自動化調度管理與管理機制。

Locust Docker 容器映像檔包含 Locust 軟體。Dockerfile (複製本教學課程隨附的 GitHub 存放區時即可取得) 使用基本 Python 映像檔,並包含可啟動 Locust 服務及執行工作的指令碼。如要估算實際用戶端,每個 Locust 工作都需要加權計算。舉例來說,註冊是每千個用戶端要求總數才發生一次。

GKE 提供容器自動化調度管理與管理功能。只要使用 GKE,即可指定容器節點的數量,做為工作負載測試架構的基礎。您也可以將工作負載測試工作站組織成 Pod,並指定讓 GKE 維持運作的 Pod 數量。

如要部署工作負載測試工作,請執行下列操作:

  1. 部署工作負載測試主要執行個體。
  2. 部署工作負載測試工作站的群組。這些工作負載測試工作站可讓您建立大量流量,以便進行測試。

下圖顯示主要節點與工作站節點的內容。

主要執行個體包含 API 伺服器、排程器和管理工具。這 2 個節點各包含 Kublet、1 個 Proxy 和 1 個帶有 4 個 Pod 的 Docker 映像檔。

關於工作負載測試主要執行個體

Locust 主要執行個體是執行工作負載測試工作的進入點。Locust 主要執行個體設定會指定幾個元素,包括由容器公開的通訊埠:

  • 8089 適用於網頁介面
  • 55575558 適用於與工作站通訊

這個資訊之後會用來設定 Locust 工作站。

您必須部署服務,以確保已公開通訊埠可從叢集中的 hostname:port 供其他 Pod 存取,而且可透過通訊埠敘述名稱進行參照。

即使主要執行個體發生錯誤,並由部署作業以新的 Pod 取代,使用服務還是可以讓 Locust 工作站輕鬆找到主要執行個體,並與該執行個體穩定通訊。該服務也包含在叢集層級中用來建立外部轉送規則的指令,可讓外部流量存取叢集資源。

部署 Locust 主要執行個體後,您可以使用外部轉送規則的公開 IP 位址來開啟網頁介面。在部署 Locust 工作站後,您可以啟動模擬並透過 Locust 網頁介面查看匯總後的統計資料。

關於工作負載測試工作站

Locust 工作站負責執行工作負載測試工作。您必須使用單一部署建立多個 Pod,而這些 Pod 會分散到 Kubernetes 叢集上。每個 Pod 會使用環境變數控制設定資訊,例如測試狀態下的系統主機名稱以及 Locust 主要執行個體的主機名稱。

下圖顯示 Locust 主要執行個體與 Locust 工作站之間的關係。

Locust 主要執行個體位於階層頂端,下方有多個工作站。

初始化通用變數

您必須定義多個變數,以控制基礎架構的元素部署位置。

  1. 開啟 Cloud Shell:

    開啟 Cloud Shell

    您將從 Cloud Shell 執行本教學課程中所有的終端機指令。

  2. 設定環境變數:

    REGION=us-central1
    ZONE=${REGION}-b
    PROJECT=$(gcloud config get-value project)
    CLUSTER=gke-load-test
    TARGET=${PROJECT}.appspot.com
    SCOPE="https://www.googleapis.com/auth/cloud-platform"
    
  3. 設定預設的區域和專案 ID,這樣您就不需要在每個後續指令中指定這些值:

    gcloud config set compute/zone ${ZONE}
    gcloud config set project ${PROJECT}
    

設定環境

  1. 從 GitHub 複製範例存放區:

    git clone https://github.com/GoogleCloudPlatform/distributed-load-testing-using-kubernetes
    
  2. 將工作目錄變更為複製的存放區:

    cd distributed-load-testing-using-kubernetes
    

建立 GKE 叢集

  1. 建立 GKE 叢集:

    gcloud container clusters create $CLUSTER \
       --zone $ZONE \
       --scopes $SCOPE \
       --enable-autoscaling --min-nodes "3" --max-nodes "10" \
       --scopes=logging-write \
       --addons HorizontalPodAutoscaling,HttpLoadBalancing
    
  2. 連線至 GKE 叢集:

    gcloud container clusters get-credentials $CLUSTER \
       --zone $ZONE \
       --project $PROJECT
    

建構 Docker 映像檔

  1. 建構 Docker 映像檔並儲存至專案的 Container Registry 中:

    gcloud builds submit \
        --tag gcr.io/$PROJECT/locust-tasks:latest docker-image
    
  2. 確認 Docker 映像檔是否在專案的容器存放區中:

    gcloud container images list | grep locust-tasks
    

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

    gcr.io/[PROJECT]/locust-tasks
    Only listing images in gcr.io/[PROJECT]. Use --repository to list images in other repositories.
    

部署範例應用程式

  • 在 App Engine 上部署範例應用程式:

    gcloud app deploy sample-webapp/app.yaml \
      --project=$PROJECT
    

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

    File upload done.
    Updating service [default]...done.
    Setting traffic split for service [default]...done.
    Deployed service [default] to [https://[PROJECT].appspot.com]
    

部署 Locust 主要執行個體與工作站節點

  1. 將目標主機和專案 ID 替換為 locust-master-controller.yamllocust-worker-controller.yaml 檔案中的已部署端點和專案 ID:

    sed -i -e "s/\[TARGET_HOST\]/$TARGET/g" kubernetes-config/locust-master-controller.yaml
    sed -i -e "s/\[TARGET_HOST\]/$TARGET/g" kubernetes-config/locust-worker-controller.yaml
    sed -i -e "s/\[PROJECT_ID\]/$PROJECT/g" kubernetes-config/locust-master-controller.yaml
    sed -i -e "s/\[PROJECT_ID\]/$PROJECT/g" kubernetes-config/locust-worker-controller.yaml
    
  2. 部署 Locust 主要執行個體與工作站節點:

    kubectl apply -f kubernetes-config/locust-master-controller.yaml
    kubectl apply -f kubernetes-config/locust-master-service.yaml
    kubectl apply -f kubernetes-config/locust-worker-controller.yaml
    
  3. 驗證 Locust 部署作業:

    kubectl get pods -o wide
    

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

    Locust 主要執行個體與工作站節點已部署完成。
  4. 驗證服務:

    kubectl get services
    

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

    服務已部署完成。
  5. 將外部 IP 位址指派給 Locust 主要執行個體服務時執行觀察循環:

    kubectl get svc locust-master --watch
    
  6. 按下 Ctrl+C 鍵即可結束觀察循環,然後執行下列指令來紀錄外部 IP 位址:

    EXTERNAL_IP=$(kubectl get svc locust-master -o jsonpath="{.status.loadBalancer.ingress[0].ip}")
    

測試工作負載

您可以使用 Locust 主要執行個體網頁介面對測試狀態下的系統執行工作負載測試工作。

  1. 取得系統的外部 IP 位址:

    echo $EXTERNAL_IP
    

  2. 開啟瀏覽器,然後開啟 Locust 主要執行個體網頁介面。請將下列網址中的 [EXTERNAL_IP] 替換為上述步驟中取得的 IP 位址:http://[EXTERNAL_IP]:8089

    Locust 主要執行個體網頁介面提供了對話方塊,可用來啟動新的群集,並指定使用者人數和產生率。

  3. 指定「模擬使用者人數」總數為 10,以及使用者的「產生率」為每秒 5 位使用者。

  4. 按一下 [Start swarming] (開始群集) 即可開始進行模擬。

    要求開始群集後,系統會開始匯總模擬指標的統計資料,例如要求數量以及每秒要求數量,如下圖所示:

    Locust 網頁介面顯示統計資料開始匯總。
  5. 按一下 [Stop] (停止) 即可終止測試。

您可以透過 GCP 主控台查看已部署的服務和其他指標。

App Engine 資訊主頁顯示一小時內按類型細分的要求數量圖表。

擴大使用者人數 (選用)

如果您要測試應用程式的載入量增加,可以新增模擬使用者。新增模擬使用者前,您必須確保有足夠的資源可支援增加的載入量。使用 GCP 時,只要擁有基礎 VM 資源可支援增加的 Pod 數量,就可以將 Locust 工作站 Pod 加入部署作業,而不必重新部署現有的 Pod。初始 GKE 叢集從 3 個節點開始,最多可自動擴充至 10 個節點。

  • 將 Locust 工作站 Pod 的集區比例調整成 20。

    kubectl scale deployment/locust-worker --replicas=20
    

    部署並啟動新的 Pod 需要幾分鐘的時間。

如果系統顯示 Pod 無法排程的錯誤,您必須在叢集中新增更多角色。詳情請參閱調整 GKE 叢集大小一文。

在 Pod 啟動後,請返回 Locust 主要執行個體網頁介面,並重新啟動工作負載測試。

擴展模式

如要擴展這個模式,您可以建立新的 Locust 工作,或甚至是切換至不同的工作負載測試架構。

您可以自訂要收集的指標。舉例來說,您可能想要測量每秒要求數、在工作負載增加時監控回應延遲時間,或是檢查回應失敗率和錯誤類型。

詳情請參閱 Stackdriver Monitoring 說明文件。

清除所用資源

完成本教學課程後,您可以清除在 GCP 上建立的資源,這樣日後就不需再為這些資源付費。

刪除專案

如要避免付費,最簡單的方法就是刪除您為了本教學課程所建立的專案。

如要刪除專案,請執行以下操作:

  1. 前往 GCP 主控台的「Projects」(專案) 頁面。

    前往「Projects」(專案) 頁面

  2. 在專案清單中,找到您要刪除的專案並按一下「刪除」圖示 delete
  3. 在對話方塊中輸入專案 ID,按一下 [Shut down] (關閉) 即可刪除專案。

刪除 GKE 叢集

如果您不想刪除整個專案,請執行下列指令以刪除 GKE 叢集:

   gcloud container clusters delete $CLUSTER --zone $ZONE
   

後續步驟

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

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

這個網頁
解決方案