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

Last reviewed 2022-04-22 UTC

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

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

目標

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

料金

このドキュメントでは、Google Cloud の次の課金対象のコンポーネントを使用します。

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

料金計算ツールを使うと、予想使用量に基づいて費用の見積もりを生成できます。 新しい Google Cloud ユーザーは無料トライアルをご利用いただける場合があります。

始める前に

  1. Google Cloud アカウントにログインします。Google Cloud を初めて使用する場合は、アカウントを作成して、実際のシナリオでの Google プロダクトのパフォーマンスを評価してください。新規のお客様には、ワークロードの実行、テスト、デプロイができる無料クレジット $300 分を差し上げます。
  2. Google Cloud Console の [プロジェクト セレクタ] ページで、Google Cloud プロジェクトを選択または作成します。

    プロジェクト セレクタに移動

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

  4. App Engine, Artifact Registry, Cloud Build, Compute Engine, Resource Manager, Google Kubernetes Engine, and Identity and Access Management API を有効にします。

    API を有効にする

  5. Google Cloud Console の [プロジェクト セレクタ] ページで、Google Cloud プロジェクトを選択または作成します。

    プロジェクト セレクタに移動

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

  7. App Engine, Artifact Registry, Cloud Build, Compute Engine, Resource Manager, Google Kubernetes Engine, and Identity and Access Management API を有効にします。

    API を有効にする

  8. このドキュメントに記載されているタスクの完了後、作成したリソースを削除すると、それ以上の請求は発生しません。詳細については、クリーンアップをご覧ください。

  9. Google アカウントにロールを付与します。次の IAM ロールごとに次のコマンドを 1 回実行します。 roles/serviceusage.serviceUsageAdmin, roles/container.admin, roles/appengine.appAdmin, roles/appengine.appCreator, roles/artifactregistry.admin, roles/resourcemanager.projectIamAdmin, roles/compute.instanceAdmin.v1, roles/iam.serviceAccountUser, roles/cloudbuild.builds.builder, roles/iam.serviceAccountAdmin

    gcloud projects add-iam-policy-binding PROJECT_ID --member="user:EMAIL_ADDRESS" --role=ROLE
    • PROJECT_ID は、実際のプロジェクト ID に置き換えます。
    • EMAIL_ADDRESS は実際のメールアドレスに置き換えます。
    • ROLE は、個々のロールに置き換えます。

ワークロード例

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

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

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

アーキテクチャ

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

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

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

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

負荷テストのタスクをデプロイする手順は、次のとおりです。

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

次の図は、サンプル アプリケーションを使用して負荷テストを行うアーキテクチャを示しています。負荷テストの操作とモニタリングに使用されるウェブ インターフェースを提供するマスター Pod。ワーカー Pod は、テスト中のアプリケーションの REST リクエスト トラフィックを生成し、マスターに指標を送信します。

負荷テストの操作とモニタリングに使用されるウェブ インターフェースを提供するマスター Pod。テスト中のアプリケーションの REST リクエスト トラフィックを生成するワーカー Pod。

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

Locust マスターは、負荷テストのタスクを実行するためのエントリ ポイントです。Locust のマスター構成では、コンテナで使用される次のデフォルト ポートなど、いくつかの要素が指定されます。

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

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

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

この Service を使用すると、マスターが失敗して Deployment によって新しい Pod に置き換えられる場合でも、Locust ワーカーはマスターを簡単に検出して確実に通信できるようになります。

同じ VPC ネットワークを使用し、クラスタと同じ Google Cloud リージョンにあるクラスタ外のクライアントが Locust ウェブ アプリケーション サービスにアクセスできるようにする内部パススルー ネットワーク ロードバランサを作成するために、必要なアノテーションを含む 2 番目の Service がデプロイされます。

Locust マスターをデプロイした後、内部パススルー ネットワーク ロードバランサによってプロビジョニングされたプライベート IP アドレスを使用してウェブ インターフェースを開くことができます。Locust ワーカーをデプロイした後、シミュレーションを開始して Locust ウェブ インターフェース経由で集計した統計情報を確認できます。

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

Locust ワーカーは負荷テストのタスクを実行します。単一の Deployment を使って複数の Pod を作成します。Pod は、Kubernetes クラスタ全体に分散されます。各 Pod は、環境変数を使用して、テスト対象システムのホスト名や Locust マスターのホスト名などの構成情報を制御します。

次の図は、Locust マスターと Locust ワーカー間の関係を示しています。

Locust マスターは階層の最上位に位置し、その下に複数のワーカーがある。

共通変数を初期化する

インフラストラクチャの要素がデプロイされる場所を制御する変数をいくつか定義する必要があります。

  1. Cloud Shell を開きます。

    Cloud Shell を開く

    このチュートリアルでは、Cloud Shell からすべてのターミナル コマンドを実行します。

  2. カスタマイズが必要な環境変数を設定します。

    export GKE_CLUSTER=GKE_CLUSTER
    export AR_REPO=AR_REPO
    export REGION=REGION
    export ZONE=ZONE
    export SAMPLE_APP_LOCATION=SAMPLE_APP_LOCATION
    

    次のように置き換えます。

    • GKE_CLUSTER: GKE クラスタの名前。
    • AR_REPO: Artifact Registry リポジトリの名前
    • REGION: GKE クラスタと Artifact Registry リポジトリが作成されるリージョン
    • ZONE: Compute Engi