基于 k8s 与 Chaos Mesh 构建数据库混沌实验日报系统

【是否原创】是
【首发渠道】TiDB 社区

基于 k8s 与 Chaos Mesh 构建数据库混沌实验日报系统

一、引言

Chaos Mesh 是 PingCAP 在 2019 年底开源的一个云原生的混沌实验平台。Chaos Mesh 提供在 Kubernetes 平台上进行混沌测试的能力。具体内容见官方博客https://pingcap.com/blog-cn/chaos-mesh/

形象地说,混沌实验就是模拟一个调皮捣蛋的猴子在系统中搞破坏。这是一种比较极端的测试,chaos mesh 提供了网络,io, pod等方面的测试功能。比如 kill pod、pod fail 等功能就是模拟集群节点宕机或故障等情况对系统造成的影响。Chaos mesh 实验对系统的影响可以通过监控,或者是日志来获取。但是这样都不太直观。于是我就计划开发一个日报系统,每天拉取系统最新镜像部署系统,并施加chaos mesh 实验。自动分析日志生成报告。这样一来就不需要人手动查看日志分析系统异常错误了。

于是我根据官方博客中相关文章以及chaos mesh官方文档进行了实践,期间遇到很多问题,逐一解决最终才将系统原型搞出来。于是写了这篇文章跟大家分享一下大致过程以及遇到的问题及解决方法。

二、k8s 系统与 Chaos Mesh 的部署

根据前文得知,Chaos Mesh基于 k8s 系统。这也是它能对指定系统进行 I/O 、Pod、Network 等方面实验的重要原因之一。安装 k8s 系统有多种方式。在 Chaos

Mesh 官网提供了 kind 和 minikube 的两种方式在一个主机上快速搭建虚拟 k8s 集群。只需要一行命令就能拉起一个 k8s 集群并安装好 Chaos mesh服务。但是这样也有缺点。其一、根据博客内容得知:本地启动的 Kubernetes 集群,网络相关的错误注入的功能会受到影响。其二、由于国内网络原因,k8s集群拉取docker镜像将十分缓慢并且非常容易超时导致服务起不来。使用脚本启动的kind集群的worker都是虚拟化的。离线导入镜像的操作不好实现。使用多台主机搭建k8s 集群,每一个主机都是一个worker。只需事先将部署服务需要的镜像通过docker load命令导入,在服务部署时就不用再次从远程仓库拉取,使得服务能够快速搭建起来。除此之外kubectl、helm都按照官网的文档指导安装即可。

接下来就是安装Chaos Mesh的安装。安装之前需要先创建CRD资源。

git clone https://github.com/pingcap/chaos-mesh.git
cd chaos-mesh
// 创建 CRD 资源
kubectl apply -f manifests/

根据helm不同的版本安装Chaos Mesh

## For helm 2.X
helm install chaos-mesh/chaos-mesh --name=chaos-mesh --namespace=chaos-testing
## For helm 3.X
helm install chaos-mesh chaos-mesh/chaos-mesh --namespace=chaos-testing

三、TiDB Operator 与 TiDB 的部署

