一文看懂混沌网格(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实现网格交易策略的过程

《Python实现网格交易策略的过程》本文讲解Python网格交易策略,利用ccxt获取加密货币数据及backtrader回测,通过设定网格节点,低买高卖获利,适合震荡行情,下面跟我一起看看我们的第一... 网格交易是一种经典的量化交易策略,其核心思想是在价格上下预设多个“网格”,当价格触发特定网格时执行买

Spring Security 单点登录与自动登录机制的实现原理

《SpringSecurity单点登录与自动登录机制的实现原理》本文探讨SpringSecurity实现单点登录(SSO)与自动登录机制,涵盖JWT跨系统认证、RememberMe持久化Token... 目录一、核心概念解析1.1 单点登录(SSO)1.2 自动登录(Remember Me)二、代码分析三、

在MySQL中实现冷热数据分离的方法及使用场景底层原理解析

《在MySQL中实现冷热数据分离的方法及使用场景底层原理解析》MySQL冷热数据分离通过分表/分区策略、数据归档和索引优化,将频繁访问的热数据与冷数据分开存储,提升查询效率并降低存储成本,适用于高并发... 目录实现冷热数据分离1. 分表策略2. 使用分区表3. 数据归档与迁移在mysql中实现冷热数据分

Java中的xxl-job调度器线程池工作机制

《Java中的xxl-job调度器线程池工作机制》xxl-job通过快慢线程池分离短时与长时任务,动态降级超时任务至慢池,结合异步触发和资源隔离机制,提升高频调度的性能与稳定性,支撑高并发场景下的可靠... 目录⚙️ 一、调度器线程池的核心设计 二、线程池的工作流程 三、线程池配置参数与优化 四、总结:线程

一文解密Python进行监控进程的黑科技

《一文解密Python进行监控进程的黑科技》在计算机系统管理和应用性能优化中,监控进程的CPU、内存和IO使用率是非常重要的任务,下面我们就来讲讲如何Python写一个简单使用的监控进程的工具吧... 目录准备工作监控CPU使用率监控内存使用率监控IO使用率小工具代码整合在计算机系统管理和应用性能优化中,监

一文详解如何使用Java获取PDF页面信息

《一文详解如何使用Java获取PDF页面信息》了解PDF页面属性是我们在处理文档、内容提取、打印设置或页面重组等任务时不可或缺的一环,下面我们就来看看如何使用Java语言获取这些信息吧... 目录引言一、安装和引入PDF处理库引入依赖二、获取 PDF 页数三、获取页面尺寸(宽高)四、获取页面旋转角度五、判断

一文详解SpringBoot中控制器的动态注册与卸载

《一文详解SpringBoot中控制器的动态注册与卸载》在项目开发中,通过动态注册和卸载控制器功能,可以根据业务场景和项目需要实现功能的动态增加、删除,提高系统的灵活性和可扩展性,下面我们就来看看Sp... 目录项目结构1. 创建 Spring Boot 启动类2. 创建一个测试控制器3. 创建动态控制器注

从原理到实战深入理解Java 断言assert

《从原理到实战深入理解Java断言assert》本文深入解析Java断言机制,涵盖语法、工作原理、启用方式及与异常的区别,推荐用于开发阶段的条件检查与状态验证,并强调生产环境应使用参数验证工具类替代... 目录深入理解 Java 断言(assert):从原理到实战引言:为什么需要断言?一、断言基础1.1 语

一文详解Git中分支本地和远程删除的方法

《一文详解Git中分支本地和远程删除的方法》在使用Git进行版本控制的过程中,我们会创建多个分支来进行不同功能的开发,这就容易涉及到如何正确地删除本地分支和远程分支,下面我们就来看看相关的实现方法吧... 目录技术背景实现步骤删除本地分支删除远程www.chinasem.cn分支同步删除信息到其他机器示例步骤

MySQL中的表连接原理分析

《MySQL中的表连接原理分析》:本文主要介绍MySQL中的表连接原理分析,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教... 目录1、背景2、环境3、表连接原理【1】驱动表和被驱动表【2】内连接【3】外连接【4编程】嵌套循环连接【5】join buffer4、总结1、背景