K8S集群进行分布式负载测试

news2024/12/26 11:16:39

使用K8S集群执行分布式负载测试

本教程介绍如何使用Kubernetes部署分布式负载测试框架,该框架使用分布式部署的locust 产生压测流量,对一个部署到 K8S集群的 Web 应用执行负载测试,该 Web 应用公开了 REST 格式的端点,以响应传入的 HTTP POST 请求。

关于分布式负载测试的更多资料请查看:

  1. Distributed Load Testing Using Kubernetes

  2. GoogleCloudPlatform/distributed-load-testing-using-kubernetes: Distributed load testing using Kubernetes on Google Container Engine (github.com)

本文借鉴了官方的框架,在官方基础上做了简化修改,支持在本地搭建的K8S集群上进行分布式负载测试。

1. 测试使用的工作负载实例

下图展示了将客户端请求传送到应用的示例工作负载。

在这里插入图片描述

为对该交互进行建模,您可以使用 Locust 这一基于 Python、可跨多个目标路径分发请求的分布式负载测试工具。例如,Locust 可以将请求分发到 /login/metrics 目标路径。工作负载在 Locust 中建模为一组任务。

2. locust分布式负载测试架构

该架构涉及到两个主要组件:

  • Locust 容器映像。
  • 容器编排和管理机制。

Locust 容器映像包含 Locust 软件,包含用于启动 Locust 服务和执行任务的脚本。为尽可能贴近真实客户端的情况,每个 Locust 任务都进行了加权。例如,每一千个客户端总请求发生一次注册。

Kubernetes提供容器编排和管理功能。使用 Kubernetes,您可以指定为负载测试框架奠定基础的容器节点的数量。此外,您还可以将负载测试工作器组织到 pod 中,并指定希望Kubernetes 持续运行的 pod 数量。

为了部署负载测试任务,请执行以下操作:

  1. 部署负载测试主节点。
  2. 部署一组负载测试工作器。您要使用这些负载测试工作器创建大量的流量,以便执行测试。

下图展示了使用示例应用进行负载测试的架构。主 Pod 提供用于操作和监控负载测试的网页界面。工作器 Pod 为接受测试的应用生成 REST 请求流量,并将指标发送到主 Pod。

在这里插入图片描述

2.1 关于负载测试主节点

Locust 主节点是执行负载测试任务的入口点。Locust 主节点配置指定了数个元素,包括容器使用的默认端口:

  • 8089 用于网页界面
  • 55575558 用于与工作器通信

2.2 关于负载测试工作器

Locust 工作器执行负载测试任务,可以使用单个 Deployment 来创建多个 pod。这些 pod 分布在 Kubernetes 集群中。

下图显示了 Locust 主节点与 Locust 工作器之间的关系。

在这里插入图片描述

3. 部署用于测试 Web 应用

sample-webapp 目录下包含一个简单的 web 测试应用,先构建为 docker 镜像。

$ git clone https://gitee.com/lldhsds/distributed-load-testing-using-k8s.git
$ cd distributed-load-testing-using-k8s/sample-webapp/

# 构建镜像
$ docker build -t lldhsds/sample-webapp:20240625 .
# 查看构建的容器镜像
$ docker images | grep sample-webapp
lldhsds/sample-webapp     20240625       c4e7e59ac329   About a minute ago   928MB
# 打包镜像,将镜像导入到其他节点。也可以推送到镜像仓库。
$ docker save -o sample-webapp.tar lldhsds/sample-webapp:20240625

在 kubernetes 上部署 web应用,名字保持默认,sample-webapp

[root@k8s-master manifest-k8s]# pwd
/root/distributed-load-testing-using-k8s/manifest-k8s
# 镜像指向上面构建的镜像,其他信息如副本数根据自己的测试环境调整或者后续修改
[root@k8s-master manifest-k8s]# cat sample-webapp.yaml
kind: Deployment
apiVersion: apps/v1
metadata:
  name: sample-webapp
spec:
  selector:
    matchLabels:
      name: sample-webapp
  replicas: 2
  template:
    metadata:
      labels:
        name: sample-webapp
    spec:
      containers:
      - name: sample-webapp
        image: lldhsds/sample-webapp:20240625
        ports:
        - name: web
          containerPort: 8000
