一文看懂混沌网格(Chaos Mesh)工作原理

2023-10-30 23:20

本文主要是介绍一文看懂混沌网格(Chaos Mesh)工作原理,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

声明:本文原文来自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 集群的方法: 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 <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

这篇关于一文看懂混沌网格(Chaos Mesh)工作原理的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/311217

相关文章

Python中使用uv创建环境及原理举例详解

《Python中使用uv创建环境及原理举例详解》uv是Astral团队开发的高性能Python工具,整合包管理、虚拟环境、Python版本控制等功能,:本文主要介绍Python中使用uv创建环境及... 目录一、uv工具简介核心特点:二、安装uv1. 通过pip安装2. 通过脚本安装验证安装:配置镜像源(可

LiteFlow轻量级工作流引擎使用示例详解

《LiteFlow轻量级工作流引擎使用示例详解》:本文主要介绍LiteFlow是一个灵活、简洁且轻量的工作流引擎,适合用于中小型项目和微服务架构中的流程编排,本文给大家介绍LiteFlow轻量级工... 目录1. LiteFlow 主要特点2. 工作流定义方式3. LiteFlow 流程示例4. LiteF

SpringBoot集成LiteFlow实现轻量级工作流引擎的详细过程

《SpringBoot集成LiteFlow实现轻量级工作流引擎的详细过程》LiteFlow是一款专注于逻辑驱动流程编排的轻量级框架,它以组件化方式快速构建和执行业务流程,有效解耦复杂业务逻辑,下面给大... 目录一、基础概念1.1 组件(Component)1.2 规则(Rule)1.3 上下文(Conte

一文全面详解Python变量作用域

《一文全面详解Python变量作用域》变量作用域是Python中非常重要的概念,它决定了在哪里可以访问变量,下面我将用通俗易懂的方式,结合代码示例和图表,带你全面了解Python变量作用域,需要的朋友... 目录一、什么是变量作用域?二、python的四种作用域作用域查找顺序图示三、各作用域详解1. 局部作

Mysql的主从同步/复制的原理分析

《Mysql的主从同步/复制的原理分析》:本文主要介绍Mysql的主从同步/复制的原理分析,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教... 目录为什么要主从同步?mysql主从同步架构有哪些?Mysql主从复制的原理/整体流程级联复制架构为什么好?Mysql主从复制注意

详解如何使用Python构建从数据到文档的自动化工作流

《详解如何使用Python构建从数据到文档的自动化工作流》这篇文章将通过真实工作场景拆解,为大家展示如何用Python构建自动化工作流,让工具代替人力完成这些数字苦力活,感兴趣的小伙伴可以跟随小编一起... 目录一、Excel处理:从数据搬运工到智能分析师二、PDF处理:文档工厂的智能生产线三、邮件自动化:

Nacos注册中心和配置中心的底层原理全面解读

《Nacos注册中心和配置中心的底层原理全面解读》:本文主要介绍Nacos注册中心和配置中心的底层原理的全面解读,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教... 目录临时实例和永久实例为什么 Nacos 要将服务实例分为临时实例和永久实例?1.x 版本和2.x版本的区别

基于Python开发一个有趣的工作时长计算器

《基于Python开发一个有趣的工作时长计算器》随着远程办公和弹性工作制的兴起,个人及团队对于工作时长的准确统计需求日益增长,本文将使用Python和PyQt5打造一个工作时长计算器,感兴趣的小伙伴可... 目录概述功能介绍界面展示php软件使用步骤说明代码详解1.窗口初始化与布局2.工作时长计算核心逻辑3

一文彻底搞懂Java 中的 SPI 是什么

《一文彻底搞懂Java中的SPI是什么》:本文主要介绍Java中的SPI是什么,本篇文章将通过经典题目、实战解析和面试官视角,帮助你从容应对“SPI”相关问题,赢得技术面试的加分项,需要的朋... 目录一、面试主题概述二、高频面试题汇总三、重点题目详解✅ 面试题1:Java 的 SPI 是什么?如何实现一个

RabbitMQ工作模式中的RPC通信模式详解

《RabbitMQ工作模式中的RPC通信模式详解》在RabbitMQ中,RPC模式通过消息队列实现远程调用功能,这篇文章给大家介绍RabbitMQ工作模式之RPC通信模式,感兴趣的朋友一起看看吧... 目录RPC通信模式概述工作流程代码案例引入依赖常量类编写客户端代码编写服务端代码RPC通信模式概述在R