在 k8s 上部署 TiDB 可以借助 TiDB Operator。具体内容可以参考社区SOP系列文章(https://asktug.com/t/topic/68209)

其中比较重要的步骤就是首先导入crd资源,要不然后面部署TiDB将报错找不到资源。还有一点就是pv的创建,按照文章中配置文件,我们需要创建localstorage类型的pv。我在实际部署时使用的的是longhorn类型的pv,这样就不需要提前创建pv。每当拉起pod,将自动创建pv并挂载。

在整个过程中,可能遇到的最大的问题就是部署服务时拉取镜像太慢。如果当前 k8s 是由多台虚拟机组成,则只需提前将部署服务时需要拉取的镜像下载下来并导入到 k8s集群中各个机器的docker中即可。

## 在一台网络通畅的机器上快速拉取所需镜像
docker pull pingcap/tikv:latest
docker pull pingcap/tidb:latest
docker pull pingcap/pd:latest

## 导出镜像并将导出文件上传至k8s集群中各主机。
docker save -o tikv.tar pingcap/tikv:latest
docker save -o tidb.tar pingcap/tidb:latest
docker save -o pd.tar pingcap/pd:latest

## 在各个主机上导入镜像
docker load < tikv.tar
docker load < tidb.tar
docker load < pd.tar

经过上面的操作,每当部署最新tidb集群时将使用本地docker已有的tidb镜像而不用拉取远程仓库镜像。这种方法同样适用于上文安装chaos mesh的问题。如果不知道使用helm安装chaos mesh时具体会拉取哪些镜像。则可以首先使用helm安装chaos mesh。触发安装过程。然后使用kubctl查看安装内容。

## 查看指定namespace下pod部署情况
kubectl describe pods -n tidb-test

通过上面的命令则可以查看到拉取镜像的信息,因为拉取镜像一般是耗时最长的阶段,所以程序都会停留在这个阶段,如果查看时还在scheduler阶段,则等待一段时间再查看。

四、部署 chaos mesh 混沌实验

部署Chaos Mesh 实验可以通过编写 yaml配置文件,然后通过kubectl apply 命令使其生效。具体可以做哪些实验可以参照Chaos Mesh官网文档。

以podchaos 实验为例,它的配置文件如下:

apiVersion: chaos-mesh.org/v1alpha1
kind: PodChaos
metadata:
  name: pod-failure-example
  namespace: chaos-testing
spec:
  action: pod-failure
  mode: one
  value: ''
  duration: '30s'
  selector:
    namespaces:
      - chaos-demo-1
    labelSelectors:
      'app.kubernetes.io/component': 'tikv'
  scheduler:
    cron: '@every 2m'

这是一个模拟pod fail事件的配置文件。

其中spec.selector.namespaces声明的就是需要对哪些命名空间下的服务进行该实验。spec.scheduler 则声明该实验每两分钟触发一次。

使用如下命令使配置生效

kubectl apply -f podfail.yaml

五、日志收集与分析,自动生成报表

对TiDB集群进行混沌实验,期间可能产生大量报错信息。查看这些错误日志可以通过kubectl命令获取。

kubectl logs podname -n tidb-test --since=24h >> tidb.log

命令中 podname时某个pod的名称,-n 指定的是明明空间。而–since则是拉取过去24h的所有信息。将日志保存到文本文件中。

接下来就是分析,即简单的统计日志中 error,warn等错误信息。

实现这个功能有两中思路,第一种就是linux自带的一些文本处理工具,如 awk等命令,这一点需要对linux比较熟悉。

还有一个就是使用高级语言编写程序统计错误与警告,大部分的高级语言读取并处理文本都比较简单,对linux不熟悉的可以使用编程方式处理日志。

有了数据,接下来可以做两件事情,一个就是绘图,另外一个就是生成报表。

绘图使用linux绘图组件 gnuplot,数据选择sysbench压测的qps数据。绘制一段时间内的qps折线图,反映混沌实验对qps的影响。绘图可以根据数据灵活组织,绘制出不同的折线图,柱状图等等。

以下则是我我是用gnuplot绘制的qps图形,当时施加的混沌实验是pod kill。所以qps会呈现周期性陡降又恢复的现象。

image-20210711105952755

有了数据与图表。接下来既可以生成报表了。一开始我研究chaos mesh官网文档,希望能够有直接可以使用的接口来导出实验报告与结果分析。可惜没有找到。于是只能自己写了。计划生成pdf格式文件,便于各种客户端轻易打开查看。现在各种高级语言基本都有对pdf的支持库。我选择的是gopdf(https://github.com/signintech/gopdf)。
通过readme文档就能知道该如何构建pdf,并想其中插入图片,绘制表格都是十分轻松的事。

最后有一点就是每天定时执行这些程序了,使用linux上的定时工具crond服务就可。配置每天凌晨开始测试,这样一早上就可以查看过去一天的数据库测试报告了。

六、基于antd构建web日报系统

对于web查看系统,我希望越简单越好。一开始计划还要添加后端api接口给前端web页面调用,另外还得有数据库保存每次报告的信息。这样做起来系统确实更加完美。但是考虑实际我的需求只是想直观地看到哪次报告出了问题需要我排查以及对应地日期。所以一切从简,对于这些必要信息,以文件命名的方式保留下来。如report-2021-07-09-bad.pdf。这样这个系统就减少了很多工作量,复杂度也减少了很多。当然,如果后续有时间,肯定是需要完善后端接口功能以及丰富报表内容的。但现在仅做一个能用的原型即可。

对于web系统的构建,使用vue的脚手架工具可以轻松的构建出一个web项目出来。

具体参考antd vue 版本官网(https://www.antdv.com/docs/vue/use-with-vue-cli-cn/)

构建出基础web项目之后在其基础上修改页面内容,以及将上一步骤的自动生成报表保存的地址设置成vue项目静态资源文件夹static。这样web系统就能读取自己项目下静态报表文件,然后简单渲染到页面上了。

初期的效果如下,虽然十分简陋,但是必要的信息都可以查看。

页面状态面板,红色代表在测试中有异常情况,需要查看。

点击查看报告,则将显示事先生成的报告。其中还使用了pdf.js组件,方便pdf的查看。

七、总结

Chaos Mesh 的功能十分强大,能够模拟大部分云原生应用可能遇到的问题。在上文中就使用了podchaos方面的测试功能,发现podfail对tidb集群qps的影响,可以通过日志的方式查看具体原因,优化系统,增强系统的健壮性与高可用性。基于k8s与chaos mesh构建的web系统是为了方便发现问题,定位问题。这一点可以根据个人时间精力不同,对自己的web系统进行优化升级。

7赞

前排围观:call_me_hand:

3赞

前排围观:call_me_hand:

强强强