【小实验】使用 wrk 的 docker 容器来压测另一个容器

作者:张富春(ahfuzhang),转载时请注明作者和引用链接,谢谢!


GET 请求

想压测容器环境的服务性能,发现两个麻烦:

  • 本地使用 wrk,由于本地网络和容器服务器很远,压测效果不好;
  • wrk 找不到一个独立的二进制版本可以下载;go-wrk 完全不可用。

然后发现 hub.docker.com 上有 wrk 的镜像。
于是用下面的方法启动容器进行压测:
pod_wrk.yaml

apiVersion: v1
kind: Pod
metadata:
  name: wrk
  labels:
    app.kubernetes.io/name: proxy
spec:
  containers:
  - name: wrk
    image: williamyeh/wrk:4.0.2   # hub.docker.com 上的镜像
    command: ["/usr/local/bin/wrk"]
    args: ["-t10","-c600","-d120s","--latency","-H","X-Forwarded-proto: http","-H","X-Forwarded-For: 220. xxx.1.xxx,xxxx","-H","Host: 1.a.com","http://xx.xxx.0.71:32101/abc?size=10"]
    resources:
      requests:
        memory: "512Mi"
        cpu: "2"
      limits:
        memory: "2048Mi"
        cpu: "2"

然后用下面的方法启动容器:

kubectl apply -f stress_test/pod_wrk.yaml --namespace=my-test-devops

压测时间是 120 秒,过后容器会再次启动。不需要压测的时候可以这样删除:

kubectl delete pods wrk --namespace=my-test-devops

POST 请求

wrk 的 post 请求要用到 Lua。
Lua 的文件内容可以放到 configMap 中。
下面是一个完整的例子:

pod_wrk.yaml

apiVersion: v1  # 第一段建一个  congfigMap
data:
  post_json.lua: |
                  wrk.method = "POST"
                  wrk.body   = "{\"param1\":\"123\",\"param2\":\"456\",\"client_ip\":\"10.xx.0.71\",\"extra_args\":\"\",\"path\":\"\",\"schema\":\"\"}"
                  wrk.headers["Content-Type"] = "application/json"

kind: ConfigMap
metadata:
  name: wrk-lua-post-json

---

apiVersion: v1  # 第二段建立容器
kind: Pod
metadata:
  name: wrk
  labels:
    app.kubernetes.io/name: wrk
spec:
  containers:
  - name: wrk
    image: williamyeh/wrk:4.0.2
    command: ["/usr/local/bin/wrk"]
    args: ["-t10","-c500","-d60s","--latency","http://10. xxx.0.71/api/v1/GetURL","-s", "/app/lua/post_json.lua"]
    resources:
      requests:
        memory: "512Mi"
        cpu: "4"
      limits:
        memory: "2048Mi"
        cpu: "4"
    volumeMounts:
      - name: config-volume
        mountPath: /app/lua/
  volumes:
    - name: config-volume
      configMap:
        name: wrk-lua-post-json

创建 configMap 和容器

kubectl apply -f pod_wrk.yaml --namespace=test-devops

查看压测结果

kubectl logs wrk --namespace=test-devops

一组容器压测

有时候担心单个进程的并发度有限,无法提供足够的压力。这时就可以部署一组容器来压测:

  • Deployment_wrk.yaml
apiVersion: v1
data:
  post_json.lua: |
                  wrk.method = "POST"
                  wrk.body   = "{\"fields\":\"123\",\"field2\":\"456\"}"
                  wrk.headers["Content-Type"] = "application/json"

kind: ConfigMap
metadata:
  name: wrk-lua-post-json

---

apiVersion: apps/v1
kind: Deployment
metadata:
  labels:
    app: deployment-wrk
  name: deployment-wrk
spec:
  progressDeadlineSeconds: 600
  replicas: 5
  revisionHistoryLimit: 10
  selector:
    matchLabels:
      app: deployment-wrk
  strategy:
    rollingUpdate:
      maxSurge: 1
      maxUnavailable: 0
    type: RollingUpdate
  template:
    metadata:
      creationTimestamp: null
      labels:
        app: deployment-wrk
    spec:
      affinity: {}
      containers:
      - name: wrk
        image: williamyeh/wrk:4.0.2
        imagePullPolicy: IfNotPresent
        command: ["/usr/local/bin/wrk"]
        args: 
          - "-t2"
          - "-c100"
          - "-d120s"
          - "--latency"
          - "http://10.xxx.0.71:8080/api/v1/GetList"
          - "-s"
          - "/app/lua/post_json.lua"
        resources:
          requests:
            memory: "512Mi"
            cpu: "1"
          limits:
            memory: "2048Mi"
            cpu: "1"
        volumeMounts:
          - name: config-volume
            mountPath: /app/lua/
      volumes:
        - name: config-volume
          configMap:
            name: wrk-lua-post-json
  • replicas 这里启动 5 个容器来压测
  • 创建容器:
    • kubectl apply -f Deployment_wrk.yaml --namespace=test-devops
  • 查看结果,写个稍稍复杂一点的 shell:
    • while true; do (kubectl logs --selector app=deployment-wrk --namespace=test-devops | grep "Requests/sec";sleep 5); done
    • 也可以把所有结果过滤出来,便于统计:kubectl logs --selector app=deployment-wrk --namespace=test-devops | grep "Requests/sec" | awk '{print $2}'

Have fun. 😃

posted on 2023-06-01 17:51  ahfuzhang  阅读(389)  评论(0)    收藏  举报