Google Container EngineとLocustを使って負荷テスト環境をさくっと作る
GKE+Locustの負荷テスト環境を作ろうと思った背景
GKEとLocustを選んでみた理由としては以下のようなポイントでした。
- インスタンスは秒課金なので気軽に利用できる
- GKE(k8s)なので動的ポートマッピングの設定などが簡単
- Locustは単なるpythonのスクリプトのため、urlでアクセスする以外にbotoを使ったKinesisへのアクセスなどの負荷テストも再現できる
- Node数10ぐらいにすれば
1000req/s
も再現できた
負荷テストのキモはシナリオを作るところにあるので、どうせなら、他の人も気軽に環境を作れるようにしとこうと思って作りました。
kinesisに対して実行するLocustとGKE上の構成図
- Locustはバッタやイナゴという意味で大量に虫の大群が襲ってくるイメージだと思う
- MasterとSlave構成をとることができてZeroMQを使って協調動作する
- k8sのReplica SetでSlaveの増減は簡単
- k8sだから動的ポートマッピング、サービスディスカバリなど自動的にやってくれる
- ClusterのNode数も簡単に増やせるし、実行してすぐに消せば課金も$1いかないぐらい
- k8sのyamlを書いてhelm(k8sのパッケージマネージャ的なやつ)で簡単にinstallできるようにしといた
Locustの実行中のイメージ
使い方
コードなどはこちらにあります。Rakeタスクで色々セットアップできるようになっています。 GKE前提になってますが、その他はいろいろ読みかえれば使えるはず・・!
ざっくり言うと、こんな流れです。
1. シナリオを実行するlocustのtaskを作成
2. rake cluster:create
でGKE作成
3. rake helm:install
でデプロイ
4. web UIから実行
シナリオを作るところは、pythonでできた負荷テストツールであるLocustを参考になんでも書けます。
ただのpythonのスクリプトなので、webアクセス以外の負荷テストのシナリオを書くことも可能です。例として、kinesisにアクセスするexampleのtaskもおいてあります。
まとめ
k8sとhelm便利