云原生|为 Chaos Mesh 开发日报系统来提升系统快速恢复能力

声明:本文原文来自CNCF官方博客,由神州数码软件工程师李磊在 PingCAP 博客 上发表。经CNCF授权,由 西狩xs 将文章翻译成中文, 安然无虞 校对,分享给大家。
云原生|为 Chaos Mesh 开发日报系统来提升系统快速恢复能力
文章图片

Chaos Mesh 是一个可在 Kubernetes 环境中编排混沌实验的云原生混沌工程平台。它允许你通过模拟网络故障、文件系统故障和 Pod 故障等问题来测试系统的恢复能力。每次混沌实验后,你可以通过查看日志来查看测试结果。
但这种方法既不直接也不高效。因此,我决定开发一个可以自动分析日志并生成报告的日报系统。这样,很容易检查日志并定位问题。
在本文中, 我将介绍混沌工程如何帮助我们提高系统恢复能力,以及为什么我们需要一个日报系统来补充 Chaos Mesh。 我也会给大家一些关于如何建立一个日报系统的个人见解,包括我在这个过程中遇到的问题以及我是如何解决它们的。
什么是 Chaos Mesh 以及它如何帮助我们 Chaos Mesh 是一个用于编排 Kubernetes 故障的混沌工程平台。借助 Chaos Mesh,我们可以方便地模拟业务中的各种极端情况,来测试我们的系统是否完好无损。
在我的公司 神州数码,我们将 Chaos Mesh 与我们的 DevOps 平台相结合,提供了一键式 CI/CD 流程。开发人员每次提交代码时,都会触发 CI/CD 流程。在此过程中,系统会构建代码并执行单元测试和 SonarQube 质量检查。然后打包镜像并将其发布到 Kubernetes。在一天结束时,我们的日报系统会拉取每个项目的最新镜像并对其进行混沌工程。
这种模拟不需要修改任何的应用代码;Chaos Mesh 来负责这项繁重的工作。它将各种物理节点故障注入系统,例如网络延迟、网络丢失和网络重复。它还会注入 Kubernetes 故障,例如 Pod 故障或容器故障。这些故障可能会暴露我们的应用代码或系统架构中的漏洞。当漏洞浮出水面时,我们可以在它们对生产造成真正损害之前修复它们。
然而,发现这些漏洞并不容易:必须仔细阅读和分析日志。对于应用开发人员和 Kubernetes 专家来说,这可能是一项艰巨的工作。开发人员可能无法很好地使用 Kubernetes;而 Kubernetes 专家可能也不了解应用程序的逻辑。
这就是 Chaos Mesh 日报系统的用武之地。每日混沌实验后,日报系统收集日志,绘制图表,并提供 Web UI 用于分析系统可能存在的漏洞。
在接下来的章节中,我将解释如何在 Kubernetes 上运行 Chaos Mesh,如何生成日报,并为日报构建一个 Web 应用程序。你还将看到该系统在生产中如何帮助我们的示例。
在 Kubernetes 中运行 Chaos Mesh Chaos Mesh 是为 Kubernetes 设计的,这也是它可以允许用户为特定应用程序向文件系统、Pod 或网络注入故障的重要原因之一。
在早期的文档中,Chaos Mesh 提供了两种在你的机器上快速部署虚拟 Kubernetes 集群的方法: kind 和 minikube。一般来说,部署 Kubernetes 集群和安装 Chaos Mesh 只需要一行命令。但是在本地启动 Kubernetes 集群会影响与网络相关的故障类型。
如果你使用提供的脚本使用 kind 部署 Kubernetes 集群,那么所有 Kubernetes 节点都是虚拟机 (VM)。当你拉取离线镜像时,这会增加难度。为了解决这个问题,你可以将 Kubernetes 集群部署在多台物理机上,每台物理机都充当工作节点。为了加快镜像拉取过程,你可以使用 docker load 命令提前加载所需的镜像。除了上面的两个问题,你可以按照文档安装 kubectl 和 Helm 。
在安装 Chaos Mesh 之前,需要先创建 CRD 资源:

git clone https://github.com/pingcap/chaos-mesh.git cd chaos-mesh # Create CRD resources 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

要运行混沌实验,你必须在 YAML 文件中定义实验并使用 kubectl apply 启动它。在以下示例中,我使用 PodChaos 创建了一个混沌实验来模拟 Pod 故障:
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’

让我们应用这个实验:
kubectl apply -f podfail.yaml

