Google Kubernetes Engine を使用した負荷分散テスト

このチュートリアルでは、Google Kubernetes Engine(GKE)を使用して、複数のコンテナを使ってシンプルな REST ベースの API のトラフィックを作成する負荷分散テスト フレームワークをデプロイする方法について説明します。ここでは、App Engine にデプロイされた、受信 HTTP POST リクエストをキャプチャする REST スタイルのエンドポイントを公開するウェブ アプリケーションの負荷テストを行います。

同じパターンを使用して、メッセージング システム、データ ストリーム管理システム、データベース システムなど、さまざまなシナリオやアプリケーション用の負荷テスト フレームワークを作成できます。

目標

  • Deployment 構成を設定するための環境変数を定義する。
  • GKE クラスタを作成する。
  • 負荷テストを実行する。
  • 必要に応じて、ユーザー数をスケールアップするか、パターンを他のユースケースにも適用する。

料金

このチュートリアルでは、以下の課金対象の Google Cloud Platform コンポーネントを使用します。

  • Google Kubernetes Engine
  • App Engine
  • Cloud Build
  • Cloud Storage

料金計算ツールを使用して、予測される使用量に基づき、費用の見積もりを出すことができます。 GCP を初めてご利用の場合は、無料トライアルをご利用いただけます。

始める前に

  1. Google アカウントにログインします。

    Google アカウントをまだお持ちでない場合は、新しいアカウントを登録します。

  2. Google Cloud Platform プロジェクトを選択または作成します。

    [リソースの管理] ページに移動

  3. Google Cloud Platform プロジェクトに対して課金が有効になっていることを確認します。

    課金を有効にする方法について

  4. Cloud Build、Compute Engine、Container Analysis、Container Registry API を有効にします。

    APIを有効にする

このチュートリアルを終了した後、作成したリソースを削除すると、それ以上の請求は発生しません。詳しくは、クリーンアップをご覧ください。

ワークロード例

次の図は、リクエストがクライアントからアプリケーションに送信されるワークロード例を示しています。

クライアントからアプリケーションへのリクエスト。

このインタラクションをモデル化するために、Python ベースの分散型負荷テストツールである Locust を使用します。このツールでは複数のターゲットパスにリクエストを分散できます。たとえば Locust は、リクエストを /login/metrics のターゲットパスに分散できます。ワークロードは、Locust の一連のタスクとしてモデル化されます。

アーキテクチャ

このアーキテクチャには、次の 2 つの主要コンポーネントが含まれます。

  • Locust Docker コンテナ イメージ。
  • コンテナ オーケストレーションと管理メカニズム。

Locust Docker コンテナ イメージには Locust ソフトウェアが含まれています。Dockerfile はこのチュートリアルに付属する GitHub リポジトリのクローンを作成すると入手できます。Dockerfile はベースの Python イメージを使用し、Locust サービスを開始してタスクを実行するスクリプトを含んでいます。実際のクライアントに近づけるために、各 Locust タスクが重み付けされます。たとえば、クライアントの合計リクエスト 1,000 個ごとに登録が 1 回発生します。

GKE はコンテナのオーケストレーションと管理を提供します。GKE を使用すると、負荷テスト フレームワークの基盤となるコンテナノードの数を指定できます。負荷テストのワーカーをポッドに整理し、GKE が実行され続けるポッドの数を指定することもできます。

負荷テストのタスクをデプロイするには、次の手順を行います。

  1. 負荷テストのマスターをデプロイします。
  2. 負荷テストのワーカーのグループをデプロイします。この負荷テストのワーカーを使用して、テスト用の大量のトラフィックを作成できます。

次の図は、マスターノードとワーカーノードの内容を示しています。

マスターには、API サーバー、スケジューラ、マネージャーが含まれる。2 つのノードにはそれぞれ、Kublet、プロキシ、4 つのポッドがある Docker イメージが含まれる。

負荷テストのマスターについて

Locust マスターは、負荷テストのタスクを実行するためのエントリ ポイントです。Locust のマスター構成では、コンテナによって公開される次のポートなど、いくつかの要素が指定されます。

  • 8089: ウェブ インターフェース用
  • 55575558: ワーカーとの通信用

この情報は、Locust ワーカーを構成するために後で使用されます。

サービスをデプロイして、クラスタ内の他のポッドが hostname:port を通じて公開されたポートにアクセスできるようにします。公開されたポートは、わかりやすいポート名でも参照できます。

サービスを使用すると、マスターが失敗して Deployment によって新しいポッドに置き換えられる場合でも、Locust ワーカーがマスターを簡単に検出して確実に通信できるようになります。このサービスには、外部トラフィックがクラスタ リソースにアクセスできるように、クラスタレベルで外部転送ルールを作成するディレクティブも含まれています。

