【小实验】使用 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. 😃

浙公网安备 33010602011771号