はじめに
本記事では、負荷テストツールであるLocustとGoogle Kubernetes Engine(GKE)と組み合わせて負荷テストを体感します。Kubernetesの柔軟なスケールアップ・ダウン能力によって、負荷の大きさを変えながらテストを行うことが可能となります。
参考:Google Kubernetes Engineを使用した負荷分散テスト
Locustとは
LocustはPythonベースで書かれたオープンソースの負荷テストツールとなります。
GitHub: https://github.com/locustio/locust
公式ページにも載っておりますが、特徴としては以下の3つになります。
- コードに基づいたユーザー挙動の定義
- ダサいUIや膨れ上がったXMLは必要無し
- コードのみのわかりやすい記述が可能
- 分散型でスケーラブル
- 複数のマシンに分散された負荷テストの実行をサポート
- 数百万の同時ユーザーによるシミュレーションが可能
- 歴戦の覇者(battle-tested)で実績がある
- GoogleやMicrosoft、AWSといった多くのユーザー(会社)がLocustを支持
- Battlefield1の戦績確認用Webアプリ開発時に負荷テストとして利用されたため、本当の意味でbattle-tested🤣
構築
では早速、検証を行うための環境を構築していきます。必要なものは以下です。
- Google Cloud環境
- GKE
- AppEngine
- Artifact Registry
- ローカル環境
- gcloud
- kubectl
インフラ側は全てTerraformを利用して構築しようと思います。
※ProjectやVPCの構築、gcloud、kubectlのインストールは割愛します。
GKE
GKEのTerraformコードは量が多いため、以下のリポジトリに配置しました。
https://github.com/bigface0202/terraform-useful-modules/tree/main/google-cloud
また、GKEを利用した検証に関するTIPSになりますが、GKEは立ち上げるまでに約20分少々かかるため、一番最初にGKEを構築しておくと検証がスムーズになります。
AppEngine
Terraform
resource "google_app_engine_application" "app" { |
Artifact Registry
Terraform
resource "google_artifact_registry_repository" "my-repo" { |
デプロイ
ここからはターミナルでの作業がメインとなるため、頻繁に利用する定数などを定義しておきます。適宜、自身で定義した内容に変更してください。
export PROJECT=test-project |
AppEngineにデプロイするアプリケーションはGoogle Cloudが提供するサンプルアプリを利用します。
# Clone the repository |
App Engineへのデプロイが完了後、表示されたURLへ移動すると以下のような画面が表示されます。
![image.png](/images/20240216a/image.png)
次にGKEにLocustと負荷テスト用のタスクをデプロイしたいので、まずはLocustのイメージをビルドします。
各エンドポイント/login
と/metrics
に対して、1:999の割合で呼び出すようなタスクが定義されております。詳細は以下を参照してください。
docker-image/locust-tasks/tasks.py
gcloud builds submit \ |
Cloud Buildを利用することでイメージのビルドとプッシュがgcloudコマンド1回でできるので便利ですね。
イメージがちゃんとビルドできているかどうかをコンソールから確認してみましょう。
イメージのビルドができたのでデプロイしていきます。
# Get cluster's credential |
初めてenvsubst
コマンドを知ったのですが、ターミナル上で定義済みの環境変数を代入出来て便利ですね。
無事にLocustをデプロイできたので、ポートフォワードして画面に接続してみます。
kubectl port-forward svc/locust-master-web -n default 8080:8089 |
http://127.0.0.1:8080/
にアクセスして、以下の画面が表示されることを確認します。
負荷テストしてみる
“Number of users”は負荷テストに利用するユーザーの同時接続数、”Spawn rate”は1秒当たりに何人のユーザーがリクエストを開始するかの数、Hostは接続先になります。
“Start swarming”を押すことでテストが開始されます。
以下の条件でテストを開始したときの画面が次のようになります。
- Number of users: 10
- Spawn rate: 1
右上のSTATUSの部分では現在接続中のユーザー数(5 Users)が表示されており、10Usersまで増えていきます。RPSはRequest Per Secondで、秒間のリクエスト数を表しております。
また、各種タブを切り替えることでテストに関する情報を見ることができます。
- Statistics
- Requestに対するレスポンスの統計情報
- テストを行っているパスに対して個別にみることが可能
- Charts
- RPSやレスポンスタイムの時系列情報をグラフで確認することが可能
- Failures
- リクエストが失敗した場合に、どパスに対してどのMethod失敗したのか、エラーコードは何なのかを確認することが可能
- Exceptions
- 例外発生時のTracebackを確認することが可能
- Current Ratio
- Locustのイメージビルド時にPythonファイルで設定した各パスに対するリクエスト数の割合を確認することが可能
- Download Data
- テスト結果をCSVやレポートとして出力可能
- Workers
- 現在Locustを動作させているPodの数を確認可能
シンプルなUIの作りになっているため、直観的でわかりやすいです。
また、”Download Data”にてレポートを出力できるのですが、テスト結果に対して自動でサマリした状態で出力してくれるので非常に便利です。
また、かなり大きめの負荷をかけたい場合は、Podの数を増やすことで対応可能です。Kubernetesならではですね。
Podを増やしたい場合は以下のコマンドで増やします。
kubectl scale deployment/locust-worker --replicas=10 |
まとめ
本記事では、GKEとLocustを利用した分散型の負荷テストをハンズオン形式で紹介させていただきました。
Locustはシンプルな作りになっているため、特別なキャッチアップも必要なくサクッと使うことができます。
もしアプリのローンチを計画している方は、ローンチ前にLocustを利用した負荷テストをやってみてはいかがでしょうか?