locustとGKEで負荷テストの実行とローカル実行環境

Googleが公開しているGKE(Google Kubernetes Engine)を利用したlocustの負荷試験環境のDockerイメージを、
locust公式のDockerイメージを使うように変更しました。
ついでにローカルでテストできるようにdocker-compose.ymlも追加しました。

locust公式のDockerイメージを使うことでpipで必要なパッケージをインストールするだけなのでビルドが早くなり、Dockerイメージが軽量になりました。
## ローカル環境
macOS
Docker Desktop for Mac
## GitHub
https://github.com/marv-kashiwabarak/locust_config
## 参考
[locust公式](http://locust.io/)
[locust公式DockerHub](https://hub.docker.com/r/locustio/locust)
[locustドキュメント(Running in Docker)](http://docs.locust.io/en/stable/running-in-docker.html)
[Google Kubernetes Engine を使用した負荷分散テスト](https://cloud.google.com/architecture/distributed-load-testing-using-gke)

## ファイル構成
Googleの提供している[GitHub](https://github.com/GoogleCloudPlatform/distributed-load-testing-using-kubernetes)の環境をベースにlocust公式のDockerイメージを使えるように変更しています。
```
ドキュメントルート
　　├─ docker-locust
　　│　　　　├─　Dockerfile
　　│　　　　├─　run.sh
　　│　　　　└─　source　※locustの実行ファイル
　　│　　  　　　└　main.py
　　├─ kubernetes-config　※k8sの設定ファイル
　　│  ├─　locust-master-controller.yaml
　　│　　 ├─　locust-master-service.yaml
　　│　　 └─　locust-worker-controller.yaml
　　├─ README.md
　　└─ docker-compose.yml　※ローカル用の設定ファイル
```
#### 主な変更点
###### Dockerfile変更
```Dockerfile:docker-locust/Dockerfile
FROM locustio/locust

ADD source /locust-source

ADD run.sh /home/locust/run.sh

EXPOSE 5557 5558 8089

USER root
RUN chown locust:locust /home/locust/run.sh

USER locust
RUN chmod 755 /home/locust/run.sh

ENTRYPOINT ["/home/locust/run.sh"]
```
イメージに「locustio/locust」をしようして「run.sh」のグループと所有者を変更するために一度rootユーザーになっています。
###### docker-compose.yml追加
```yml:docker-compose.yml
version: '3'

services:
    locust_master:
        build: ./docker-locust
        container_name: locust-master
        ports:
            - 8089:8089
        volumes:
            - ./docker-locust/source:/locust-source
        environment:
            - LOCUST_MODE=master
            - TARGET_HOST=http://localhost

    locust_worker:
        build: ./docker-locust
        volumes:
            - ./docker-locust/source:/locust-source
        environment:
            - LOCUST_MODE=worker
            - LOCUST_MASTER=locust-master
            - TARGET_HOST=http://localhost
```
environmentで指定している「TARGET_HOST」は必要に応じて修正
## GKEでの実行方法
「[Google Kubernetes Engine を使用した負荷分散テスト](https://cloud.google.com/architecture/distributed-load-testing-using-gke)」の「環境の設定」に出てくるgitリポジトリを「[https://github.com/marv-kashiwabarak/locust_config](https://github.com/marv-kashiwabarak/locust_config)」に変更して後は同じ。

変更内容は下記のとおりです。
#### 環境の設定
###### 1. GitHub からサンプル リポジトリのクローンを作成します。
```sh
git clone https://github.com/marv-kashiwabarak/locust_config
```
###### 2. 作業ディレクトリをクローニングしたリポジトリに変更します。
```sh
cd locust_config
```
## ローカルでの実行

[https://github.com/marv-kashiwabarak/locust_config](https://github.com/marv-kashiwabarak/locust_config)をクローンします。

#### Web UIで実行
```sh
$ cd [ドキュメントルート]
$ docker-compose up --scale locust_worker=[ワーカー数]
```
起動できたらWeb UIの「[http://localhost:8089/](http://localhost:8089/)」にアクセスします。
#### cliで実行
cliで実行するとWeb UIを使わなくても負荷試験が開始されるのでローカルでのテストが若干簡素化できます。

docker-compose.ymlを編集してcliで実行できるようにします。
```yml:docker-compose.yml
version: '3'

services:
    locust_master:
        build: ./docker-locust
        container_name: locust-master
        ports:
            - 8089:8089
        volumes:
            - ./docker-locust/source:/locust-source
        # コマンド事実行追加 -u:ユーザー数 -r:ユーザーの増加数/秒
        entrypoint: locust -f /locust-source/main.py --host=http://localhost --master --headless -u 1 -r 1

    locust_worker:
        build: ./docker-locust
        volumes:
            - ./docker-locust/source:/locust-source
        environment:
            - LOCUST_MODE=worker
            - LOCUST_MASTER=locust-master
            - TARGET_HOST=http://localhost
```
docker-compose.ymlのlocust_masterにentrypointを追加してコマンド実行できるようにします。
起動はWeb UIと同じ下記コマンドで起動します。

```sh
$ cd [ドキュメントルート]
$ docker-compose up --scale locust_worker=[ワーカー数]
```
起動したら負荷試験が開始され下記のように実行結果を随時出力してくれます。
```
locust-master    |  Name                                                                              # reqs      # fails  |     Avg     Min     Max  Median  |   req/s failures/s
locust-master    | ----------------------------------------------------------------------------------------------------------------------------------------------------------------
locust-master    |  GET /                                                                                  4     0(0.00%)  |      46      37      53      44  |    0.33    0.00
locust-master    | ----------------------------------------------------------------------------------------------------------------------------------------------------------------
locust-master    |  Aggregated                                                                             4     0(0.00%)  |      46      37      53      44  |    0.33    0.00
locust-master    |
locust-master    |  Name                                                                              # reqs      # fails  |     Avg     Min     Max  Median  |   req/s failures/s
locust-master    | ----------------------------------------------------------------------------------------------------------------------------------------------------------------
locust-master    |  GET /                                                                                  5     0(0.00%)  |      48      37      53      52  |    0.38    0.00
locust-master    | ----------------------------------------------------------------------------------------------------------------------------------------------------------------
locust-master    |  Aggregated                                                                             5     0(0.00%)  |      48      37      53      52  |    0.38    0.00
locust-master    |
locust-master    |  Name                                                                              # reqs      # fails  |     Avg     Min     Max  Median  |   req/s failures/s
locust-master    | ----------------------------------------------------------------------------------------------------------------------------------------------------------------
locust-master    |  GET /                                                                                  5     0(0.00%)  |      48      37      53      52  |    0.38    0.00
locust-master    | ----------------------------------------------------------------------------------------------------------------------------------------------------------------
locust-master    |  Aggregated                                                                             5     0(0.00%)  |      48      37      53      52  |    0.38    0.00
locust-master    |
```