背景概述随着云计算的广泛普及和云原生实践,越来越多的公司开始将目光投向云上的稳定性治理。混沌工程的概念最早来自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腾讯技术创作特训营第二期有奖征文,瓜分万元奖池和键盘手表