Kubernetes 下 web 服务的性能测试三部曲之一:准备工作

语言: CN / TW / HK

欢迎访问我的 GitHub

这里分类和汇总了欣宸的全部原创(含配套源码): https://github.com/zq2599/blog_demos

本篇概览

  • 大家好,从本章开始,我们用 Apache bench 和 JMeter 对 kubernetes 环境中的 web 服务做性能测试,经历过一系列实战后,对我们有以下帮助:

  1. 了解 apache bench 工具的使用;

  2. 了解 JMeter 工具的使用;

  3. 了解 kubernetes 的纵向扩容;

  4. 了解 kubernetes 的横向扩容;

章节介绍

  • 《Kubernetes 下 web 服务的性能测试》由以下三篇组成:

  1. 即本章的工作:准备实战环境,包括 apache bench 和 JMeter 的安装配置,kubernetes 环境,部署 tomcat 服务;

  2. 实战纵向扩容,增强单个 Pod 的配置,用 apache bench 和 JMeter 验证扩容效果;

  3. 实战横向扩容,增加 Pod 数量,用 apache bench 和 JMeter 验证扩容效果;

实战步骤

  • 本章我们要做以下事情:

  1. 规划环境;

  2. 准备 Tomcat 服务的镜像;

  3. 在 kubernetes 创建 Tomcat 服务的 deployment 和 service;

  4. 安装 Apache bench;

  5. 用 Apache bench 测试 Tomcat 服务的性能;

  6. 安装 JMeter;

  7. 用 JMeter 测试 Tomcat 服务的性能;

环境规划

  • 整个实战需要四台机器,分别是 k8s master、k8s node、Apache bench 所在机器,JMeter 所在机器(win10),如下图:

  • 整理信息列表如下:

准备 Tomcat 服务的镜像

  • 用于测试的是个 springboot 的 web 服务,我们要将此 springboot 工程构建成 docker 镜像,这样 kubernetes 环境才能创建此服务的 Pod;

  • 镜像名称:bolingcavalry/k8stomcatdemo:0.0.5,已经上传到 hub.docker.com,您可以直接使用这个镜像;

  • 如果您想自己开发一个 web 镜像,请参考文章 《kubernetes下的Nginx加Tomcat三部曲之二:细说开发》 ,参考源码在 GitHub 可以下载,如下表所示:

  • 这个 git 项目中有多个目录,本次的 web 工程源码放在 k8stomcatdemo,如下图红框所示:

  • 有个细节请注意:Apache bench 在测试的时候,如果 server 每次返回内容的长度都不一样,会被算作失败,因此最好将返回内容长度固定,如下代码,使用"%15s"将 IP 地址的字符串固定为 15 位,不足 15 位就用空格补全:

@RequestMapping(value = "/getserverinfo", method = RequestMethod.GET)    public String getUserInfoWithRequestParam(){        return String.format("server : %15s, time : %s", getIPAddr(), new SimpleDateFormat("yyyy-MM-dd HH:mm:ss").format(new Date()));    }

复制代码

在 kubernetes 创建 Tomcat 服务的 deployment 和 service

  • 接下来我们要在 kubernetes 创建 deployment 和 service 了,请登录可以执行 kubectl 命令的机器:

  1. 创建文件 tomcat.yaml,内容如下:

apiVersion: extensions/v1beta1kind: Deploymentmetadata:  name: tomcathostspec:  replicas: 1  template:    metadata:     labels:       name: tomcathost    spec:     containers:     - name: tomcathost       image: bolingcavalry/k8stomcatdemo:0.0.5       tty: true       ports:       - containerPort: 8080       resources:         requests:           memory: "256Mi"           cpu: "100m"         limits:           memory: "256Mi"           cpu: "100m"