---
kind: Service
apiVersion: v1
metadata:
  name: sample-webapp
  labels:
    name: sample-webapp
spec:
  ports:
    - port: 8000
  selector:
    name: sample-webapp


[root@k8s-master manifest-k8s]# kubectl create -f sample-webapp.yaml

[root@k8s-master manifest-k8s]# kubectl get pod
NAME                             READY   STATUS    RESTARTS   AGE
sample-webapp-65cdc749f7-hd8df   1/1     Running   0          61s
sample-webapp-65cdc749f7-j65sr   1/1     Running   0          61s
[root@k8s-master manifest-k8s]# kubectl get svc
NAME            TYPE        CLUSTER-IP       EXTERNAL-IP   PORT(S)        AGE
kubernetes      ClusterIP   10.96.0.1        <none>        443/TCP        14d
sample-webapp   ClusterIP   10.99.23.223     <none>        8000/TCP       9m52s
# 测试应用正常响应
[root@k8s-master manifest-k8s]# curl http://10.99.23.223:8000
Welcome to the "Distributed Load Testing Using Kubernetes" sample web app

4. 部署 Locust 分布式压测组件

locust-masterlocust-worker 使用同样的容器镜像。

4.1 构建 locust tasks 镜像

locust-masterlocust-worker 使用的都是 locust-tasks 镜像,自定义locust测试脚本,构建为容器镜像:

[root@k8s-master locust]# pwd
/root/distributed-load-testing-using-k8s/locust
[root@k8s-master locust]# cd ..
[root@k8s-master distributed-load-testing-using-k8s]# cd locust/
[root@k8s-master locust]# ls
Dockerfile  locust-tasks
[root@k8s-master locust]# docker build -t lldhsds/locust-tasks:20240625 .
# 查看构建的镜像
[root@k8s-master locust]# docker images | grep locust-tasks
lldhsds/locust-tasks  20240625          0b08d2e86b76   About a minute ago   983MB
# 打包镜像导入到其他节点中
[root@k8s-master locust]# docker save -o locust-tasks.tar lldhsds/locust-tasks:20240625

4.2 部署 locust分布式测试环境

修改master cotnroller 和worker cotnroller 中 spec.template.spec.containers.image 字段,指向自己构建的镜像:

[root@k8s-master manifest-k8s]# pwd
/root/distributed-load-testing-using-k8s/manifest-k8s
[root@k8s-master manifest-k8s]# ls
locust-tasks.yaml  sample-webapp.yaml
[root@k8s-master manifest-k8s]# vim locust-tasks.yaml
...
image:  lldhsds/locust-tasks:20240625
...

部署locust-masterlocust worker,根据需要修改worker节点的副本数:

[root@k8s-master manifest-k8s]# ls
locust-tasks.yaml  sample-webapp.yaml
[root@k8s-master manifest-k8s]# kubectl create -f locust-tasks.yaml
deployment.apps/locust-master created
service/locust-master created
deployment.apps/locust-worker created

# 查看部署的容器
[root@k8s-master manifest-k8s]# kubectl get pod
NAME                             READY   STATUS    RESTARTS   AGE
locust-master-8b64d8b4c-fmjsz    1/1     Running   0          9m52s
locust-worker-84fc79566c-2gjqr   1/1     Running   0          9m51s
locust-worker-84fc79566c-6v8cz   1/1     Running   0          9m51s
sample-webapp-65cdc749f7-hd8df   1/1     Running   0          18m
sample-webapp-65cdc749f7-j65sr   1/1     Running   0          18m
[root@k8s-master manifest-k8s]# kubectl get svc
NAME            TYPE        CLUSTER-IP       EXTERNAL-IP   PORT(S)                                        AGE
kubernetes      ClusterIP   10.96.0.1        <none>        443/TCP                                        14d
locust-master   NodePort    10.109.114.2     <none>        8089:30502/TCP,5557:31739/TCP,5558:32268/TCP   9m55s
sample-webapp   ClusterIP   10.99.23.223     <none>        8000/TCP                                       27m

4.3 指向locust性能测试

使用http://ip:30502即可访问locust web界面,可以看到已经有两个workder节点连接到master。

在这里插入图片描述

配置参数进行测试:

在这里插入图片描述

