kubernetes實踐之四十六:分散式負載測試Locust

百聯達發表於2018-05-23
一: 前言

  本文介紹如何在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 = ""
  17.     min_wait = 1000
  18.     max_wait = 5000
在這個示例中,定義了針對網站的測試場景:先模擬使用者登入系統,然後隨機地訪問首頁(/)和關於頁面(/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/  設定測試引數,進行測試

來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/28624388/viewspace-2155000/,如需轉載,請註明出處,否則將追究法律責任。

相關文章