背景概述
随着云计算的广泛普及和云原生实践,越来越多的公司开始将目光投向云上的稳定性治理。混沌工程的概念最早来自Netflix,并且在NF取得成功,证明了混沌工程在云计算中扮演关键角色,通过有计划地引入故障和不稳定性,确保系统的健壮性和可靠性,使组织能够充分利用云计算的优势,并实现高质量的应用交付。
本文及后续章节,通过深入了解Chaos-mesh/Chaosblade这两个开源较早的工具,熟悉混沌工程落地过程中,混沌工具的设计思路、设计实现
混沌工程工具系列传送门:
1、 混沌工程工具:Chaos-mesh与Chaosblade技术实现与原理分析(1)-腾讯云开发者社区-腾讯云
2、 混沌工程工具:chaos-mesh注入项原理分析(2)-腾讯云开发者社区-腾讯云
3、 混沌工程工具:chaosblade在服务器上注入项原理分析(3)-腾讯云开发者社区-腾讯云
4、 混沌工程工具:业务代码注入原理(4)-腾讯云开发者社区-腾讯云
5、 混沌工程工具:Chaosblade Java业务代码注入原理(5)-腾讯云开发者社区-腾讯云
6、 混沌工程工具:混沌工程实施过程及持久价值(7)-腾讯云开发者社区-腾讯云
7、 混沌工程工具:混沌工程定位及原则梳理(8)-腾讯云开发者社区-腾讯云
8、 混沌工程工具:一个混沌工程设计的例子(9)-腾讯云开发者社区-腾讯云
Chaos-mesh与Chaosblade整体分析
Chaos-mesh简介
Chaos Mesh 是一个开源的云原生混沌工程平台,提供丰富的故障模拟类型,具有强大的故障场景编排能力,方便用户在开发测试中以及生产环境中模拟现实世界中可能出现的各类异常,帮助用户发现系统潜在的问题。Chaos Mesh 提供完善的可视化操作,旨在降低用户进行混沌工程的门槛。用户可以方便地在 Web UI 界面上设计自己的混沌场景,以及监控混沌实验的运行状态。
官网地址:A Powerful Chaos Engineering Platform for Kubernetes | Chaos Mesh
Chaosblade简介
ChaosBlade 是阿里巴巴开源的一款遵循混沌实验模型的混沌实验执行工具,具有场景丰富度高、简单易用等特点,而且可以很方便的扩展实验场景,开源后不久就被加入到 CNCF Landspace 中,成为主流的一款混沌工具。
官网地址:GitHub - chaosblade-io/chaosblade: An easy to use and powerful chaos engineering experiment toolkit.(阿里巴巴开源的一款简单易用、功能强大的混沌实验注入工具)
两个工具对比
维度 | 子项 | chaosblade | chaos-mesh |
---|---|---|---|
概述 | 说明 | 阿里巴巴开源,主程序golang开发;Java应用注入借助jvm-sandbox实现字节码修改,注入插件使用Java开发。 | PingCap开源,主程序golang开发。Java应用注入借助byteman实现字节码修改。 |
支持平台类型 | 1. K8s集群及K8s node节点 2. 物理机/CVM-功能与K8s集群一致 3. aws/aliyun部分组件--未开源 | 1. K8s集群及node节点 2. AWS EC2/volume 3. GCP node/disk 4. 通过chaosd组件,可在物理机/CVM上面实施--功能相对k8s较少 | |
优势分析 | 语言、场景最丰富,实验场景更细,支持主流开源组件直接注入 | 场景较丰富已在CNCF孵化 | |
场景覆盖度 | 特定编程语言的混沌 | C (简单)Java(丰富) | Java(简单) |
混沌实验类型 | os/jvm/开源框架 | os/jvm | |
混沌实验动作 | 丰富,特别是java开源程序支持良好 | 较丰富 | |
使用灵活性 | 支持比例注入 | 支持 | 不支持 |
内核要求 | 不涉及 | >=4.1 | |
使用生态 | 文档 | 极简单,出问题需查看源码或咨询开发者 | 丰富 |
开源成熟度 | 成熟 | 成熟,已在CNCF孵化 | |
可运维 | 监控能力 | 命令行 | 基于grafana可观测性 |
dashboard | 较成熟 | 较成熟 | |
与运维系统集成 | 可以 | 可以 | |
自主可控 | 可以 | 可以 |
演练项原理概览
两个平台支持的演练项比较相似,下面抽重点做下梳理。
注:下面的演练项,k8s里面都适用。因精力有限,部分场景未测试,可能有疏漏,请使用前要做好验证。实验文档稍后补充。
分类 | 场景 | 描述 | Chaosblade原理 | ChaosMesh原理 |
---|---|---|---|---|
系统级别 | 开机 | 启动设备 | 不支持 | 不支持 |
关机 | 关闭设备 | 不支持 | 不支持 | |
CPU占用 | CPU占用过高 | 通过for死循环,占用cpu user时间;根据占用时间片比例,来控制负载百分比 | 使用stress-ng程序注入故障 | |
内存占用 | 内存占用过高 | 挂载内存盘实现占用 | 使用stress-ng程序注入故障 | |
io延迟 | 读写文件时间变长 | dd命令实现读写延迟 | ||
内核 | 模拟内核故障触发重启 | 不支持 | 不支持 | |
模拟系统调用延迟 | 通过strace预置程序实现 | 使用bfp在指定内核路径上注入基于 I/O 或内存的故障 | ||
systemd | 停止守护进程 | 调用systemctl实现 | 不支持 | |
script | 指定脚本延迟或退出 | 在脚本指定位置,添加sleep或exit实现 | 不支持 | |
process | 杀掉制定进程或假死 | kill指令实现 | 不支持 | |
file | 文件添加/删除/追加/移动/改权限 | 使用系统命令touch, mkdir, echo, rm完成相应操作,如对文件有修改,则先备份。然后恢复时通过备份实现 | 不支持 | |
时间异常 | 进程/系统时间与实际时间不一致 | 不支持 | 从C语言写的自定义时钟来同步时间 | |
网络 | 丢包 | 网络发生丢包行为 | 使用tc,基于netem,分队列注入故障 | |
高延迟 | 网络延迟上涨行为 | |||
乱序/重传/分区/损坏/重复 | 网络包上述异常行为 | |||
pod | pod失败 | pod一段时间不可用 | 支持 | 通过k8s原生能力,替换pause容器实现 |
pod kill | kill掉一个pod | 通过k8s原生能力,执行kill操作 | 通过k8s原生能力,执行kill操作 | |
container kill | kill掉一个container | |||
DNS | 劫持 | 返回随机值 | 修改本地的 hosts,篡改域名地址映射 | 自建CoreDNS服务端,劫持故障注入pod的dns配置实现 |
故障 | 无法解析 | 不支持 | ||
HTTP应用 | 连接中断 | 接口无法提供服务 | 仅支持spring cloud的gateway | 基于iptables扩展(TPROXY)的HTTP透明代理,修改HTTP返回行为 |
返回延迟 | 接口返回时间变长 | |||
内容篡改 | 接口内容不符合预期 | |||
Java应用 | 自定义动作 | 自定义程序,支持复杂场景 | 支持Groovy and Java 脚本扩展 | 支持ECA规则文件扩展 |
方法延迟 | 具体某个函数返回时间变长 | 基于jvm-sanbox,在特定的方法处注入相应故障(延迟、篡改返回值) | 基于byteman原生能力,给特定方法注入相应故障。其中,Java进程加压,支持CPU压力和内存压力。 | |
篡改方法返回值 | 篡改方法返回值,观察业务情况 | |||
抛出异常 | 具体某个函数抛出异常 | |||
触发Full GC | JVM触发GC | 1)Java<8,创建单独进程,通过jmap命令触发2)Java>=8,通过JmxMBeanServer执行gcClassHistogram | ||
Java进程CPU满载 | 模拟Java进程CPU满载时,程序运行情况 | 启动指定CPU数目的死循环 | ||
线程满 | 耗尽线程 | 根据入参,在剩余线程中跑死循环或加锁,实现线程满注入 | 不支持 | |
CodeCache填充 | 模拟CodeCache满时,程序运行延迟 | 使用newFixedThreadPool创建当前可用CPU数的定长线程池,然后随机生成class,耗尽CodeCache | ||
OOM | 模拟Java进程内存溢出 | 使用LinkedBlockingQueue耗尽内存 | ||
开源组件 | SpringCloud gateway | 模拟Java程序访问相应开源组件的延迟、抛异常 | 基于jvm-sanbox,在特定的方法处注入相应故障(延迟、跑异常、线程池满、篡改返回值等,支持哪种故障,具体看具体命令) | 暂不支持,可以用上述Java应用的方法简单模拟 |
http | ||||
Tars | ||||
Druid | ||||
Dubbo | ||||
ElasticSearch | ||||
hbase | ||||
jedis | ||||
lettuce | ||||
log | ||||
kafka | ||||
mongodb | ||||
mysql | ||||
Postgrelsql | ||||
rabbitmq | ||||
redisson | ||||
rocketmq |
结论分析
1. 涉及简单Java业务演练、简单中间态演练,可考虑使用CNCF孵化产品chaos-mesh
2. 有复杂Java业务演练需求、较多开源产品演练,可使用chaosblade
3. chaosblade文档做的不太好,技术实现挺好的。
我正在参与2023腾讯技术创作特训营第二期有奖征文,瓜分万元奖池和键盘手表