复制代码

  • 如上所示,web 服务的镜像是 bolingcavalry/k8stomcatdemo:0.0.5 ,Pod 数量为 1,使用了 0.1 的 CPU 和 256M 的内存;

  1. 在 tomcat.yaml 所在目录下创建文件 tomcat-svc.yaml,内容如下:

apiVersion: v1kind: Servicemetadata:  name: tomcathostspec:  type: NodePort  ports:       - port: 8080         nodePort: 30008  selector:    name: tomcathost

复制代码

  • 如上所示,使用了 NodePort,这样就能通过节点机器的 IP 地址和 30008 端口访问到此服务了;

  1. 在 tomcat.yaml 所在目录执行命令 kubectl create -f tomcat.yaml,tomcat-svc.yaml ,即可创建 deployment 和 service:

[email protected]:/usr/local/work/ab# kubectl create -f tomcat.yaml,tomcat-svc.yamldeployment "tomcathost" createdservice "tomcathost" created[email protected]:/usr/local/work/ab# kubectl get servicesNAME         TYPE        CLUSTER-IP     EXTERNAL-IP   PORT(S)          AGEkubernetes   ClusterIP   10.43.0.1      <none>        443/TCP          64dtomcathost   NodePort    10.43.131.61   <none>        8080:30008/TCP   5m

复制代码

  1. 在 dashboard 页面可以看到此 Pod 情况如下图,资源符合配置中的限制:

  1. 我的 kubernetes 节点 1 的 IP 地址是 192.168.119.153:,所以在浏览器访问:http://192.168.119.153:30008/getserverinfo ,可以在浏览器页面看到服务端的响应,如下图:

  • 服务端已经 OK,接下来我们开始准备测试吧;

安装 Apache bench;

  • 在 ubuntu16 的电脑上,执行以下命令即可安装 apache bench:

apt-get install -y apache2-utils

复制代码

用 Apache bench 测试 Tomcat 服务的性能

  1. 执行以下命令可以立即开始 ab 测试:

ab -n 20000 -c 100 http://192.168.119.153:30008/getserverinfo

复制代码

  • 上述命令的意思一百个并发用户进行共计两万次请求,请求地址是 http://192.168.119.153:30008/getserverinfo

  1. 等待执行完成结果如下:

[email protected]:/usr/local/work/ab# ab -n 20000 -c 100 http://192.168.119.153:30008/getserverinfoThis is ApacheBench, Version 2.3 <$Revision: 1706008 $>Copyright 1996 Adam Twiss, Zeus Technology Ltd, http://www.zeustech.net/Licensed to The Apache Software Foundation, http://www.apache.org/
Benchmarking 192.168.119.153 (be patient)Completed 2000 requestsCompleted 4000 requestsCompleted 6000 requestsCompleted 8000 requestsCompleted 10000 requestsCompleted 12000 requestsCompleted 14000 requestsCompleted 16000 requestsCompleted 18000 requestsCompleted 20000 requestsFinished 20000 requests

