MeterSphere 1.20 LTS 版本自 2022 年4月份发布至今,已经维护了20多个小版本。同时,主线版本也更新到了2.10,实现了很多新功能和优化,并在 2023 年 5 月 25 号正式发布了 2.10 LTS 版本。本文简要说明新版本架构上的差异以及使用 MeterSphere官方提供的的 helm-chart 进行升级。
1 版本变更说明 {#heading-1}
1.1 架构说明 {#heading-2}
与 1.20 LTS 相比,2.10 LTS 使用了微服务架构,按功能模块拆分成了多个微服务,正式从单体应用架构升级至微服务架构。相较之前单体应用架构的各种弊端如:单个服务故障会导致整体服务不可用、系统启动慢、无法满足用户按需配置、服务组件水平扩展难和工程代码难以维护等问题。微服务架构将各个模块的功能应用拆分为不同的组件,便于快速构建、扩展及维护。
1.2 组件说明 {#heading-3}
● **GateWay:**API 网关;
● **Eureka:**服务注册中心;
● **工作台:**MeterSphere 项目的工作台模块;
● **项目设置:**MeterSphere 项目的项目设置模块;
● **测试跟踪:**MeterSphere 项目的测试跟踪模块;
● **接口测试:**MeterSphere 项目的接口测试模块;
● **UI 测试:**MeterSphere 项目的UI 测试模块;
● **性能测试:**MeterSphere 项目的性能测试模块
● **系统设置:**MeterSphere 项目的系统设置模块;
● **报告统计:**MeterSphere 项目的报告统计模块;
● **Node Controller:**为接口或者性能测试提供独立节点类型的测试资源池;
● **MySQL:**MeterSphere 项目的主要数据均存储在 MySQL;
● **Redis:**MeterSphere 项目登录用户的 Session 和任务队列信息存储在 Redis;
● **Minio:**MeterSphere 项目的分布式对象存储模块;
● **Kafka:**接收 JMeter 产生的接口测试或者性能测试的结果数据;
● **Prometheus:**收集压力机及被测系统的监控数据;
● **Data Streaming:**从 Kafka 中获取接口测试或者性能测试结果数据进行处理后存入 MySQL 数据库;
● **Selenium Grid:**为 UI自动化测试提供运行环境,支持分布式拓展;
2 升级数据备份 {#heading-4}
2.1 关闭定时任务 {#heading-5}
如果之前的定时任务没有关闭,那么在升级过程中,定时任务产生的数据与新版本的数据结构不兼容,将可能导致升级失败,所以在升级前需要手动关闭所有定时任务。如:测试计划定时任务,在页面勾选所有测试计划,批量关闭定时任务;其他测试模块定时任务操作同理。如果定时任务较多,可以通过修改数据库字段批量关闭。
# 连接到数据库关闭定时任务
kubectl exec -it mysql-0 sh -n ms
`#关闭定时任务
mysql -uroot -pPassword123@mysql
use metersphere;
update schedule set enable=0;
exit;`
2.2 备份数据库数据 {#heading-6}
进入mysql pod 备份数据库sql文件
kubectl exec -it mysql-0 sh -n ms
#备份数据
kubectl exec -it mysql-0 sh -n ms
mysqldump -uroot -pPassword123@mysql metersphere > /var/lib/mysql/metersphere.sql
exit;
`#保存到本地目录
kubectl cp -n ms mysql-0:/var/lib/mysql/metersphere.sql ./tmp/metersphere.sql
`
2.3 NFS 挂载目录备份 {#heading-7}
metesphere 相关 jar 包、上传的测试文件等数据存储在nfs,升级前需要同步备份。
# 备份整个nfs挂载目录到tmp目录
cd / #此处为实际 nfs 路径
cp -r nfs_storage/ /tmp cd /tmp
tar -zcvf metersphere-v1.20.xlts-backup.tar.gz nfs_storage/
3 升级MeterSphere应用 {#heading-8}
3.1 下载安装包 {#heading-9}
将 MeterSphere 安装包中的镜像全部加载到系统中,或导入到harbor中,本次演示环境没有配置harbor,直接导入到两个k8s节点中,每个节点都要加载所有镜像:
cd /metersphere-offline-installer-v2.10.1-lts/images
`for i in ``ls`` images; do docker load < $i; done`
3.2 下载v2.10.1-lts helm离线包 {#heading-10}
下载到tmp目录:https://github.com/metersphere/helm-chart/releases
3.3 升级MS应用 {#heading-11}
3.3.1 修改 pvc 挂载权限 并开启ui测试 {#heading-12}
原1.20的 pvc 挂载权限为 ReadWriteOnce,升级过程会出现如下图报错,两个版本 pvc 挂载权限不一致导致无法升级。因此需要针对权限修改为 accessModes: ReadWriteOnce,如果无该报错则无需修改。
创建修改helm配置文件 ,vi upgrade-values.yaml
dataPersistence:
accessModes: ReadWriteOnce
uiTest:
enabled: ture
3.3.2 helm upgrade 升级 {#heading-13}
# 升级部署
helm upgrade metersphere /tmp/metersphere-2.10.1-lts.tgz -n ms -f upgrade-values.yaml
`# 等待服务升级
kubectl get pods -n ms #查看POD部署状态,所有状态都为 Running 即可访问。`
3.4 创建nodePort端口映射 {#heading-14}
创建nodePort 端口映射规则,将 gateway 服务端口映射为nodePort :30801
vi ms-server-nodeport.yaml
`#文件内容为:
apiVersion: v1
kind: Service
metadata:
name: metersphere-server-nodeport
namespace: ms426
spec:
type: NodePort
selector:
app: metersphere-gateway
ports:
- name: metersphere-gateway
port: 8000
targetPort: 8000
nodePort: 30801`
拉起pod
kubectl create -f ms-server-nodeport.yaml
3.5 访问MS {#heading-15}
nodePort 端口映射创建完成,就可以通过映射端口访问(http://nodeIP:30801)MS服务了。
3.6 配置 UI 测试(企业版 Xpack) {#heading-16}
UI测试所需Selenium Hub部署,同样采用Helm Chart部署方式。具体部署方式如下:
# 创建Namespace
kubectl create namespace selenium-grid
添加Helm仓库
========
helm repo add docker-selenium https://www.selenium.dev/docker-selenium
更新
===
helm repo update
查询Selenium Grid的版本
==================
helm search repo docker-selenium --versions
安装最新版本Selenium Grid
===================
helm install selenium-grid docker-selenium/selenium-grid -n selenium-grid
安装完成后服务完全启动
===========
kubectl get pod -n selenium-grid
helm默认部署的node会话session 默认值为1,可以修改添加并发参数:此处改为30
==============================================
`helm upgrade --set SE_NODE_MAX_SESSIONS=30,SE_NODE_OVERRIDE_MAX_SESSIONS=true selenium-grid docker-selenium/selenium-grid -n selenium-grid`
如上图部署完成后返回的地址,可在 metersphere 服务配置 ui 测试使用selenium-grid:http://selenium-hub.selenium-grid.svc:4444
3.7 升级后恢复定时任务 {#heading-17}
页面上的操作,同关闭定时任务操作: 需要将每个模块的定时任务开启。也可以通过连接数据库的方式批量恢复:
# 登录MySQL(以默认部署的MySQL为例)
kubectl exec -it mysql-0 sh -n ms
mysql -uroot -pPassword123@mysql
#开启定时任务
use metersphere;
update schedule set enable=1;
`注意:开启定时任务后,需要检查页面上开关是否同步开启,若没有开启可手动开启`
4 升级常见问题 {#heading-18}
(1)pod 一直处于 Init 状态,无法正常运行。
可以 descirbe pod 查看具体报错信息,做对应调整:
kubectl describe pod metersphere-api-test-5cdc7f75df-662s8
目前遇到问题一般为 kafka 端口变更导致服务连不上 kafka 一直再初始化中。处理办法:重启kafka及对应启动失败pod 。
kubectl rollout restart -n ms deploy metersphere-kafka
kubectl rollout restart -n ms deploy metersphere-api-test