一文看懂混沌网格(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

相关文章

Redis主从复制实现原理分析

《Redis主从复制实现原理分析》Redis主从复制通过Sync和CommandPropagate阶段实现数据同步,2.8版本后引入Psync指令,根据复制偏移量进行全量或部分同步,优化了数据传输效率... 目录Redis主DodMIK从复制实现原理实现原理Psync: 2.8版本后总结Redis主从复制实

一文带你搞懂Nginx中的配置文件

《一文带你搞懂Nginx中的配置文件》Nginx(发音为“engine-x”)是一款高性能的Web服务器、反向代理服务器和负载均衡器,广泛应用于全球各类网站和应用中,下面就跟随小编一起来了解下如何... 目录摘要一、Nginx 配置文件结构概述二、全局配置(Global Configuration)1. w

深入探索协同过滤:从原理到推荐模块案例

文章目录 前言一、协同过滤1. 基于用户的协同过滤(UserCF)2. 基于物品的协同过滤(ItemCF)3. 相似度计算方法 二、相似度计算方法1. 欧氏距离2. 皮尔逊相关系数3. 杰卡德相似系数4. 余弦相似度 三、推荐模块案例1.基于文章的协同过滤推荐功能2.基于用户的协同过滤推荐功能 前言     在信息过载的时代,推荐系统成为连接用户与内容的桥梁。本文聚焦于

hdu4407(容斥原理)

题意:给一串数字1,2,......n,两个操作:1、修改第k个数字,2、查询区间[l,r]中与n互质的数之和。 解题思路:咱一看,像线段树,但是如果用线段树做,那么每个区间一定要记录所有的素因子,这样会超内存。然后我就做不来了。后来看了题解,原来是用容斥原理来做的。还记得这道题目吗?求区间[1,r]中与p互质的数的个数,如果不会的话就先去做那题吧。现在这题是求区间[l,r]中与n互质的数的和

hdu4407容斥原理

题意: 有一个元素为 1~n 的数列{An},有2种操作(1000次): 1、求某段区间 [a,b] 中与 p 互质的数的和。 2、将数列中某个位置元素的值改变。 import java.io.BufferedInputStream;import java.io.BufferedReader;import java.io.IOException;import java.io.Inpu

hdu4059容斥原理

求1-n中与n互质的数的4次方之和 import java.io.BufferedInputStream;import java.io.BufferedReader;import java.io.IOException;import java.io.InputStream;import java.io.InputStreamReader;import java.io.PrintWrit

工作常用指令与快捷键

Git提交代码 git fetch  git add .  git commit -m “desc”  git pull  git push Git查看当前分支 git symbolic-ref --short -q HEAD Git创建新的分支并切换 git checkout -b XXXXXXXXXXXXXX git push origin XXXXXXXXXXXXXX

嵌入式方向的毕业生,找工作很迷茫

一个应届硕士生的问题: 虽然我明白想成为技术大牛需要日积月累的磨练,但我总感觉自己学习方法或者哪些方面有问题,时间一天天过去,自己也每天不停学习,但总感觉自己没有想象中那样进步,总感觉找不到一个很清晰的学习规划……眼看 9 月份就要参加秋招了,我想毕业了去大城市磨练几年,涨涨见识,拓开眼界多学点东西。但是感觉自己的实力还是很不够,内心慌得不行,总怕浪费了这人生唯一的校招机会,当然我也明白,毕业

寻迹模块TCRT5000的应用原理和功能实现(基于STM32)

目录 概述 1 认识TCRT5000 1.1 模块介绍 1.2 电气特性 2 系统应用 2.1 系统架构 2.2 STM32Cube创建工程 3 功能实现 3.1 代码实现 3.2 源代码文件 4 功能测试 4.1 检测黑线状态 4.2 未检测黑线状态 概述 本文主要介绍TCRT5000模块的使用原理,包括该模块的硬件实现方式,电路实现原理,还使用STM32类

husky 工具配置代码检查工作流:提交代码至仓库前做代码检查

提示:这篇博客以我前两篇博客作为先修知识,请大家先去看看我前两篇博客 博客指路:前端 ESlint 代码规范及修复代码规范错误-CSDN博客前端 Vue3 项目开发—— ESLint & prettier 配置代码风格-CSDN博客 husky 工具配置代码检查工作流的作用 在工作中,我们经常需要将写好的代码提交至代码仓库 但是由于程序员疏忽而将不规范的代码提交至仓库,显然是不合理的 所