arrow_back

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

参加 ログイン
Test and share your knowledge with our community!
done
Get access to over 700 hands-on labs, skill badges, and courses

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

Lab 1時間 universal_currency_alt クレジット: 1 show_chart 入門
Test and share your knowledge with our community!
done
Get access to over 700 hands-on labs, skill badges, and courses

GSP182

Google Cloud セルフペース ラボ

概要

このラボでは、Kubernetes Engine を使用して負荷分散テスト フレームワークをデプロイする方法を学習します。このフレームワークでは、複数のコンテナを使用して、REST ベースのシンプルな API の負荷テスト トラフィックを作成します。このソリューションでは、シンプルなウェブ アプリケーションをテストしますが、同じパターンを使用してゲーム アプリケーションやモノのインターネット(IoT)アプリケーションなどの複雑な負荷テストシナリオを作成することもできます。ここでは、コンテナベースの負荷テスト フレームワークの一般的なアーキテクチャについて説明します。

テスト対象システム

このラボのテスト対象システムは、Google App Engine にデプロイされているシンプルなウェブ アプリケーションです。このアプリケーションは、REST スタイルの基本的なエンドポイントを公開して、受信 HTTP POST リクエストをキャプチャします(受信データは永続化されません)。

サンプルのワークロード

デプロイするアプリケーションは、モノのインターネット(IoT)の多くのデプロイで見られるバックエンド サービス コンポーネントをモデルにして作成されています。まずデバイスがサービスに登録し、次に指標やセンサー測定値の報告を開始するとともに、定期的にサービスに再登録するという一連のインタラクションが行われます。

次の図は、一般的なバックエンド サービス コンポーネントのインタラクションを示しています。 クライアントとアプリケーションの間のインタラクションを表す図

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

ワークロードは前述のインタラクションに基づいており、Locust で一連のタスクとしてモデル化されます。実際のクライアントに近づけるために、各 Locust タスクが重み付けされます。たとえば、クライアント リクエストが 1,000 個ごとに登録が 1 回発生します。

コンテナベースのコンピューティング

  • Locust コンテナ イメージとは、Locust ソフトウェアに含まれている Docker イメージです。

  • コンテナ クラスタは、少なくとも 1 つのクラスタ マスターマシンと、ノードと呼ばれる複数のワーカーマシンで構成されます。このマスターマシンとノードマシンが、Kubernetes クラスタのオーケストレーション システムを実行します。 クラスタの詳細については、Kubernetes Engine のドキュメントをご覧ください。

  • ポッドとは、1 つのホストに同時にデプロイされる 1 つ以上のコンテナであり、定義、デプロイ、そして管理が可能な最小のコンピューティング単位です。一部のポッドには、コンテナが 1 つしか含まれていません。たとえば、このラボでは、各 Locust コンテナが各々のポッドで実行されます。

  • Deployment コントローラでは、ポッドと ReplicaSet に宣言型の更新が行われます。このラボには、locust-master 用と locust-worker 用の 2 つの Deployment があります。

サービス

ノードの障害または更新やメンテナンスのための意図的なノードの中断などのさまざまな理由で、特定のポッドが表示されないことがあります。このような場合、ポッドの IP アドレスが、そのポッドに信頼できるインターフェースを提供していません。より信頼性の高いアプローチでは、インターフェースの変更されない抽象表現を使用し、基になるポッドが表示されず、IP アドレスが異なる新しいポッドに置き換えられる場合でも、インターフェースが提供されるようにしています。Kubernetes Engine のサービスでは、ポッドの論理セットとポッドへのアクセスに使われるポリシーを定義することで、このタイプの抽象インターフェースを提供します。

このラボでは、ポッドやポッドのセットを表すいくつかのサービスを使用します。たとえば、DNS サーバーポッドのサービス、Locust マスターポッドのサービス、10 個すべての Locust ワーカーポッドを表すサービスがあります。

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

マスターノードとワーカーノードの内容

学習内容

  • テスト対象システム、つまり Google App Engine にデプロイされるシンプルなウェブ アプリケーションを作成する。
  • Kubernetes Engine を使用して負荷分散テスト フレームワークをデプロイする。
  • シンプルな REST ベースの API の負荷テスト トラフィックを作成する。

前提条件

  • Google Cloud の App Engine サービスと Kubernetes Engine サービスの基本知識。
  • Linux の標準的なテキスト エディタ(Vim、Emacs、Nano など)を使い慣れていること。

設定と要件

[ラボを開始] ボタンをクリックする前に

こちらの手順をお読みください。ラボの時間は記録されており、一時停止することはできません。[ラボを開始] をクリックするとスタートするタイマーは、Google Cloud のリソースを利用できる時間を示しています。