5. 总结

  1. 基于该架构可以实现K8S环境下应用的分布式压测,借助与K8S易于扩展的能力,可以很容易的调整压测端、应用端的副本数,实现扩缩容;
  2. 本文使用一套K8S集群承载locust分布式测试组件和业务应用,最佳实践情况下,可以将locust部署到单独的K8S集群中,对业务侧K8S进行压测。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1865602.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

编译器优化禁用对计算浮点加法运算时间的影响

编译器优化是现代编译器的重要功能&#xff0c;旨在提升程序的执行效率和性能。然而&#xff0c;在某些特定的测试或精确计算场景中&#xff0c;我们需要禁用这些优化以确保所有计算按预期执行。下面研究在 Keil 编译器中禁用和启用优化对执行多次次浮点除法运算时间的影响。 …

docker搭建mongo分片集群

1、mongo分片集群 MongoDB分片集群是一种可扩展的数据库架构&#xff0c;用于处理大量数据和高并发访问。它将数据分成多个分片&#xff0c;并将这些分片分布在多个服务器上&#xff0c;从而实现数据的平衡存储和并行处理 。 通过使用MongoDB的分片集&#xff0c;可以实现数据…

mobaXterm上传文件进度一直为0%

在这里修改了senssion、重启都没有用 最后发现是文件存放的路径中不能有中文&#xff0c;改了之后就成功上传了

Pixea Plus for Mac:图像编辑的极致体验

Pixea Plus for Mac 是一款专为 Mac 用户设计的强大图像编辑软件。凭借其卓越的性能和丰富的功能&#xff0c;它为用户带来了前所未有的图像编辑体验。无论是专业的设计师&#xff0c;还是业余的摄影爱好者&#xff0c;Pixea Plus 都能满足您对于图像编辑的各种需求。 Pixea P…

Segment any Text:优质文本分割是高质量RAG的必由之路

AI应用开发相关目录 本专栏包括AI应用开发相关内容分享&#xff0c;包括不限于AI算法部署实施细节、AI应用后端分析服务相关概念及开发技巧、AI应用后端应用服务相关概念及开发技巧、AI应用前端实现路径及开发技巧 适用于具备一定算法及Python使用基础的人群 AI应用开发流程概…

权限 chmod

参考&#xff1a; Linux chmod 命令 | 菜鸟教程 (runoob.com) Linux chmod&#xff08;英文全拼&#xff1a;change mode&#xff09;命令是控制用户对文件的权限的命令 Linux/Unix 的文件调用权限分为三级 : 文件所有者&#xff08;Owner Users&#xff09;用户组&#xff08…

音频数据集1--LJSpeech单人语音

LJ Speech Dataset 版本号: 1.1 , 文件大小: 2.6GB 1.简介 1. 1 内容简介 LJS是一个语音数据集&#xff0c;包含 13,100 个音频片段&#xff0c;内容为Linda Johnson(欧美女性)朗读的 7 本书籍段落(非小说类)。每个片段都提供文本转录&#xff0c;片段长度从 1 到 10 秒不等&…

Linux - 札记 - W10: Warning: Changing a readonly file

Linux - 札记 - W10: Warning: Changing a readonly file 这里写目录标题 一、问题描述1. 现象2. 原因 二、解决方案 一、问题描述 1. 现象 在使用 vim 编辑文件时&#xff08;我这里是要编辑 /root/.ssh/authorized_keys&#xff09;提示&#xff1a;W10: Warning: Changing…

成都晨持绪:抖店橱窗怎么卖货

在数字化浪潮席卷而来的今天&#xff0c;抖音平台凭借其强大的流量优势&#xff0c;为许多商家提供了一个新的销售渠道——抖店橱窗。通过有效地利用抖店橱窗&#xff0c;商家可以吸引更多潜在顾客&#xff0c;增加销售额。 要有效利用抖店橱窗进行销售&#xff0c;首要任务是精…

【曦灵平台】深度体验百度智能云曦灵平台之数字人3.0、声音克隆、直播等功能,AI加持就是不一样,快来一起体验

目录 资产数字人 2D数字人克隆声音克隆 AI卡片更多功能总结推荐文章 资产 可进行人像与声音的定制&#xff0c;让数字人形象和声音成为我们的专属资产&#xff0c;用于后续的内容生产工作 数字人 这里拍摄的视频分辨率和帧率必须要确保是官方要求&#xff0c;这里博主通过第…

