まずは結論
こんな環境が Google Container Engine 上に一発で作れるスクリプトとDocker Imageを作った。
要素技術
Locust
Python製OSSの負荷テストツール。分散テストモードがあって、簡単に複数台から負荷をかけるクラスタを構築することができる。今回は、環境変数で master, slave を切り替えられる Docker Image をベースにしている。
Docker Private Registry
Google Container Engine で private repository を利用する方法を参照してください。
使い方
事前準備
- ビルドサーバに gcloud SDK をインストールし、認証が終わっていること
- gcloud コマンドでデフォルトの GCP の PROJECT_ID が設定してあること(下記のコマンドでは --projectId オプションを全て省略しているため)
- GCS に Docker registry 用のバケットを作成していること
テストシナリオの準備
上記のリポジトリを clone(または fork) して、test/locustfile.py を書き換えて、テストユーザの作成やテストデータ(DB)の作成処理なども必要に応じて追加します。
Docker Image の build & push
IMAGE_ID と GCS_BUCKET を設定して、./script/cluster push
するだけ。
$ IMAGE_ID=locust-gke \
GCS_BUCKET=<your-bucket> \
./script/cluster push
共通の環境変数の設定
クラスタ名と作成する GCP の zone を設定します。
$ export GKE_CLUSTER=<your-cluster>
$ export GKE_ZONE=<your-zone>
なお余談ですが、現状、Google Container Engine は region はもとより、zone もまたげないので、multi region とかやりたい場合は、cluster を複数作る必要があります。
Google Container Engine 上に cluster を構築
$ IMAGE_ID=locust-gke \
GCS_BUCKET=<your-bucket> \
GKE_NETWORK=<your-network> ]
TARGET_URL=<your-load-test-target-url> \
LOCUST_SLAVE_COUNT=3 \
./script/cluster start
LOCUST_SLAVE_COUNT
で負荷をかける側のサーバを増減させることができます。
作成が完了したら、kubernetes の web console を開いて、pod/service の配置を確認しましょう。残念ながら現状 SSL の警告がでます。きちんと確認した上で開きましょう。
$ ./script/cluster open-kubernetes
podの名前がGUIDになっているやつがslaveです。
なお、現状 open-X 系のコマンドはMac OS X でしか動きません。すみません。
Locust Web コンソールを開く
$ ./script/cluster open-locust
ちゃんと SLAVES 3
で起動していますね。
後片付け
負荷テストが終わったら、cluster を停止して終了です。
$ ./script/cluster stop
この環境を作った動機
この構成、もともと AWS CLI + ansible で AWS上で実現していた環境を移植したものです。AWS でも負荷テストという意味では実現できていたのですが、以下の問題がありました。概ね解決できたと思います。
ネットワーク帯域がサチる
負荷をかける側はCPU/メモリはそんなに利用しないので、小さいインスタンスを利用したいが、EC2はインスタンスが小さいとネットワーク帯域もせまいので、そこで負荷がかけきれない問題があった。結局大きいインスタンスを利用していたけど、コスト的になんとかしたいという思いがあった。
GKEというか、GCE はネットワークがインスタンスサイズに依存しない(してるかもしれないけど、小さいインスタンスでも同等サイズの AWS EC2 よりネットワークが速い)ので、ネットワーク帯域を大量に使用する負荷テストには向いてると思いました。
起動速度が遅い
どうしても EC2 のインスタンスの起動は時間がかかり、更に ansible も流さないといけないので、複数パターンでテストする場合、どうしても時間がかかってイライラすることもあったのですが、GKEはGCEのインスタンスの起動が速いのと、Docker Imageで構築済みの環境をすぐに立ち上げることができるので、快適でした。Docker Image の build も初回以外は速いですし。
感想
GKE(Google Container Engine)はベータということもあり、実運用で使うにはまだ怖いですが、内部でテストなどで使う分にはとても便利だと思いました。