このハンズオンラボでは、シミュレーションやデモ環境ではなく、実際のクラウド環境を使ってご自身でラボのアクティビティを行うことができます。そのため、ラボの受講中に Google Cloud にログインおよびアクセスするための、新しい一時的な認証情報が提供されます。

このラボを完了するためには、下記が必要です。

  • 標準的なインターネット ブラウザ(Chrome を推奨)
注: このラボの実行には、シークレット モードまたはシークレット ブラウジング ウィンドウを使用してください。これにより、個人アカウントと受講者アカウント間の競合を防ぎ、個人アカウントに追加料金が発生することを防ぎます。
  • ラボを完了するために十分な時間を確保してください。ラボをいったん開始すると一時停止することはできません。
注: すでに個人の Google Cloud アカウントやプロジェクトをお持ちの場合でも、このラボでは使用しないでください。アカウントへの追加料金が発生する可能性があります。

ラボを開始して Google Cloud コンソールにログインする方法

  1. [ラボを開始] ボタンをクリックします。ラボの料金をお支払いいただく必要がある場合は、表示されるポップアップでお支払い方法を選択してください。 左側の [ラボの詳細] パネルには、以下が表示されます。

    • [Google コンソールを開く] ボタン
    • 残り時間
    • このラボで使用する必要がある一時的な認証情報
    • このラボを行うために必要なその他の情報(ある場合)
  2. [Google コンソールを開く] をクリックします。 ラボでリソースが起動し、別のタブで [ログイン] ページが表示されます。

    ヒント: タブをそれぞれ別のウィンドウで開き、並べて表示しておきましょう。

    注: [アカウントの選択] ダイアログが表示されたら、[別のアカウントを使用] をクリックします。
  3. 必要に応じて、[ラボの詳細] パネルから [ユーザー名] をコピーして [ログイン] ダイアログに貼り付けます。[次へ] をクリックします。

  4. [ラボの詳細] パネルから [パスワード] をコピーして [ようこそ] ダイアログに貼り付けます。[次へ] をクリックします。

    重要: 認証情報は左側のパネルに表示されたものを使用してください。Google Cloud Skills Boost の認証情報は使用しないでください。 注: このラボでご自身の Google Cloud アカウントを使用すると、追加料金が発生する場合があります。
  5. その後次のように進みます。

    • 利用規約に同意してください。
    • 一時的なアカウントなので、復元オプションや 2 要素認証プロセスは設定しないでください。
    • 無料トライアルには登録しないでください。

その後このタブで Cloud Console が開きます。

注: 左上にある [ナビゲーション メニュー] をクリックすると、Google Cloud のプロダクトやサービスのリストが含まれるメニューが表示されます。 ナビゲーション メニュー アイコン

Cloud Shell をアクティブにする

Cloud Shell は、開発ツールと一緒に読み込まれる仮想マシンです。5 GB の永続ホーム ディレクトリが用意されており、Google Cloud で稼働します。Cloud Shell を使用すると、コマンドラインで Google Cloud リソースにアクセスできます。

  1. Google Cloud コンソールの上部にある「Cloud Shell をアクティブにする」アイコン 「Cloud Shell をアクティブにする」アイコン をクリックします。

接続した時点で認証が完了しており、プロジェクトに各自の PROJECT_ID が設定されます。出力には、このセッションの PROJECT_ID を宣言する次の行が含まれています。

Your Cloud Platform project in this session is set to YOUR_PROJECT_ID

gcloud は Google Cloud のコマンドライン ツールです。このツールは、Cloud Shell にプリインストールされており、タブ補完がサポートされています。

  1. (省略可)次のコマンドを使用すると、有効なアカウント名を一覧表示できます。
gcloud auth list
  1. [承認] をクリックします。

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

出力:

ACTIVE: * ACCOUNT: student-01-xxxxxxxxxxxx@qwiklabs.net To set the active account, run: $ gcloud config set account `ACCOUNT`
  1. (省略可)次のコマンドを使用すると、プロジェクト ID を一覧表示できます。
gcloud config list project

出力:

[core] project = <project_ID>

出力例:

[core] project = qwiklabs-gcp-44776a13dea667a6 注: Google Cloud における gcloud ドキュメントの全文については、gcloud CLI の概要ガイドをご覧ください。

タスク 1. プロジェクトとゾーンを設定する

  • ラボに使用する project idregionzone の環境変数を定義します。
PROJECT=$(gcloud config get-value project) REGION={{{ project_0.default_region | "REGION" }}} ZONE={{{ project_0.default_zone | "ZONE" }}} CLUSTER=gke-load-test TARGET=${PROJECT}.appspot.com gcloud config set compute/region $REGION gcloud config set compute/zone $ZONE

タスク 2. サンプルコードを入手してアプリケーション用の Docker イメージを作成する

  1. 次のコマンドを実行してリポジトリからソースコードを取得します。
