😊

【負荷テスト】k6-operatorからDatadogへ結果を送信する

2023/10/28に公開

※ 個人ブログを閉鎖するので個人ブログに書いていたものを転載

今回は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のおかげでなんとか動かすことができました。
今回のコードは以下リポジトリに配置しています。
https://github.com/i-shinya/k6-github-actions-sample

参考

Discussion