locust を使っているが、パフォーマンスがあまりよくなくてslaveを起動しないといけないのが微妙に思ったので他のツールがないかを調べてみた。 要件としてはパフォーマンスが高くてデプロイが簡単なこと

k6 が良さそうだった。

負荷テストツール K6 について調べてみた | sreake.com | 株式会社スリーシェイク k6使ったら今までで一番負荷テストが捗った - Qiita k6で始める負荷テスト

ローカルで動かす

ローカルに負荷試験対象のサーバーを立てる

package main
 
import (
	"fmt"
	"log"
	"net/http"
)
 
func main() {
	http.HandleFunc("/", func(w http.ResponseWriter, r *http.Request) {
		fmt.Fprintf(w, "Hello")
	})
	log.Fatal(http.ListenAndServe(":3000", nil))
}
go run main.go

Docker上で動かす

k6をbrew等でインストールしてもよいが、dockerで実行してみる。

script.js を作成

import http from 'k6/http';
 
export default function () {
  http.get('http://host.docker.internal:8080/');
}

イメージをpull

docker pull grafana/k6

実行

docker run --rm -i grafana/k6 run - <k6s_test.js

VU(実行ユーザー数)、duration(実行時間)を指定する場合

docker run --rm -i grafana/k6 run --vus 10 --duration 30s - <k6s_test.js

Kubernetes上で動かす

Running distributed k6 tests on Kubernetes

これの通りにやればできる

git clone https://github.com/grafana/k6-operator && cd k6-operator
kubectl config get-contexts
make deploy 
import http from 'k6/http';
import { check } from 'k6';
 
export const options = {
  stages: [
    { target: 200, duration: '30s' },
    { target: 0, duration: '30s' },
  ],
};
 
export default function () {
  const result = http.get('https://test-api.k6.io/public/crocodiles/');
  check(result, {
    'http response status code is 200': result.status === 200,
  });
}
kubectl create configmap crocodile-stress-test --from-file /path/to/our/test.js
apiVersion: k6.io/v1alpha1
kind: K6
metadata:
  name: k6-sample
spec:
  parallelism: 4
  script:
    configMap:
      name: crocodile-stress-test
      file: test.js
kubectl apply -f /path/to/our/k6/custom-resource.yml

そういえばLocustにもHelm Chartがあった https://github.com/deliveryhero/helm-charts/tree/master/stable/locust

その他