声明:本文原文来自CNCF官方博客,由神州数码软件工程师李磊在 PingCAP 博客 上发表。经CNCF授权,由 西狩xs 将文章翻译成中文, 安然无虞 校对,分享给大家。

在这里插入图片描述

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 集群的方法: kindminikube。一般来说,部署 Kubernetes 集群和安装 Chaos Mesh 只需要一行命令。但是在本地启动 Kubernetes 集群会影响与网络相关的故障类型。

如果你使用提供的脚本使用 kind 部署 Kubernetes 集群,那么所有 Kubernetes 节点都是虚拟机 (VM)。当你拉取离线镜像时,这会增加难度。为了解决这个问题,你可以将 Kubernetes 集群部署在多台物理机上,每台物理机都充当工作节点。为了加快镜像拉取过程,你可以使用 docker load 命令提前加载所需的镜像。除了上面的两个问题,你可以按照文档安装 kubectlHelm

在安装 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 <podname> -n tidb-test -–since=24h >> tidb.log

在命名空间 tidb-test 中,特定的 Pod 在过去 24 小时内生成的所有日志都会保存到 tidb.log 文件中。

过滤错误和警告

在此步骤中,你必须从日志中过滤错误消息和警告消息。有两种选择:

  • 使用文本处理工具,例如 awk. 这需要精通 Linux/Unix 命令。
  • 写一个脚本。如果你不熟悉 Linux/Unix 命令,这会是更好的选择。

提取的错误和警告消息将在下一步中进行进一步分析。

画图

对于绘图,我推荐 gnuplot,一个 Linux 命令行绘图工具。在下面的示例中,我导入了压力测试结果并创建了一个折线图,以显示当特定 Pod 不可用时每秒查询次数 (QPS) 受到的影响。由于混沌实验是周期性进行的,因此 QPS 的数量呈现出一个规律:它会突然下降,然后迅速恢复正常。

在这里插入图片描述

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 应用程序示例。红色卡片表示我应该检查测试报告,因为在运行混沌实验后会抛出异常。

在这里插入图片描述

日报 Web 应用程序

单击卡片将打开报告,如下所示。我使用 pdf.js 来呈现 PDF。

在这里插入图片描述

PDF 格式的日报

总结

Chaos Mesh 日报系统在我们公司上线了四个月。幸运的是,该系统帮助我们在极端情况下发现了多个项目的错误。例如,有一次我们将网络重复和网络丢失故障注入到应用程序中,并将重复和丢包率设置为高水平。结果,应用程序在消息解析和请求分发过程中遇到了意外情况。返回了一个致命错误,程序异常退出。 在日报的帮助下,我们很快得到了具体错误的图表和日志。我们使用该信息轻松定位异常原因,并修复了系统漏洞。

Chaos Mesh 使你能够模拟大多数云原生应用程序可能遇到的故障。在本文中,我创建了一个 PodChaos 实验,观察到当 Pod 不可用时,TiDB 集群中的 QPS 会受到影响。分析日志后,我可以提升系统的健壮性和高可用性。我还构建了一个 Web 应用程序来生成用于故障排除和调试的日报。你也可以自定义报告以满足自己的要求。


聚焦云原生新技术、新实践,帮助开发者群体赢在开发范式转移的新时代。欢迎关注CSDN云原生微信公众号:csdn-cloud

Logo

开源、云原生的融合云平台

更多推荐