生成日报 出于演示目的,在这篇文章中,我在 TiDB 上运行了所有的混沌实验,这是一个开源的分布式 SQL 数据库。要生成日报,你需要收集日志、过滤错误和警告、绘制图表,然后输出 PDF。
收集日志
通常,在 TiDB 集群上进行混沌实验时,会返回很多错误。要收集这些错误日志,请运行以下 kubectl logs 命令:
kubectl logs -n tidb-test -–since=24h >> tidb.log

在命名空间 tidb-test 中,特定的 Pod 在过去 24 小时内生成的所有日志都会保存到 tidb.log 文件中。
过滤错误和警告
在此步骤中,你必须从日志中过滤错误消息和警告消息。有两种选择:
  • 使用文本处理工具,例如 awk. 这需要精通 Linux/Unix 命令。
  • 写一个脚本。如果你不熟悉 Linux/Unix 命令,这会是更好的选择。
提取的错误和警告消息将在下一步中进行进一步分析。
画图
对于绘图,我推荐 gnuplot,一个 Linux 命令行绘图工具。在下面的示例中,我导入了压力测试结果并创建了一个折线图,以显示当特定 Pod 不可用时每秒查询次数 (QPS) 受到的影响。由于混沌实验是周期性进行的,因此 QPS 的数量呈现出一个规律:它会突然下降,然后迅速恢复正常。
云原生|为 Chaos Mesh 开发日报系统来提升系统快速恢复能力
文章图片

QPS 折线图
生成 PDF 格式的报告
目前,没有可用的 API 用于生成 Chaos Mesh 报告或分析结果。我的建议是生成 PDF 格式的报告,以便在不同的浏览器上可读。就我而言,我使用 gopdf,这是一个允许用户创建 PDF 文件的支持库。它还允许你插入图像或绘制表格,满足混沌工程报告的需求。
最后一步是每天在预定时间简单地运行整个系统。我的选择是 crond,一个在后台执行 cron 作业的命令行工具,用于每天清晨执行命令。所以,当我开始工作时,每天都有一份报告在等着我。
构建日报 Web 应用程序 然而,我想让报告更具可读性和可访问性。如果你可以在 Web 应用程序上查看报告不是更好吗?起初,我想添加一个后端 API 和一个数据库来存储所有报告数据。这听起来很适用,但可能工作量太大,因为我只想知道哪个报告需要进一步排除故障。准确信息可以显示在文件名中,例如:report-2021-07-09-bad.pdf。这样,报告系统的工作量和复杂性会大大降低。
尽管如此,还是需要改进后端接口,丰富报表内容。但就目前而言,一个日常的、可行的报告系统就可以了。
就我而言,我使用 Vue.js 来搭建 Web 应用程序,UI 库使用 antd 。之后,我将自动生成的报告保存到静态资源文件夹 static 来更新页面内容。这允许 Web 应用程序读取静态报告,然后将它们呈现到前端页面。有关详细信息,请查看 在 vue-cli 3 中使用 antd。
下面是我为日报开发的 Web 应用程序示例。红色卡片表示我应该检查测试报告,因为在运行混沌实验后会抛出异常。
云原生|为 Chaos Mesh 开发日报系统来提升系统快速恢复能力
文章图片

日报 Web 应用程序
单击卡片将打开报告,如下所示。我使用 pdf.js 来呈现 PDF。
云原生|为 Chaos Mesh 开发日报系统来提升系统快速恢复能力
文章图片

PDF 格式的日报
概括 Chaos Mesh 日报系统在我们公司上线了四个月。幸运的是,该系统帮助我们在极端情况下发现了多个项目的错误。例如,有一次我们将网络重复和网络丢失故障注入到应用程序中,并将重复和丢包率设置为高水平。结果,应用程序在消息解析和请求分发过程中遇到了意外情况。返回了一个致命错误,程序异常退出。 在日报的帮助下,我们很快得到了具体错误的图表和日志。我们使用该信息轻松定位异常原因,并修复了系统漏洞。
Chaos Mesh 使你能够模拟大多数云原生应用程序可能遇到的故障。在本文中,我创建了一个 PodChaos 实验,观察到当 Pod 不可用时,TiDB 集群中的 QPS 会受到影响。分析日志后,我可以提升系统的健壮性和高可用性。我还构建了一个 Web 应用程序来生成用于故障排除和调试的日报。你也可以自定义报告以满足自己的要求。
【云原生|为 Chaos Mesh 开发日报系统来提升系统快速恢复能力】聚焦云原生新技术、新实践,帮助开发者群体赢在开发范式转移的新时代。欢迎关注CSDN云原生微信公众号:csdn-cloud

    推荐阅读