ABCABC Tech Catalog

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

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

はじめに

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

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

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

構築手順

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

file1

今回は、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に保存されます。

file2

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クラスタが作成されます。

file3

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 -

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

file4

file5

一旦、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のページが表示されます。

file6

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

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

Locust画面について

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

file7

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

  • Number of users:テストを行うユーザー数を指定
  • Spawn rate:ユーザーを1秒ごとにいくつ増やすかを指定
  • Host:負荷試験対象のURL

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

file8

まとめ

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

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

AUTHOR

金谷 洋佑

朝日放送テレビ株式会社 技術局 技術開発部

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

WORK@ABC

技術力を培うための
環境と文化

ABCに昔から根付く「自分たちで開発する」文化を支える環境や取り組みをご紹介します
ABCについてもっと知る