LocustをLinode Kubernetes Engine(LKE)で構築して負荷試験をやってみた

# Linodeとは

Linodeについてはこちらを参照。

https://qiita.com/isss802/items/5313c7a6da1d9ed50a38

# Locustとは

LocustはPython製のオープンソースの負荷試験ツールです。

#### 特徴

- 負荷試験のシナリオはPythonで記載できる。
- リアルタイムダッシュボードが用意されており、試験結果の確認できる。
- 並列化できるため、大きな負荷をかけることができる。

https://locust.io/

# Linode Kubernetes Engine (LKE)とは

Linode Kubernetes Engine (LKE) は コンテナ化されたアプリケーションやワークロードを展開・管理するための、フルマネージドのKubernetes(K8s)コンテナオーケストレーションエンジンです。

#### 特徴

- LKEはコンソールから数クリックでプロビジョニングを管理できる。
- Rancher、Helm、オペレーターなど、人気のあるK8s関連ツールとの統合をサポートしている。
- コントロールプレーンは**無料**で利用することができ、オプションで冗長構成(HA)にもすることができる。
- LKEが動作するインスタンスやネットワーク転送料は他クラウドと比べて断然安く、**低コスト**で構築することができる。

https://www.linode.com/ja/products/kubernetes/

# LocustをLinode Kubernetes Engine(LKE)で構築する
今回はHelmを利用してLocustをLKEにインストールします。
Kubernetes上に構築することによって、負荷を行うWorkerを簡単に増やすことができ大規模な負荷試験を行うことができます。
また、Linodeはインスタンス費用が安いのはもちろんのこと、追加のネットワークのアウトバウンド転送料が  **$0.01 / GB**と他クラウドと比べて安く、大規模なネットワークの負荷試験を他のクラウドサービスプロバイダーやオンプレミスへ行う場合でも低コストで実施することができます。


## Linode Kubernetes Engine(LKE)の構築

今回は以下の構成でLKEを構築します。

<img width="400" alt="image.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/49877/72a59ae7-f74f-231b-c8b3-abd7fe7e97f2.png">


LKEはLinodeコンソールから数クリックで作成することができます。
今回は以下のパラメーターで作成を行います。

- Cluster Label : test
- Region : Tokyo/JP
- Kubernetes Version : 1.23
- Node : Linode 2GB / 1 CPU / SSD50GB / Shared CPU x 3台 
- Enable Control Plane : None

本構成の場合には月額30$で運用を始めることができます。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/49877/2890aad3-2f41-8600-eeac-24f9c9ad6f13.png)

Clusterの作成はTerraformでも行うことが可能です。
サンプルはこちらになります。

https://github.com/isss802/linode-terraform-demo/tree/main/linode-kubernetes-engine


インスタンスの選び方についてはこちらを参考に選定してください。

https://qiita.com/isss802/items/c53315615a7e087cc41a

### ダッシュボードの確認とkubeconfigのダウンロード

LKEのダッシュボードからkubectlを利用するためにkubeconfigをダウンロードします。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/49877/0e3c5e5b-b791-7e3f-8283-e2620dccd0db.png)

Kubernetes Dashboardにもアクセスすることが可能で、Podの情報などの確認も行えます。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/49877/0cc8e31e-f9ea-8983-6783-7622df355755.png)

### kubectl設定

ダウンロードしたConfigを配置し、KUBECONFIGに定義します。
```
export KUBECONFIG=test-kubeconfig.yaml
```

作成したnodeの一覧を取得し、接続確認します。

```
kubectl get node

NAME                           STATUS   ROLES    AGE   VERSION
lkexxxxx-xxxxxx-xxxxxxxxxxxx   Ready    <none>   22h   v1.23.6
lkexxxxx-xxxxxx-xxxxxxxxxxxx   Ready    <none>   22h   v1.23.6
lkexxxxx-xxxxxx-xxxxxxxxxxxx   Ready    <none>   22h   v1.23.6
```

### LocustをKubernetes上に構築する

今回はHelmを利用してLocustをLKEにインストールします。

https://github.com/deliveryhero/helm-charts/tree/master/stable/locust

リポジトリを追加し、listで確認します。

```
helm repo add deliveryhero https://charts.deliveryhero.io/
helm repo list
```

ドキュメントを参考に、Locustの負荷試験で利用するシナリオを作成します。
今回は対象のエンドポイントの`/`にGETするのみのサンプルを利用します。

https://docs.locust.io/en/stable/writing-a-locustfile.html

```
vim locustfile.py

from locust import HttpUser, task, between
default_headers = {'User-Agent': 'Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/104.0.0.0 Safari/537.36'}
class WebsiteUser(HttpUser):
    @task
    def get_index(self):
        self.client.get("/", headers=default_headers)
```

Configmapを作成します。

```
kubectl create configmap my-loadtest-locustfile --from-file ./locustfile.py
```

helmを利用してlocustをkubernetes上にインストールします。

```
helm install locust deliveryhero/locust \
--set loadtest.locust_locustfile=locustfile.py \
--set loadtest.locust_locustfile_configmap=my-loadtest-locustfile
```

今回は、レプリカ数を3に変更します。
負荷試験に応じて変更してください。

```
kubectl scale deployment locust-worker --replicas=3
```

### 負荷試験を実施する

管理画面にアクセスするためにポートフォワーディングの設定をします。

```
kubectl --namespace default port-forward service/locust 8089:8089
```

http://0.0.0.0:8089 にアクセスし管理画面にアクセスします。

<img width="400" alt="image.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/49877/dd43c121-a770-43d8-b1cd-483d5521745f.png">


Number of users (peak concurrency)：リクエストを投げるクライアントの最大数
Spawn rate (users started/second)：1秒あたりに増加する秒間ユーザ数
Host (e.g. http://www.example.com )：リクエスト先のURL


試験結果をリアルタイムに確認することができます。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/49877/d8a8c6cd-646b-cdce-2bab-fbd623c4a466.png)

以上で構築は終了です。

## さいごに

Linode Kubernetes Engine(LKE)はKubernetesを低コストで利用することができ、転送料も安いことから大規模の負荷試験などの利用方法にも適しています。
今回のLocustのテストシナリオをカスタマイズすることで様々な環境に合った試験が行えます。


## 関連記事

アカマイ・テクノロジーズ合同会社のQiitaではLinode関連など開発者向けの記事を記載しております。

https://qiita.com/organizations/Akamai