Redian新闻
>
使用 Locust 进行 Kubernetes 分布式性能测试

使用 Locust 进行 Kubernetes 分布式性能测试

科技

新钛云服已累计为您分享648篇技术干货



介绍

在本教程中,我们将会介绍如何集成和使用 Locust 来测试在 Kubernetes 集群中运行的微服务,以下是将会涵盖的内容:

· 如何部署一个Guestbook应用案例

· 一些 Locust 测试用例(我们将使用Guestbook应用进行测试)

· 为 Locust master 和 worker 构建 Docker 镜像

· 以分布式模式部署 Locust 并执行负载测试


要求

在继续之前,请确保您的环境满足要求;首先安装和部署 Docker、Kubernetes 和 Git。

准备 Kubernetes 集群:

在开始讲解如何使用 Locust 测试在 Kubernetes 集群上运行的微服务之前,我们需要准备和部署我们将在集群上测试的服务。这些服务如下图所示。该微服务应用包括以下组件:

· Redis 主从集群(用于读取请求缓存)

· 前端应用程序。该应用程序被配置为使用Redis主节点和从节点写入和读取请求


要在本地部署上述设置,请按照以下步骤操作:

`$> git clone [email protected]:eon01/kubernetes-locust-example.git
$> cd locust/guestbook
$> kubectl apply -f`

上述kubectl应用的YAML 文件中包含的服务和deployment:

· Redis的deployment和service

· 前端的deployment和service

GuestBook将在以下 URL 上提供访问入口:http://127.0.0.1:30625,您可以使用以下命令验证这一点:

$>kubectl get all


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)
   @task
   def index(self):
       self.client.get("/")
   @task
   def update(self):
       self.client.get("/guestbook.php?cmd=set&key=messages&value=,JohnDietish,")



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 [email protected]:eon01/kubernetes-locust-example
$> cd locust/docker
$> docker build -t locust:guestbook

Locust:以分布式模式部署

现在我们为测试用例创建了 Docker 镜像,是时候开始部署分布式 Locust 集群了,我们将使用 Kubernetes。请注意,您可以在没有 Kubernetes 的情况下将 Locust 部署在单个 VM 上,但如果您需要分布式测试,Kubernetes 集群是使用的理想选择。

为了完成这个任务,我们需要创建以下 Kubernetes 资源。

Locust master deployment
Locust master service.
Locust worker deployment.

以上所有资源都是标准的 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

另一方面,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

最后,需要服务对象来公开要通过 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

要在本地部署 Locust pod,请执行以下步骤:

$> git clone [email protected]:eon01/kubernetes-locust-example
$> cd locust/k8s
$> kubectl apply -f .

执行上述命令后,将创建 4 个 Locust 工作节点、一个主节点(以及主 Pod 的服务)。

Locust 界面可通过以下 URL 访问:http://localhost:30627

您可以使用以下命令验证资源的创建:

$> kubectl get all

Locust:运行测试

要开始运行测试用例并测试在 Kubernetes 中运行的 Guestbook 应用程序,我们需要登录到Locust运行界面http://localhost:30627。下图显示了 Locust 登录界面。

前端页面询问将用于执行负载测试的用户数量和用户的生成率。该界面还显示连接到 Locust 安装的工作节点数量。

填写测试内容并点击提交按钮后,您将被重定向到统计页面,Locust 将开始从 Docker 镜像执行定义的测试。

下图显示了 Locust 的统计信息页面,我们可以在其中看到每个已定义用例的统计信息。


如果需要调整负载测试配置,例如增加用户数,您可以点击页面顶部的编辑链接,屏幕上会出现下面的表格输入新的值。

失败和错误也反映在统计页面中;如下图所示,统计页面显示每个测试用例的失败请求计数和速率。

Locust 还为我们提供了另一个视图来显示确切的故障错误,同时可以验证故障或错误的根本原因,如下图所示。

最后,Locust 还提供了其他视图和页面,例如通过图表说明负载测试进度的详情页面、显示有关 Locust worker信息的worker页面以及我们可以下载负载测试数据的下载数据页面。

了解新钛云服

新钛云服荣膺第四届FMCG零售消费品行业CIO年会「年度数字化服务最值得信赖品牌奖」

