kubernetes中如何实现分布式负载测试Locust

这篇文章主要介绍了kubernetes中如何实现分布式负载测试Locust,具有一定借鉴价值,感兴趣的朋友可以参考下,希望大家阅读完这篇文章之后大有收获,下面让小编带着大家一起了解一下。

创新互联服务项目包括庆阳网站建设、庆阳网站制作、庆阳网页制作以及庆阳网络营销策划等。多年来,我们专注于互联网行业,利用自身积累的技术优势、行业经验、深度合作伙伴关系等,向广大中小型企业、政府机构等提供互联网行业的解决方案,庆阳网站推广取得了明显的社会效益与经济效益。目前,我们服务的客户以成都为中心已经辐射到庆阳省份的部分城市,未来相信会继续扩大服务区域并继续获得客户的支持与信任!

一: 前言

  本文介绍如何在Kubernetes集群中对一个应用进行分布式测试,sample-webapp是一个简单的web测试应用。测试工具使用Locust.

二:Locust 介绍

  Locust是一个用于可扩展的,分布式的,性能测试的,开源的,用Python编写框架/工具.

在Locust测试框架中,测试场景是采用纯Python脚本进行描述的。对于最常见的HTTP(S)协议的系统,Locust采用Python的requests库作为客户端,使得脚本编写大大简化,富有表现力的同时且极具美感。而对于其它协议类型的系统,Locust也提供了接口,只要我们能采用Python编写对应的请求客户端,就能方便地采用Locust实现压力测试。从这个角度来说,Locust可以用于压测任意类型的系统。

  在模拟有效并发方面,Locust的优势在于其摒弃了进程和线程,完全基于事件驱动,使用gevent提供的非阻塞IO和coroutine来实现网络层的并发请求,因此即使是单台压力机也能产生数千并发请求数;再加上对分布式运行的支持,理论上来说,Locust能在使用较少压力机的前提下支持极高并发数的测试。
Locust脚本示例:

  1. from locust import HttpLocust, TaskSet, task

  2. class WebsiteTasks(TaskSet):

  3.     def on_start(self):

  4.         self.client.post("/login", {

  5.             "username": "test",

  6.             "password": "123456"

  7.         })

  8.     @task(2)

  9.     def index(self):

  10.         self.client.get("/")

  11.     @task(1)

  12.     def about(self):

  13.         self.client.get("/about/")

  14. class WebsiteUser(HttpLocust):

  15.     task_set = WebsiteTasks

  16.     host = "http://debugtalk.com"

  17.     min_wait = 1000

  18.     max_wait = 5000

在这个示例中,定义了针对http://debugtalk.com网站的测试场景:先模拟用户登录系统,然后随机地访问首页(/)和关于页面(/about/),请求比例为2:1;并且,在测试过程中,两次请求的间隔时间为1~5秒间的随机值。

三:部署测试WEB应用

sample-webapp-controller.yaml

  1. kind: ReplicationController

  2. apiVersion: v1

  3. metadata:

  4.   name: sample-webapp

  5.   namespace: kube-system

  6.   labels:

  7.     name: sample-webapp

  8. spec:

  9.   selector:

  10.     name: sample-webapp

  11.   replicas: 1

  12.   template:

  13.     metadata:

  14.       labels:

  15.         name: sample-webapp

  16.     spec:

  17.       containers:

  18.       - name: sample-webapp

  19.         image: index.tenxcloud.com/jimmy/k8s-sample-webapp:latest

  20.         ports:

  21.         - containerPort: 8000

sample-webapp-service.yaml

  1. kind: Service

  2. apiVersion: v1

  3. metadata:

  4.   name: sample-webapp

  5.   namespace: kube-system

  6.   labels:

  7.     name: sample-webapp

  8. spec:

  9.   ports:

  10.     - port: 8000

  11.   selector:

  12.     name: sample-webapp

kubectl create -f sample-webapp-controller.yaml
kubectl create -f sample-webapp-service.yaml

四:部署Locust

locust-master-controller.yaml

  1. kind: ReplicationController

  2. apiVersion: v1

  3. metadata:

  4.   name: locust-master

  5.   namespace: kube-system

  6.   labels:

  7.     name: locust

  8.     role: master

  9. spec:

  10.   replicas: 1

  11.   selector:

  12.     name: locust

  13.     role: master

  14.   template:

  15.     metadata:

  16.       labels:

  17.         name: locust

  18.         role: master

  19.     spec:

  20.       containers:

  21.         - name: locust

  22.           image: index.tenxcloud.com/jimmy/locust-tasks:latest

  23.           env:

  24.             - name: LOCUST_MODE

  25.               value: master

  26.             - name: TARGET_HOST

  27.               value: http://sample-webapp:8000

  28.           ports:

  29.             - name: loc-master-web

  30.               containerPort: 8089

  31.               protocol: TCP

  32.             - name: loc-master-p1

  33.               containerPort: 5557

  34.               protocol: TCP

  35.             - name: loc-master-p2

  36.               containerPort: 5558

  37.               protocol: TCP

locust-master-service.yaml

  1. kind: Service

  2. apiVersion: v1

  3. metadata:

  4.   name: locust-master

  5.   namespace: kube-system

  6.   labels:

  7.     name: locust

  8.     role: master

  9. spec:

  10.   ports:

  11.     - port: 8089

  12.       targetPort: loc-master-web

  13.       protocol: TCP

  14.       name: loc-master-web

  15.     - port: 5557

  16.       targetPort: loc-master-p1

  17.       protocol: TCP

  18.       name: loc-master-p1

  19.     - port: 5558

  20.       targetPort: loc-master-p2

  21.       protocol: TCP

  22.       name: loc-master-p2

  23.   selector:

  24.     name: locust

  25.     role: master

locust-worker-controller.yaml

  1. kind: ReplicationController

  2. apiVersion: v1

  3. metadata:

  4.   name: locust-worker

  5.   namespace: kube-system

  6.   labels:

  7.     name: locust

  8.     role: worker

  9. spec:

  10.   replicas: 1

  11.   selector:

  12.     name: locust

  13.     role: worker

  14.   template:

  15.     metadata:

  16.       labels:

  17.         name: locust

  18.         role: worker

  19.     spec:

  20.       containers:

  21.         - name: locust

  22.           image: index.tenxcloud.com/jimmy/locust-tasks:latest

  23.           env:

  24.             - name: LOCUST_MODE

  25.               value: worker

  26.             - name: LOCUST_MASTER

  27.               value: locust-master

  28.             - name: TARGET_HOST

  29.               value: http://sample-webapp:8000

kubectl create -f locust-master-controller.yaml
kubectl create -f locust-master-service.yaml
kubectl create -f locust-worker-controller.yaml

五:配置Traefik

  1. - host: locust.donkey

  2.     http:

  3.       paths:

  4.       - path: /

  5.         backend:

  6.           serviceName: locust-master

  7.           servicePort: 8089

kubectl replace -f ingress.yaml

六:执行测试
访问http://locust.donkey/  设置测试参数,进行测试
kubernetes中如何实现分布式负载测试Locust

感谢你能够认真阅读完这篇文章,希望小编分享的“kubernetes中如何实现分布式负载测试Locust”这篇文章对大家有帮助,同时也希望大家多多支持创新互联,关注创新互联行业资讯频道,更多相关知识等着你来学习!


当前文章:kubernetes中如何实现分布式负载测试Locust
网站URL:http://ybzwz.com/article/gepdgs.html