gsutil -m cp -r gs://spls/gsp182/distributed-load-testing-using-kubernetes .
  1. 作成したディレクトリに移動します。
cd distributed-load-testing-using-kubernetes/
  1. Docker イメージを作成してコンテナ レジストリに保存します。
gcloud builds submit --tag gcr.io/$PROJECT/locust-tasks:latest docker-image/.

出力例:

ID CREATE_TIME DURATION SOURCE IMAGES STATUS 47f1b8f7-0b81-492c-aa3f-19b2b32e515d xxxxxxx 51S gs://project_id_cloudbuild/source/1554261539.12-a7945015d56748e796c55f17b448e368.tgz gcr.io/project_id/locust-tasks (+1 more) SUCCESS

[進行状況を確認] をクリックして、目標に沿って進んでいることを確認します。 サンプルコードを入手してアプリケーション用の Docker イメージを作成する

タスク 3. ウェブ アプリケーションをデプロイする

sample-webapp フォルダには、「テスト対象システム」としてシンプルな Google App Engine の Python アプリケーションが含まれています。

  • このアプリケーションをプロジェクトにデプロイするには、gcloud app deploy コマンドを使用します。
gcloud app deploy sample-webapp/app.yaml

コマンドの実行後、次の操作を行うよう求められます。

Please choose the region where you want your App Engine application located:

このプロジェクトのリージョンとして を選択しているため、リージョンの中から を選択します。たとえば、us-central を選択するには、プロンプトに対して「10」を入力します。

選択した数字「10」を入力します。 注: すでに TARGET 変数に格納されている locust-master および locust-worker の Deployment をデプロイするときに、デプロイされたサンプル ウェブ アプリケーションの URL が必要になります。

[進行状況を確認] をクリックして、目標に沿って進んでいることを確認します。 ウェブ アプリケーションをデプロイする

タスク 4. Kubernetes クラスタをデプロイする

gcloud container clusters create $CLUSTER \ --zone $ZONE \ --num-nodes=5

出力例:

NAME: gke-load-test LOCATION: {{{ project_0.default_zone | "ZONE" }}} MASTER_VERSION: 1.11.7-gke.12 MASTER_IP: 34.66.156.246 MACHINE_TYPE: n1-standard-1 NODE_VERSION: 1.11.7-gke.12 NUM_NODES: 5 STATUS: RUNNING

[進行状況を確認] をクリックして、目標に沿って進んでいることを確認します。 Kubernetes クラスタをデプロイする

タスク 5. 負荷テストのマスター

Deployment の最初のコンポーネントは、Locust マスターです。このマスターは、前述の負荷テストのタスクを実行するためのエントリ ポイントです。必要となるマスターは 1 つだけであるため、Locust マスターは、レプリカが 1 つでデプロイされます。

マスター Deployment の構成で、コンテナによって公開される必要があるポート(ウェブ インターフェースの場合は 8089、ワーカーとの通信の場合は 55575558)などのいくつかの要素を指定します。この情報は、Locust ワーカーを構成するために後で使用されます。

次のスニペットには、ポートの構成が含まれています。

ports: - name: loc-master-web containerPort: 8089 protocol: TCP - name: loc-master-p1 containerPort: 5557 protocol: TCP - name: loc-master-p2 containerPort: 5558 protocol: TCP

タスク 6. locust-master をデプロイする

  1. locust-master-controller.yamllocust-worker-controller.yaml の中の [TARGET_HOST][PROJECT_ID] をそれぞれデプロイされたエンドポイントとプロジェクト 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
  1. Locust マスターを以下のようにデプロイします。
kubectl apply -f kubernetes-config/locust-master-controller.yaml
  1. locust-master ポッドが作成されたことを確認するには、次のコマンドを実行します。
kubectl get pods -l app=locust-master
  1. 次に、locust-master-service をデプロイします。
kubectl apply -f kubernetes-config/locust-master-service.yaml

このステップで、内部の DNS 名(locust-master)とポート 808955575558 を使用するポッドが公開されます。このステップの一環として、locust-master-service.yamltype: LoadBalancer ディレクティブが、一般公開されている IP アドレスから locust-master ポッドへの Google Compute Engine 転送ルールを作成するように Google Kubernetes Engine に指示します。

  1. 新しく作成した転送ルールを表示するには、次のコマンドを実行します。
kubectl get svc locust-master

出力例:

NAME TYPE CLUSTER-IP EXTERNAL-IP PORT(S) AGE locust-master LoadBalancer 10.59.244.88 35.222.161.198 8089:30865/TCP,5557:30707/TCP,5558:31327/TCP 1m

[進行状況を確認] をクリックして、目標に沿って進んでいることを確認します。 負荷テストのマスター