新钛云服三周岁,公司月营收超600万元,定下百年新钛的发展目标

当IPFS遇见云服务|新钛云服与冰河分布式实验室达成战略协议

新钛云服正式获批工信部ISP/IDC(含互联网资源协作)牌照

深耕专业,矗立鳌头,新钛云服获千万Pre-A轮融资

新钛云服,打造最专业的Cloud MSP+,做企业业务和云之间的桥梁

新钛云服一周年,完成两轮融资,服务五十多家客户

上海某仓储物流电子商务公司混合云解决方案


往期技术干货

Kubernetes扩容到7,500节点的历程

低代码开发,全民开发,淘汰职业程序员!

国内主流公有云VPC使用对比及总结

万字长文:云架构设计原则|附PDF下载

刚刚,OpenStack 第 19 个版本来了,附28项特性详细解读!

Ceph OSD故障排除|万字经验总结

七个用于Docker和Kubernetes防护的安全工具

运维人的终身成长,从清单管理开始|万字长文!

OpenStack与ZStack深度对比:架构、部署、计算存储与网络、运维监控等

什么是云原生?

IT混合云战略:是什么、为什么,如何构建?



点👇分享

戳👇在看

微信扫码关注该文公众号作者

戳这里提交新闻线索和高质量文章给我们。
相关阅读
CK02# ClickHouse分布式表读写原理梳理使用 External Secrets Operator 安全管理 Kubernetes Secrets从价格双轨制到国营和私营企业并存,解释为什么说中国的贪腐是永远清除不了的。。。Chinese Experts Refute ‘Wrong’ Claims on Domestic COVID VaccinesZhihu Accused of Using ‘Violent Layoff’ to Fire Employees地主断粮 海军陆战队断粮 魔都鸳鸯锅日记(四)Kubernetes No CPU Limit:不限制 CPU 可能会更好Kubernetes 节点磁盘故障排查西雅图周末不无聊|带着你心爱的人,一起去Tacoma Water Lantern Festival放水灯叭!Chinese Online Vendors Help Users Hide Their IP Address Location瞬时流量高峰场景下的高可用架构设计:Kubernetes集群如何调优?| Q推荐Chinese Cities Loosen Housing Policies for Three-Child Families[下厨记 IX]自制牛干巴An Online Series on Male Baldness Scrutinizes Appearance AnxietyChinese Soccer’s Financial Woes Deepen as Another Club FoldsChinese Band Uses Lockdown Metaphors as Tour TitlesThe Questionable ‘Chinese-ness’ of Chinese Sci-Fi万字长文 | 使用 RBAC 限制对 Kubernetes 资源的访问Hurun China Metaverse Companies with the Greatest Potential 2022一文读懂Kubernetes 与 DockerData上岸 | Intern刚入职,公司就要给我发Senior级Return Offer!精品投行Centerview Partners已开放 金融 2022 Internship!Learning Device Accused of Offering ‘Inappropriate’ ContentShanghai’s 30-Year-Old Bakery Struggles to Beat Lockdown WoesWheat Destroyed Before Harvest Prompts Food Crisis DiscussionIn Cambodia, a Network Rescuing Trafficked Chinese Is UnravelingKubernetes 架构指南 | Linux 中国小妞斯媒专栏 | Chinese children donate pocket money for SL kidsChinese Telecoms Block Incoming Int’l Calls, Texts to Fight ScamChinese Embrace Remote Work — Just Not Under Lockdown蒋介石如何对待民间遍地饿殍的我学语文教语文的一生(45)万字长文| 在 Kubernetes 上设计和测试高可用的 Kafka 集群A Shanghai District Declares Snap Lockdown for COVID TestingIntern刚入职,公司就要给我发Senior级Return Offer!
logo
联系我们隐私协议©2024 redian.news
Redian新闻
Redian.news刊载任何文章,不代表同意其说法或描述,仅为提供更多信息,也不构成任何建议。文章信息的合法性及真实性由其作者负责,与Redian.news及其运营公司无关。欢迎投稿,如发现稿件侵权,或作者不愿在本网发表文章,请版权拥有者通知本网处理。