介绍
在本教程中,我们将会介绍如何集成和使用 Locust 来测试在 Kubernetes 集群中运行的微服务,以下是将会涵盖的内容:
- 如何部署一个Guestbook应用案例。
- 一些 Locust 测试用例(我们将使用Guestbook应用进行测试)。
- 为 Locust master 和 worker 构建 Docker 镜像。
- 以分布式模式部署 Locust 并执行负载测试。
要求
在继续之前,请确保您的环境满足要求;首先安装和部署 Docker、Kubernetes 和 Git。
准备 Kubernetes 集群:
在开始讲解如何使用 Locust 测试在 Kubernetes 集群上运行的微服务之前,我们需要准备和部署我们将在集群上测试的服务。这些服务如下图所示。该微服务应用包括以下组件:
- Redis 主从集群(用于读取请求缓存)。
- 前端应用程序。该应用程序被配置为使用Redis主节点和从节点写入和读取请求。
要在本地部署上述设置,请按照以下步骤操作:
`$> git clone git .com:eon01/kubernetes-locust-example.git
$> cd locust/guestbook
$> kubectl apply -f`
- 1.
- 2.
- 3.
上述kubectl应用的YAML 文件中包含的服务和deployment:
- Redis的deployment和service。
- 前端的deployment和service。
GuestBook将在以下 URL 上提供访问入口:http://127.0.0.1:30625,您可以使用以下命令验证这一点:
$>kubectl get all
- 1.
Locust:简介
性能和负载测试是软件生命周期中最热门的话题之一。这些测试可以为我们提供有关软件应用程序和基础设施设置的性能和健壮性所需的指标和KPI。Locust是可以用来执行用户行为负载测试的工具之一。它依赖流行的python编程语言来定义负载测试场景。这意味着可以执行一些条件行为或进行一些计算。Locust还支持在多个工作节点上运行分布式负载测试。该工具带有一个web界面,用于配置和运行有多种配置的预定义测试。在这篇博文中,我们将介绍使用Locust在分布式模型中测试Guestbook应用程序所需的步骤。为了实现这一目标,我们需要完成以下的内容。
- 定义测试用例(locust 文件)。
- Locust 的 Docker 镜像。
- 部署主从Locust workers。
- 允许 Locust worker 和 master 之间的通信。
Locust:测试用例
我们需要用 Python 编写一些测试用例来测试 GuestBook 应用程序。应用程序界面简单明了,只有一个文本框和一个按钮,如下图所示。
为了简单起见,我们将实现两个用例。
- 在前端页面打开GeustBook。
- 将静态guest姓名添加到GeustBook。
下面的 locust 文件可用于测试这些用例。
from locust import HttpUser, task, between
class MyUser(HttpUser):
wait_time = between(5, 15)
def index(self):
self.client.get("/")
def update(self):
self.client.get("/guestbook.php?cmd=set&key=messages&value=,JohnDietish,")
- 1.
- 2.
- 3.
- 4.
- 5.
- 6.
- 7.
- 8.
- 9.
Locust:Docker 镜像
下一步是使用已定义的用例为 Locust 主从workers构建 Docker 镜像。这些 Docker 镜像稍后将用于在集群上部署 Locust 组件。
以下就是 Locust Docker 镜像文件结构。
我们的 Docker 镜像必须至少包含以下文件:
- Dockerfile:此文件将包含构建 Docker 镜像所需的说明。
- requirements.txt:此文件包含运行 Locust 所需的 Python 库列表。
- test-case.py:这是用 Python 编写的测试用例文件。
- run.sh:一个 shell 脚本,作为 Docker 的入口点来支持 master 和 slave worker。
下面是这个文件的样子:
要在本地构建 Docker 镜像,请按照以下步骤操作:
$> git clone git .com:eon01/kubernetes-locust-example
$> cd locust/docker
$> docker build -t locust:guestbook
- 1.
- 2.
- 3.
Locust:以分布式模式部署
现在我们为测试用例创建了 Docker 镜像,是时候开始部署分布式 Locust 集群了,我们将使用 Kubernetes。请注意,您可以在没有 Kubernetes 的情况下将 Locust 部署在单个 VM 上,但如果您需要分布式测试,Kubernetes 集群是使用的理想选择。
为了完成这个任务,我们需要创建以下 Kubernetes 资源。
Locust master deployment
Locust master service.
Locust worker deployment.
- 1.
- 2.
- 3.
以上所有资源都是标准的 Kubernetes 对象。定义这些对象的最关键因素是为每个对象提供所需环境变量的正确值并开放正确的端口。
下面是主部署的定义文件。
如定义文件所示,将环境变量LOCUST_MODE和TARGET_HOST传递给容器非常重要;否则,容器将不会配置为作为主 Locust 实例运行。
apiVersion: apps/v1
kind: Deployment
metadata:
name: locust-master
labels:
name: locust-master
spec:
replicas: 1
selector:
matchLabels:
app: locust-master
template:
metadata:
labels:
app: locust-master
spec:
containers:
- name: locust-master
image: locust:guestbook
env:
- name: LOCUST_MODE
value: master
- name: TARGET_HOST
value: http://frontend-internal
ports:
- name: loc-master-web
containerPort: 8089
protocol: TCP
- name: loc-master-p1
containerPort: 5557
protocol: TCP
- name: loc-master-p2
containerPort: 5558
protocol: TCP
- 1.
- 2.
- 3.
- 4.
- 5.
- 6.
- 7.
- 8.
- 9.
- 10.
- 11.
- 12.
- 13.
- 14.
- 15.
- 16.
- 17.
- 18.
- 19.
- 20.
- 21.
- 22.
- 23.
- 24.
- 25.
- 26.
- 27.
- 28.
- 29.
- 30.
- 31.
- 32.
- 33.
- 34.
另一方面,worker 定义文件需要为 LOCUST_MODE 传递不同的值,并且它必须传递另一个名为 LOCUST_MASTER 的变量来建立 worker(s) 和 master 之间的通信。下面是部署 Locust 工作池的定义文件:
apiVersion: apps/v1
kind: Deployment
metadata:
name: locust-worker
labels:
name: locust-worker
spec:
replicas: 4
selector:
matchLabels:
app: locust-worker
template:
metadata:
labels:
app: locust-worker
spec:
containers:
- name: locust-worker
image: locust:guestbook
env:
- name: LOCUST_MODE
value: worker
- name: LOCUST_MASTER_URL
value: locust-master
- name: TARGET_HOST
value: http://frontend-internal
- 1.
- 2.
- 3.
- 4.
- 5.
- 6.
- 7.
- 8.
- 9.
- 10.
- 11.
- 12.
- 13.
- 14.
- 15.
- 16.
- 17.
- 18.
- 19.
- 20.
- 21.
- 22.
- 23.
- 24.
- 25.
- 26.
最后,需要服务对象来公开要通过 Web 界面和工作容器访问的主组件。下面是 Locust 服务的定义文件。
kind: ServiceapiVersion: v1
metadata:
name: locust-master
labels:
app: locust-master
spec:
ports:
- port: 5557
targetPort: loc-master-p1
protocol: TCP
name: loc-master-p1
- port: 5558
targetPort: loc-master-p2
protocol: TCP
name: loc-master-p2
selector:
app: locust-master
---
kind: Service
apiVersion: v1
metadata:
name: locust-master-ui
labels:
app: locust-master
spec:
ports:
- port: 8089
targetPort: loc-master-web
protocol: TCP
name: loc-master-web
nodePort: 30627
selector:
app: locust-master
type: NodePort
- 1.
- 2.
- 3.
- 4.
- 5.
- 6.
- 7.
- 8.
- 9.
- 10.
- 11.
- 12.
- 13.
- 14.
- 15.
- 16.
- 17.
- 18.
- 19.
- 20.
- 21.
- 22.
- 23.
- 24.
- 25.
- 26.
- 27.
- 28.
- 29.
- 30.
- 31.
- 32.
- 33.
- 34.
要在本地部署 Locust pod,请执行以下步骤:
$> git clone git .com:eon01/kubernetes-locust-example
$> cd locust/k8s
$> kubectl apply -f .
- 1.
- 2.
- 3.
执行上述命令后,将创建 4 个 Locust 工作节点、一个主节点(以及主 Pod 的服务)。
Locust 界面可通过以下 URL 访问:http://localhost:30627
您可以使用以下命令验证资源的创建:
$> kubectl get all
- 1.
Locust:运行测试
要开始运行测试用例并测试在 Kubernetes 中运行的 Guestbook 应用程序,我们需要登录到Locust运行界面http://localhost:30627。下图显示了 Locust 登录界面。
前端页面询问将用于执行负载测试的用户数量和用户的生成率。该界面还显示连接到 Locust 安装的工作节点数量。
填写测试内容并点击提交按钮后,您将被重定向到统计页面,Locust 将开始从 Docker 镜像执行定义的测试。
下图显示了 Locust 的统计信息页面,我们可以在其中看到每个已定义用例的统计信息。
如果需要调整负载测试配置,例如增加用户数,您可以点击页面顶部的编辑链接,屏幕上会出现下面的表格输入新的值。
失败和错误也反映在统计页面中;如下图所示,统计页面显示每个测试用例的失败请求计数和速率。
Locust 还为我们提供了另一个视图来显示确切的故障错误,同时可以验证故障或错误的根本原因,如下图所示。
最后,Locust 还提供了其他视图和页面,例如通过图表说明负载测试进度的详情页面、显示有关 Locust worker信息的worker页面以及我们可以下载负载测试数据的下载数据页面。