【多模态】BEiT v2

链接&#xff1a;https://arxiv.org/pdf/2208.06366 论文&#xff1a;BEIT V2: Masked Image Modeling with Vector-Quantized Visual Tokenizers Introduction Motivation&#xff1a;Masked image modeling (MIM) 任务在自监督表征学习上取得了不错的成绩&#xff0c;但是现…

ONLYOFFICE 8.1版本桌面编辑器测评:超越想象的办公体验!

在当今数字化办公时代&#xff0c;一个功能强大、操作便捷的办公套件对于提高工作效率至关重要。ONLYOFFICE 8.1作为一款备受瞩目的办公软件&#xff0c;凭借其全面的功能、优异的性能和出色的用户体验&#xff0c;为用户带来了超越想象的办公体验。下面&#xff0c;我们将对ON…

程序员学长 | 快速学会一个算法,RNN

本文来源公众号“程序员学长”&#xff0c;仅用于学术分享&#xff0c;侵权删&#xff0c;干货满满。 原文链接&#xff1a;快速学会一个算法&#xff0c;RNN 今天给大家分享一个超强的算法模型&#xff0c;RNN 循环神经网络&#xff08;Recurrent Neural Network, RNN&…

怎么打印加密的pfd文件,有那些方法?

现在人们的保密意识越来越强了,越来越多的人在完成pdf文档后就会对文档进行保护&#xff0c;但有的PDF文档被添加了密码&#xff0c;限制了打印的权限&#xff0c;导致我们想打印PDF文档的时候就提示我们要输入密码。面对这种情况&#xff0c;我们要怎样才能把PDF文档打印出来呢…

atcoder abc 359

A count takahashi 问题: 思路&#xff1a;字符串比较 代码&#xff1a; #include <bits/stdc.h>using namespace std;int main() {int n;cin >> n;int ans 0;for(int i 1; i < n; i ) {string s;cin >> s;if(s[0] T) ans ;}cout << ans;re…

BenchmarkSQL 对 MySQL 测试时请注意隔离级别!

BenchmarkSQL 是一款经典的开源数据库测试工具&#xff0c;内含了TPC-C测试脚本&#xff0c;可支持 Oracle、MySQL、PostgreSQL、SQL Server以及一些国产数据库的基准测试。 作者&#xff1a;李彬&#xff0c;爱可生 DBA 团队成员&#xff0c;负责项目日常问题处理及公司平台问…

机器学习--概念理解

知识点 一、机器学习概述 人工智能 机器学习 深度学习 学习的范围&#xff1a;模式识别、数据挖掘、统计学习、计算机视觉、语音识别、自然语言处理 可以解决的问题&#xff1a;给定数据的预测问题 二、机器学习的类型 监督学习 分类 回归 无监督学习 聚类 降维 强化…

【Java Web】会话管理

目录 一、为什么需要会话管理&#xff1f; 二、会话管理机制 三、Cookie概述 四、HttpSession概述 4.1 HttpSession时效性 一、为什么需要会话管理&#xff1f; HTTP协议在设计之初就是无状态的&#xff0c;所谓无状态就是在浏览器和服务器之间的通信过程中&#xff0c;服务器并…

免费录屏软件哪个好?录屏软件,分享3款免费工具

在日常生活或者工作中&#xff0c;录屏软件已经成为我们的得力助手。无论是教学、演示、娱乐&#xff0c;录屏软件都能为我们带来极大的便利。然而&#xff0c;市面上有些录屏软件的价格却十分的昂贵&#xff0c;让人望而却步。那么市面上到底有没有免费的录屏软件&#xff1f;…

MySQL的jdbc、odbc驱动版本必须和MySQL版本一样吗?

MySQL的版本和JDBC&#xff0c;ODBC驱动版本大体一致就可以 比如说MySQL的版本是8.0.35&#xff0c;您可以用8.0.19版本的JDBC,ODBC。或者8.0.31的版本。 除此之外我也查看了其他资料&#xff0c;这个哥们总结的也不错&#xff0c;我把链接放到这里 MySQL JDBC驱动版本与数据…