Server Software: Server Hostname: 192.168.119.153Server Port: 30008
Document Path: /getserverinfoDocument Length: 52 bytes
Concurrency Level: 100Time taken for tests: 573.587 secondsComplete requests: 20000Failed requests: 0Total transferred: 3700000 bytesHTML transferred: 1040000 bytesRequests per second: 34.87 [#/sec] (mean)Time per request: 2867.934 [ms] (mean)Time per request: 28.679 [ms] (mean, across all concurrent requests)Transfer rate: 6.30 [Kbytes/sec] received
Connection Times (ms) min mean[+/-sd] median maxConnect: 0 1 1.1 1 43Processing: 3 2860 2641.7 2369 29799Waiting: 3 2725 2553.1 2256 29799Total: 3 2861 2641.6 2370 29800
Percentage of the requests served within a certain time (ms) 50% 2370 66% 2999 75% 3416 80% 3802 90% 5072 95% 6410 98% 8801 99% 16683 100% 29800 (longest request)

复制代码

  • 以上是测试结果,有三个参数需要重点关注:

注意 JIT 的影响

  • 有一点请特别注意:刚启动的 Tomcat 服务,Controller 的代码还没有触发 JIT,所以理论上性能是低于生产环境的,请先执行一次 AB 测试使其完成 JIT(JIT 导致的 CPU 飙高也会在此时发生,后面就不会了),这此的测试结果直接丢弃,然后再重新做一次 AB 测试,取这次的结果;

  • 基本的 Apache bench 操做已经熟悉了,接下来我们开始安装和使用 JMeter 吧;

安装 JMeter

  • 为了使用图形化界面,我的 Jemeter 是安装在 win10 电脑上的;

  1. 确保本地已装好 JDK,并且 JAVA_HOME 环境变量也已配好,JMeter4 需要 JDK8 或者 JDK9;

  2. 去官网下载安装包,地址:http://jmeter.apache.org/download_jmeter.cgi ,安装包如下图红框中所示:

  3. 将安装包解压后,鼠标双击 apache-jmeter-4.0\bin\jmeter.bat 文件,即可启动 JMeter,如下图:

  4. 把语言改成中文吧, Options -> Choose Language -> Chinese (Simplified) ,如下图:

  • JMeter 安装成功了,接下来我们发起一次性能测试吧;

用 JMeter 测试 Tomcat 服务的性能

  • 在"测试计划"上点击右键,选择"添加" -> "Threads(Users)" -> "线程组",如下所示:

  • 在右侧窗口配置新创建的“线程组”的参数,如下图:

  • 将上图四个红框中的参数分别介绍如下:

  • 红框 1 中的名称随便填写;

  • 红框 2 中的"线程数"表示并发数,这里填写 100,和前面的 AB 测试保持一致;

  • 红框 3 中的"Ram-Up Period(in seconds)"表示经过多少秒并发数才达到 100;

  • 红框 4 中的“循环次数”表示每个线程执行多少次请求,填写 200,这样总数就有 20000,和 AB 测试一致了;

  • 在"k8s_tomcat_性能测试"上右键点击,选择"添加" -> "Sampler" -> "Http 请求",如下图:

  • 在 Http 请求的参数配置页面上填写配置信息,如下图所示

  • 将上图六个红框中的参数分别介绍如下:

  • 红框 1 中的"协议"填写"http";

  • 红框 2 中的"服务器名称或 IP"填写"192.168.119.153",就是 kubernetes 节点 IP;

  • 红框 3 中的"端口号"填写"30008";

  • 红框 4 中的"方法"选择"GET";

  • 红框 5 中的"路径"填写"/getserverinfo", 注意要带上斜杠

  • 填写完毕后,记得点击红框 6 中的"保存"按钮;

  • 配置测试结果输出信息,在"HTTP 请求"上点击右键,选择"添加" -> "监听器" -> "聚合报告",如下图:

  • 这里没有需要配置的,直接点击上面的保存按钮即可;

  • JMeter 配置就上面这些了,点击下图红框中的绿色三角形图标,开始测试:

  • 点击左侧的"聚合报告",可以看到一个简易的图表,测试过程中是不断更新的,测试完成后停止更新,如下所示:

  • 这里简单说一下几个数据指标的含义:

小结

  • 至此,咱们第一阶段的目标已经完成了,小结如下:

  1. 压测所需的服务端环境准备完毕;

  2. 压测所需的 AB 和 JMeter 工具准备完毕;

  3. 针对单个 Tomcat 容器的场景,用 AB 和 JMeter 完成了压测,吞吐量为 30 左右,单个请求等待时间为 3 秒左右(AB 和 JMeter 数据是有差异的);

  • 接下来的两篇文章,我们会在 kubernetes 环境做不同类型的扩容,再继续做压测,然后对比扩容效果;

欢迎关注 InfoQ:程序员欣宸

学习路上,你不孤单,欣宸原创一路相伴...