タスク 7. 負荷テストのワーカー

Deployment の次のコンポーネントは、前述の負荷テストのタスクを実行する Locust ワーカーです。Locust ワーカーは、複数のポッドを作成する 1 つの Deployment によってデプロイされます。ポッドは、Kubernetes クラスタ全体に分散されます。各ポッドでは、環境変数を使用して、テスト対象システムのホスト名、Locust マスターのホスト名などの重要な構成情報を制御します。

Locust ワーカーがデプロイされ、Locust マスターのウェブ インターフェースに戻ると、デプロイされたワーカー数にスレーブ数が対応していることを確認できます。

次のスニペットには、名前、ラベル、レプリカ数に関する Deployment の構成が含まれています。

apiVersion: "apps/v1" kind: "Deployment" metadata: name: locust-worker labels: name: locust-worker spec: replicas: 5 selector: matchLabels: app: locust-worker template: metadata: labels: app: locust-worker spec: ...

locust-worker をデプロイする

  1. 次に locust-worker-controller をデプロイします。
kubectl apply -f kubernetes-config/locust-worker-controller.yaml
  1. locust-worker-controller は、5 つの locust-worker ポッドをデプロイするように設定されています。ポッドがデプロイされたことを確認するために、以下のコマンドを実行します。
kubectl get pods -l app=locust-worker

シミュレート対象のユーザー数をスケールアップする場合は、Locust ワーカーポッド数を増やす必要があります。Deployment によってデプロイされるポッドの数を増やす場合、Kubernetes では再デプロイすることなく Deployment のサイズを変更できる機能が用意されています。

  1. 次のコマンドを指定すると、Locust ワーカーポッドのプールが 20 に拡張されます。
kubectl scale deployment/locust-worker --replicas=20
  1. ポッドが起動済みで準備されていることを確認するには、次のコマンドで locust-worker ポッドのリストを取得します。
kubectl get pods -l app=locust-worker

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

Locust マスターから Locust ワーカー、アプリケーションまでのフロー。

[進行状況を確認] をクリックして、目標に沿って進んでいることを確認します。 負荷テストのワーカー

タスク 8. テストを実行する

  1. Locust テストを実行するには、次のコマンドで外部 IP アドレスを取得します。
EXTERNAL_IP=$(kubectl get svc locust-master -o yaml | grep ip: | awk -F": " '{print $NF}') echo http://$EXTERNAL_IP:8089
  1. リンクをクリックして、Locust マスターのウェブ インターフェースに移動します。

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

934dc685f86ood1f.png

  1. 開始するには、シミュレートするユーザーの合計数と各ユーザーの生成速度を指定します。

  2. 次に、[Start swarming] をクリックしてシミュレーションを開始します。たとえば、ユーザー数を 300、速度を 10 に指定できます。

  3. [Start swarming] をクリックします。

時間が経過しユーザーが生成されるにつれて、リクエスト数や 1 秒あたりのリクエスト数などのシミュレーション指標が集計されます。

  1. シミュレーションを停止するには、[Stop] をクリックすると、テストが終了します。全体の結果は、スプレッドシートにダウンロードできます。

お疲れさまでした

Kubernetes Engine を使用して負荷分散テスト フレームワークをデプロイしました。

クエストを完了する

このセルフペース ラボは、「Google Cloud Solutions I: Scaling Your Infrastructure」クエストの一部です。クエストとは学習プログラムを構成する一連のラボのことで、完了すると成果が認められて上のようなバッジが贈られます。バッジは公開して、オンライン レジュメやソーシャル メディア アカウントにリンクできます。このラボの修了後、このラボが含まれるクエストに登録すれば、すぐにクレジットを受け取ることができます。受講可能なすべてのクエストについては、Google Cloud Skills Boost カタログをご覧ください。

次のラボを受講する

次のラボに進んでクエストを続けるか、Google Cloud Skills Boost のラボをご確認ください。

Google Cloud トレーニングと認定資格

Google Cloud トレーニングと認定資格を通して、Google Cloud 技術を最大限に活用できるようになります。必要な技術スキルとベスト プラクティスについて取り扱うクラスでは、学習を継続的に進めることができます。トレーニングは基礎レベルから上級レベルまであり、オンデマンド、ライブ、バーチャル参加など、多忙なスケジュールにも対応できるオプションが用意されています。認定資格を取得することで、Google Cloud テクノロジーに関するスキルと知識を証明できます。

マニュアルの最終更新日: 2023 年 10 月 12 日

ラボの最終テスト日: 2023 年 10 月 12 日

Copyright 2024 Google LLC All rights reserved. Google および Google のロゴは Google LLC の商標です。その他すべての企業名および商品名はそれぞれ各社の商標または登録商標です。