|

2025-02-04

アプリ

GKEでサクッと負荷試験環境を構築してみた

KubernetesGoogle Cloudテスト

GKE × Locustによるスケーラブルな負荷試験環境

はじめに

GKE上でLocustを動かす形で負荷試験環境を構築します。

Locustは、Pythonベースで書かれたオープンソースの負荷試験ツールで、複数のマシンに分散された負荷試験をサポートしており、大量ユーザーによるシミュレーションにも対応可能です。

そして、何といってもKubernetesは柔軟なスケールができるため、負荷の大きさを自在に変えながらテストすることが可能となります!

 

構築手順

作成する負荷試験環境の構成としては以下のような形になります。 image

今回は、Cloud Shellベースで設定を進めていきます。

 

Google Cloud環境のセットアップ

まず、今回使用するAPIをあらかじめ有効化しておきます。

gcloud services enable \ appengine.googleapis.com \ artifactregistry.googleapis.com \ cloudbuild.googleapis.com \ compute.googleapis.com \ cloudresourcemanager.googleapis.com \ container.googleapis.com \ iam.googleapis.com

さらにIAM権限も同様に付与しておきます。

 

コンテナイメージのビルド&プッシュ

Google Cloud公式のGithubリポジトリをクローンして、Dockerfileを含むディレクトリ一式を取得します。

git clone https://github.com/GoogleCloudPlatform/distributed-load-testing-using-kubernetes

 

Artifact Registryにリポジトリを作成し、コンテナイメージをビルドおよびプッシュします。

# Artifact Registryにリポジトリを作成 gcloud artifacts repositories create distributed-load-testing \ --repository-format=docker \ --location=asia-northeast1 \ --description="Distributed load testing with GKE and Locust" # コンテナイメージをビルド&プッシュ cd distributed-load-testing-using-kubernetes gcloud builds submit \ --tag asia-northeast1-docker.pkg.dev/abc-server-load-testing-dev/distributed-load-testing/locust-load-testing:latest \ docker-image

実行すると、イメージがArtifact Registryに保存されます。 image

 

GKEクラスタの作成

GKEにアタッチするサービスアカウントの作成して、権限を付与していきます。

# サービスアカウントの作成 gcloud iam service-accounts create gke-execution \ --display-name "GKE Service Account" # サービスアカウントに権限を付与 gcloud projects add-iam-policy-binding abc-server-load-testing-dev \ --member="serviceAccount:gke-execution@abc-server-load-testing-dev.iam.gserviceaccount.com" \ --role="roles/artifactregistry.reader" gcloud projects add-iam-policy-binding abc-server-load-testing-dev \ --member="serviceAccount:gke-execution@abc-server-load-testing-dev.iam.gserviceaccount.com" \ --role="roles/container.nodeServiceAgent"

 

GKEクラスタを作成します。(ノード数などは必要に応じて変更してください。)

# GKEクラスタを作成 gcloud container clusters create locust-load-testing \ --service-account=gke-execution@abc-server-load-testing-dev.iam.gserviceaccount.com \ --region=asia-northeast1 \ --machine-type=e2-standard-4 \ --enable-autoscaling \ --num-nodes=3 \ --min-nodes=3 \ --max-nodes=10

しばらく待つと、GKEクラスタが作成されます。 image

 

GKEリソースのデプロイ

クローンしてきた中に、必要なGKEリソースのYAMLテンプレートも含まれるので、必要に応じて調整します。

# デプロイメントのYAMLテンプレート内変数を設定 export REGION="asia-northeast1" export PROJECT="abc-server-load-testing-dev" export AR_REPO="distributed-load-testing" export LOCUST_IMAGE_NAME="locust-load-testing" export LOCUST_IMAGE_TAG="latest" export SAMPLE_APP_TARGET="corp-org-dev.asahi.co.jp/index.html" # replica数などをリソースを必要に応じて調整 vi kubernetes-config/locust-master-controller.yaml.tpl vi kubernetes-config/locust-worker-controller.yaml.tpl

例えば、大きな負荷をかけたい場合はワーカーノードの数を大きく設定しておきます。

 

作成したGKEクラスタに、各リソースをデプロイします。

# 各リソースのデプロイ実行(マスターポッド、ワーカーポッド、サービス) envsubst < kubernetes-config/locust-master-controller.yaml.tpl | kubectl apply -f - envsubst < kubernetes-config/locust-worker-controller.yaml.tpl | kubectl apply -f - envsubst < kubernetes-config/locust-master-service.yaml.tpl | kubectl apply -f -

実行すると、このようにデプロイメントとサービスが作成されます。 image image

 

一旦、GKE自体はこれで完成になります!残すはLocustアプリケーションへの接続部分です。

 

Locustへの接続

内部ロードバランサからのアクセスとなるためインターネットからアクセスができません。そのため、同ネットワークにプロキシ用Compute Engineを作成してSSH接続します。

 

ます、プロキシ用のCompute Engineを作成します。

(proxy_passには、locust-master-webのEXTERNAL-IPを指定します。)

gcloud compute instances create-with-container locust-master-web-proxy \ --zone=asia-northeast1-a \ --container-image gcr.io/cloud-marketplace/google/nginx1:latest \ --container-mount-host-path=host-path=/tmp/server.conf,mount-path=/etc/nginx/conf.d/default.conf \ --metadata=startup-script="#! /bin/bash cat <<EOF > /tmp/server.conf server { listen 8089; location / { proxy_pass http://10.146.0.22:8089; } } EOF"

起動スクリプトにより、ポート8089でリクエストを受けると10.146.0.22:8089にプロキシされるよう、Nginxの設定ファイルに記述されます。

 

プロキシ用Compute EngineへのSSHトンネルを開いて接続します。

gcloud compute ssh --zone asia-northeast1-a locust-master-web-proxy -- -N -L 8089:localhost:8089

SSHオプションにより、ローカルマシンのポート8089に接続すると、そのトラフィックがSSHトンネルを通じて、リモートインスタンス上のlocalhost:8089に転送(SSHポートフォワーディング)されます。

 

Cloud ShellのWeb Preview機能を用いて、SSH接続された状態でポート8089を指定すると、Locustのページが表示されます。 image

 

これで構築は以上になります。

手順としては、かなりシンプルであっという間に構築する事ができました!

 

Locust画面について

Locustのページにアクセスすると、こんな画面が表示されます。 image

かなりシンプルで以下3点を入力して、試験開始するのみです!

  • Number of users:テストを行うユーザー数を指定

  • Spawn rate:ユーザーを1秒ごとにいくつ増やすかを指定

  • Host:負荷試験対象のURL

 

テストを開始すると、Chartsタブでリクエスト数・レスポンスタイム・ユーザー数を確認できます。この画面も分かりやすくで便利です! image

 

まとめ

GKEとLocustを使って、簡単に分散型の負荷試験環境を構築する事ができました。GKEで動かしているので、大きめの目標値であっても柔軟にスケールさせて分散型の攻撃ができるのが嬉しいポイントです。

特にハードルもなくお手軽な印象でしたので、負荷試験を考えられている方は是非お試しください!

 


この記事の著者

プロフィール画像

金谷 洋佑

朝日放送グループホールディングス株式会社 DX・メディアデザイン局 R&Dチーム

動画・広告配信を主に取り組んでおり、その傍らでシステムのモダナイズの提案・支援や開発も担当。アプリケーションからネットワーク・セキュリティ・インフラまで幅広く励んでます!