😊
【負荷テスト】k6-operatorからDatadogへ結果を送信する
※ 個人ブログを閉鎖するので個人ブログに書いていたものを転載
今回はk6-operatorの実行したテスト結果をDatadogで確認できるようにします。内容としては前回までに行った記事の総決算のような感じです!!
k6-operatorはk3d上で起動させています。
k6-operatorからDatadogへ結果を送信する
それでは実施!!
docker-composeとテストスクリプトを用意
テストのリクエスト先はホストPCのdocker-compose上で動いているnginxのデフォルトページを使用するので以下のdocker-compose.yamlを用意。
version: "3.6"
services:
nginx:
image: nginx:latest
container_name: loadtest_nginx
ports:
- "80:80"
テストスクリプトは以下を適当なものを用意。
# k6-operator-sample.js
import { check } from "k6"
import http from "k6/http"
export const options = {
// テストステージ(順番に実行される)
stages: [
// targetは同時実行数、durationは実行時間
{ target: 50, duration: '15s' },
{ target: 100, duration: '15s' }
]
}
// テストケース
export default function () {
const res = http.get(
'http://host.k3d.internal:80' // k3dを動かしているホストPCのポート80
)
check(res, {
'is_status_200': (r) => r.status === 200
})
Kubernetesのリソースを追加
カスタムリソースを作成
k6-operatorでテストを実行する際に必須のファイルです。K6_STATSD_ADDRにdatadog-agent-cluster-ip-service:8125
を指定していますが、こちらは後述するserviceで作成します。
# custome-resource.yml
apiVersion: k6.io/v1alpha1
kind: K6
metadata:
name: k6-load-test
spec:
parallelism: 4
arguments: --rps 1000 --out statsd
script:
configMap:
name: k6-operator-sample
file: k6-operator-sample.js
runner:
env:
- name: K6_STATSD_ENABLE_TAGS
value: "true"
- name: K6_STATSD_ADDR
value: datadog-agent-cluster-ip-service:8125
datadog-agent用のリソース作成
以下3つのファイルを作成します。
- datadog-agentのDeployment
- DeploymentをKubernetes上で公開するService
- datadog-agent用の環境変数を設定するConfigmap
datadog-agentのDeployment
datadog/agentがlatestで動かなかったので7.39を指定しています。(解決したら記事更新するかも)
apiVersion: apps/v1
kind: Deployment
metadata:
name: datadog-agent-deployment
spec:
replicas: 1
selector:
matchLabels:
component: datadog-agent
template:
metadata:
labels:
component: datadog-agent
spec:
containers:
- name: datadog-agent
# 7.4以上にするとエラーになるので一旦こちらにしています
# https://github.com/DataDog/datadog-agent/issues/14152
image: datadog/agent:7.39.2
ports:
- containerPort: 8125
env:
- name: DD_SITE
valueFrom:
configMapKeyRef:
name: env-config
key: DD_SITE
- name: DD_API_KEY
valueFrom:
configMapKeyRef:
name: env-config
key: DD_API_KEY
- name: DD_DOGSTATSD_NON_LOCAL_TRAFFIC
value: "1"
DeploymentをKubernetes上で公開するService
kind: Service
metadata:
name: datadog-agent-cluster-ip-service
spec:
type: ClusterIP
selector:
component: datadog-agent
ports:
- targetPort: 8125
protocol: UDP
port: 8125
datadog-agent用の環境変数を設定するConfigmap
apiVersion: v1
kind: ConfigMap
metadata:
name: env-config
namespace: default
data:
# 自身のDatadogに合わせて修正してください
DD_SITE: us5.datadoghq.com
DD_API_KEY: XXXXXX
テスト実行!!
テストを実行していきます!
docker-compose起動
docker-compose up -d
Kubernetesクラスター作成
k3d cluster create loadtest-cluster
k6-operatorをデプロイ
# k6-operatorクローン
git clone https://github.com/grafana/k6-operator
cd k6-operator
make deploy
各種リソースをapplyしてテストを実行
これで最後!テスト実行できます。(結果の確認は省略します)
# secretの追加
kubectl apply -f ./datadog-agent-configmap.yml
# Datadog deployment
kubectl apply -f ./datadog-agent-deployment.yml
kubectl apply -f ./datadog-agent-cluster-ip-service.yml
# 負荷テスト用のコンフィグマップを作成
kubectl create configmap k6-operator-sample --from-file ./k6-operator-sample.js
# 作成したコンフィグマップを確認するだけ
kubectl describe configmap k6-operator-sample
# カスタムリソースをデプロイするとテストを実行する
kubectl apply -f ./custom-resource.yml
結果の確認
結果の確認は省略します。別記事ではsternを利用したログの確認に関して書いているので必要であれば参考にしてください。
後片付け
以上で本当に完了!
# クラスター削除
k3d cluster delete loadtest-cluster
# docker compose 停止
docker-compose down
最後に
だいぶ苦戦しましたが、他の方があげていたIssueのおかげでなんとか動かすことができました。
今回のコードは以下リポジトリに配置しています。
参考
- datadog-agent issue
- k6-operator issue
Discussion