GKE × Locustによるスケーラブルな負荷試験環境
はじめに
GKE上でLocustを動かす形で負荷試験環境を構築します。
Locustは、Pythonベースで書かれたオープンソースの負荷試験ツールで、複数のマシンに分散された負荷試験をサポートしており、大量ユーザーによるシミュレーションにも対応可能です。
そして、何といってもKubernetesは柔軟なスケールができるため、負荷の大きさを自在に変えながらテストすることが可能となります!
構築手順
作成する負荷試験環境の構成としては以下のような形になります。
今回は、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に保存されます。
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クラスタが作成されます。
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 -
実行すると、このようにデプロイメントとサービスが作成されます。
一旦、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のページが表示されます。
これで構築は以上になります。
手順としては、かなりシンプルであっという間に構築する事ができました!
Locust画面について
Locustのページにアクセスすると、こんな画面が表示されます。
かなりシンプルで以下3点を入力して、試験開始するのみです!
-
Number of users:テストを行うユーザー数を指定
-
Spawn rate:ユーザーを1秒ごとにいくつ増やすかを指定
-
Host:負荷試験対象のURL
テストを開始すると、Chartsタブでリクエスト数・レスポンスタイム・ユーザー数を確認できます。この画面も分かりやすくで便利です!
まとめ
GKEとLocustを使って、簡単に分散型の負荷試験環境を構築する事ができました。GKEで動かしているので、大きめの目標値であっても柔軟にスケールさせて分散型の攻撃ができるのが嬉しいポイントです。
特にハードルもなくお手軽な印象でしたので、負荷試験を考えられている方は是非お試しください!