Locust マスターをデプロイした後、外部転送ルールのパブリック IP アドレスを使用してウェブ インターフェースを開くことができます。Locust ワーカーをデプロイした後、シミュレーションを開始して Locust ウェブ インターフェース経由で集計した統計情報を確認できます。

負荷テストのワーカーについて

Locust ワーカーは負荷テストのタスクを実行します。単一の Deployment を使って複数のポッドを作成します。ポッドは、Kubernetes クラスタ全体に分散されます。各ポッドは、環境変数を使用して、テスト対象システムのホスト名や 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 イメージをビルドし、プロジェクトのコンテナ レジストリに格納します。

    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.yaml ファイルと locust-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 の Deployment を確認します。

    kubectl get pods -o wide
    

    出力は次のようになります。

    Locust のマスターノードとワーカーノードがデプロイされる。
  4. サービスを確認します。

    kubectl get services
    

    出力は次のようになります。

    サービスがデプロイされる。
  5. Locust マスター サービスに外部 IP アドレスが割り当てられている間に watch ループを実行します。

    kubectl get svc locust-master --watch
    
  6. Ctrl+C を押して watch ループを終了してから、次のコマンドを実行して外部 IP アドレスをメモします。

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

負荷のテスト

Locust マスターのウェブ インターフェースを使用して、テスト対象システムに対して負荷テストのタスクを実行できます。

  1. システムの外部 IP アドレスを取得します。

    echo $EXTERNAL_IP
    

  2. ブラウザを開き、Locust マスターのウェブ インターフェースを開きます。URL http://[EXTERNAL_IP]:8089 の [EXTERNAL_IP] は、前の手順で取得した IP アドレスに置き換えます。

    Locust マスターのウェブ インターフェースには、新しく swarm を開始し、ユーザーの数と生成速度を指定するためのダイアログがある。

  3. [Number of users to simulate] にシミュレーションする合計ユーザー数として「10」、[Hatch rate](ユーザーを生成する速度)に 1 秒あたりに生成するユーザー数として「5」と指定します。

  4. [Start swarming] をクリックしてシミュレーションを開始します。

    リクエストによりスワーミングが開始されると、次の画像に示すように [Statistics] でリクエスト数や 1 秒あたりのリクエスト数などのシミュレーション指標の集計が始まります。

    Locust ウェブ インターフェースに統計情報の集計が開始されたことが示される。
  5. [Stop] をクリックしてテストを終了します。

GCP Console でデプロイされたサービスと他の指標を確認できます。

App Engine ダッシュボードに、1 時間あたりのリクエスト数が種類別にグラフで表示される。

ユーザー数をスケールアップする(省略可)

アプリケーションの負荷を増加してテストしたい場合は、シミュレーションするユーザー数を追加できます。シミュレーションするユーザー数を追加する前に、負荷の増加に対応できる十分なリソースがあることを確認してください。GCP では、基盤となる VM リソースがポッド数の増加に対応できる場合、既存のポッドを再デプロイせずに Locust ワーカーポッドを Deployment に追加できます。最初の GKE クラスタは 3 ノードから始まり、最大 10 ノードまで自動スケーリングできます。

  • Locust ワーカーポッドのプールを 20 にスケールします。

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

    新しいポッドのデプロイと起動には数分かかります。

Pod Unschedulable エラーが表示された場合は、クラスタにさらに役割を追加する必要があります。詳しくは、GKE クラスタのサイズ変更を参照してください。

ポッドが起動したら、Locust マスターのウェブ インターフェースに戻り、負荷テストを再開します。

パターンの拡張

このパターンを拡張するために、新しい Locust タスクを作成することや、別の負荷テスト フレームワークに切り替えることができます。

収集する指標はカスタマイズできます。たとえば、1 秒あたりのリクエスト数の測定、負荷の増加に伴うレスポンスのレイテンシのモニタリング、レスポンスの失敗率とエラーのタイプの確認などが可能です。

詳しくは、Stackdriver Monitoring のドキュメントをご覧ください。

クリーンアップ

チュートリアルが終了したら、GCP で作成したリソースについて料金が発生しないようにクリーンアップすることができます。

プロジェクトの削除

課金を停止する最も簡単な方法は、チュートリアル用に作成したプロジェクトを削除することです。

プロジェクトを削除する手順は次のとおりです。

  1. GCP Console で [プロジェクト] ページに移動します。

    プロジェクト ページに移動

  2. プロジェクト リストで、削除するプロジェクトを選択し、[削除] をクリックします。
  3. ダイアログでプロジェクト ID を入力し、[シャットダウン] をクリックしてプロジェクトを削除します。

GKE クラスタの削除

プロジェクト全体を削除したくない場合は、次のコマンドを実行して GKE クラスタを削除します。

   gcloud container clusters delete $CLUSTER --zone $ZONE
   

次のステップ

このページは役立ちましたか?評価をお願いいたします。

フィードバックを送信...