• 博客访问: 844952
  • 博文数量: 254
  • 用 户 组: 普通用户
  • 注册时间: 2013-02-05 14:37
  • 认证徽章:
个人简介

走路 行心 修缘(需要交流的请加我的QQ 273936024)

文章分类

全部博文(254)

文章存档

2018年(64)

2017年(63)

2016年(39)

2015年(20)

2014年(29)

2013年(39)

分类: Docker/K8

2018-05-23 17:02:09

一: 前言

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

二:Locust 介绍

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

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

  在模拟有效并发方面,Locust的优势在于其摒弃了进程和线程,完全基于事件驱动,使用gevent提供的非阻塞IOcoroutine来实现网络层的并发请求,因此即使是单台压力机也能产生数千并发请求数;再加上对分布式运行的支持,理论上来说,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/  设置测试参数,进行测试
阅读(451) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~
评论热议
请登录后评论。

登录 注册