网络和集群性能测试

准备

测试环境

在以下几种环境下进行测试:

  • Kubernetes集群node节点上通过Cluster IP方式访问

  • Kubernetes集群内部通过service访问

  • Kubernetes集群外部通过traefik ingress暴露的地址访问

测试地址

Cluster IP: 10.254.149.31

Service Port:8000

Ingress Host:traefik.sample-webapp.io

测试工具

测试说明

通过向sample-webapp发送curl请求获取响应时间,直接curl后的结果为:

网络延迟测试

场景一、 Kubernetes集群node节点上通过Cluster IP访问

测试命令

10组测试结果

No
time_connect
time_starttransfer
time_total

1

0.000

0.003

0.003

2

0.000

0.002

0.002

3

0.000

0.002

0.002

4

0.000

0.002

0.002

5

0.000

0.002

0.002

6

0.000

0.002

0.002

7

0.000

0.002

0.002

8

0.000

0.002

0.002

9

0.000

0.002

0.002

10

0.000

0.002

0.002

平均响应时间:2ms

时间指标说明

单位:秒

time_connect:建立到服务器的 TCP 连接所用的时间

time_starttransfer:在发出请求之后,Web 服务器返回数据的第一个字节所用的时间

time_total:完成请求所用的时间

场景二、Kubernetes集群内部通过service访问

测试命令

10组测试结果

No
time_connect
time_starttransfer
time_total

1

0.004

0.006

0.006

2

0.004

0.006

0.006

3

0.004

0.006

0.006

4

0.004

0.006

0.006

5

0.004

0.006

0.006

6

0.004

0.006

0.006

7

0.004

0.006

0.006

8

0.004

0.006

0.006

9

0.004

0.006

0.006

10

0.004

0.006

0.006

平均响应时间:6ms

场景三、在公网上通过traefik ingress访问

测试命令

10组测试结果

No
time_connect
time_starttransfer
time_total

1

0.043

0.085

0.085

2

0.052

0.093

0.093

3

0.043

0.082

0.082

4

0.051

0.093

0.093

5

0.068

0.188

0.188

6

0.049

0.089

0.089

7

0.051

0.113

0.113

8

0.055

0.120

0.120

9

0.065

0.126

0.127

10

0.050

0.111

0.111

平均响应时间:110ms

测试结果

在这三种场景下的响应时间测试结果如下:

  • Kubernetes集群node节点上通过Cluster IP方式访问:2ms

  • Kubernetes集群内部通过service访问:6ms

  • Kubernetes集群外部通过traefik ingress暴露的地址访问:110ms

注意:执行测试的node节点/Pod与serivce所在的pod的距离(是否在同一台主机上),对前两个场景可以能会有一定影响。

网络性能测试

网络使用flannel的vxlan模式。

使用iperf进行测试。

服务端命令:

客户端命令:

场景一、主机之间

场景二、不同主机的Pod之间(使用flannel的vxlan模式)

场景三、Node与非同主机的Pod之间(使用flannel的vxlan模式)

场景四、不同主机的Pod之间(使用flannel的host-gw模式)

场景五、Node与非同主机的Pod之间(使用flannel的host-gw模式)

网络性能对比综述

使用Flannel的vxlan模式实现每个pod一个IP的方式,会比宿主机直接互联的网络性能损耗30%~40%,符合网上流传的测试结论。而flannel的host-gw模式比起宿主机互连的网络性能损耗大约是10%。

Vxlan会有一个封包解包的过程,所以会对网络性能造成较大的损耗,而host-gw模式是直接使用路由信息,网络损耗小。

Kubernete的性能测试

参考Kubernetes集群性能测试中的步骤,对kubernetes的性能进行测试。

我的集群版本是Kubernetes1.6.0,首先克隆代码,将kubernetes目录复制到$GOPATH/src/k8s.io/下然后执行:

测试结果

从kubemark输出的日志中可以看到API calls latenciesPerformance

日志里显示,创建90个pod用时40秒以内,平均创建每个pod耗时0.44秒。

不同type的资源类型API请求耗时分布

Resource
Verb
50%
90%
99%

services

DELETE

8.472ms

9.841ms

38.226ms

endpoints

PUT

1.641ms

3.161ms

30.715ms

endpoints

GET

931µs

10.412ms

27.97ms

nodes

PATCH

4.245ms

11.117ms

18.63ms

pods

PUT

2.193ms

2.619ms

17.285ms

log.txt日志中还可以看到更多详细请求的测试指标。

kubernetes-dashboard

注意事项

测试过程中需要用到docker镜像存储在GCE中,需要翻墙下载,我没看到哪里配置这个镜像的地址。该镜像副本已上传时速云:

用到的镜像有如下两个:

  • gcr.io/google_containers/pause-amd64:3.0

  • gcr.io/google_containers/serve_hostname:v1.4

Locust测试

请求统计

Method
Name
# requests
# failures
Median response time
Average response time
Min response time
Max response time
Average Content Size
Requests/s

POST

/login

5070

78

59000

80551

11218

202140

54

1.17

POST

/metrics

5114232

85879

63000

82280

29518

331330

94

1178.77

None

Total

5119302

85957

63000

82279

11218

331330

94

1179.94

响应时间分布

Name
# requests
50%
66%
75%
80%
90%
95%
98%
99%
100%

POST /login

5070

59000

125000

140000

148000

160000

166000

174000

176000

202140

POST /metrics

5114993

63000

127000

142000

149000

160000

166000

172000

176000

331330

None Total

5120063

63000

127000

142000

149000

160000

166000

172000

176000

331330

以上两个表格都是瞬时值。请求失败率在2%左右。

Sample-webapp起了48个pod。

Locust模拟10万用户,每秒增长100个。

locust测试页面

关于Locust的使用请参考Github:https://github.com/rootsongjc/distributed-load-testing-using-kubernetes

参考

最后更新于