写点什么

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

  • 2022 年 7 月 11 日
  • 本文字数:3710 字

    阅读完需:约 12 分钟

作者: leeray 原文来源:https://tidb.net/blog/7d7b4ce4


【是否原创】是


【首发渠道】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.gitcd chaos-mesh// 创建 CRD 资源kubectl apply -f manifests/
复制代码


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


## For helm 2.Xhelm install chaos-mesh/chaos-mesh --name=chaos-mesh --namespace=chaos-testing## For helm 3.Xhelm 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:latestdocker pull pingcap/tidb:latestdocker pull pingcap/pd:latest
## 导出镜像并将导出文件上传至k8s集群中各主机。docker save -o tikv.tar pingcap/tikv:latestdocker save -o tidb.tar pingcap/tidb:latestdocker save -o pd.tar pingcap/pd:latest
## 在各个主机上导入镜像docker load < tikv.tardocker load < tidb.tardocker 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 官网文档。



chaos-mesh.org


PodChaos Experiment | Chaos Mesh®

This document introduces how to create PodChaos experiments.


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


apiVersion: chaos-mesh.org/v1alpha1kind: PodChaosmetadata:  name: pod-failure-example  namespace: chaos-testingspec:  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 会呈现周期性陡降又恢复的现象。



有了数据与图表。接下来既可以生成报表了。一开始我研究 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 系统进行优化升级。


发布于: 刚刚阅读数: 2
用户头像

TiDB 社区官网:https://tidb.net/ 2021.12.15 加入

TiDB 社区干货传送门是由 TiDB 社区中布道师组委会自发组织的 TiDB 社区优质内容对外宣布的栏目,旨在加深 TiDBer 之间的交流和学习。一起构建有爱、互助、共创共建的 TiDB 社区 https://tidb.net/

评论

发布
暂无评论
基于 k8s 与 Chaos Mesh 构建数据库混沌实验日报系统_实践案例_TiDB 社区干货传送门_InfoQ写作社区