ChaosBlade介绍
ChaosBlade 是阿里巴巴开源的一款遵循混沌工程原理和混沌实验模型的实验注入工具。 定义:混沌工程是一门对系统进行实验的学科,旨在了解系统对应生产环境的各种混乱状况的能力,建立对系统的信心。所有系统的用户都希望系统具备可靠性,但影响可靠性的因素有很多。混沌工程师能找到证据,指明那些异常但不可回避的状况下系统的应变情况。
混沌工程的唯一目标就是证明系统存在缺陷。通过开展混沌工程方面的科学实验,你可以测试系统是否存在缺陷,从而了解系统在混乱的类生产环境条件下如何表现。
混沌工程实验:一个持续性迭代的闭环体系
架构抵御故障的能力:通过对实验对象的架构高可用性的分析和评估,找出潜在的系统单点风险,确定合理的实验范围。 实验指标设计:评估目前实验对象判定业务正常运行所需的业务指标、应用健康状况指标和其他系统指标。 实验环境选择:选择实验对象可以应用的实验环境:开发、测试、预生产、生产。 实验工具使用:评估目前实验对象对实验工具的熟悉程度。 故障注入场景及爆炸半径:讨论和选择可行的故障注入场景,并评估每个场景的爆炸半径。 实验自动化能力:衡量目前实验对象的平台自动化实施能力。 环境恢复能力:根据选定的故障注入场景,评估实验对象对环境的清理和恢复能力。 实验结果整理:根据实验需求,讨论确定实验结果和解读分析报告的内容项。 故障注入测试:故障注入测试是从系统的故障状态开始,测试系统在发生故障后的运行规律。
与现有的测试方法相比,最大的不同在于测试开始时的系统状态不同,现有的测试都是从系统的正确状态开始,测试系统如何转入故障状态。
故障注入不关注为什么出现这样的故障,它关注的是出现了这样的故障后,是否能监控发现,是否有对应的预案,故障恢复的时长等,是服务的稳定性以及系统的容错能力。
衡量微服务的容错能力
通过模拟调用延迟、服务不可用、机器资源满载等,查看发生故障的节点或实例是否被自动隔离、下线,流量调度是否正确,预案是否有效,同时观察系统整体的QPS或RT是否受影响。在此基础上可以缓慢增加故障节点范围,验证上游服务限流降级、熔断等是否有效。最终故障节点增加到请求服务超时,估算系统容错红线,衡量系统容错能力。
验证监控告警的时效性
通过对系统注入故障,验证监控指标是否准确,监控维度是否完善,告警阈值是否合理,告警是否快速,告警接收人是否正确,通知渠道是否可用等,提升监控告警的准确和时效性。
定位与解决问题的应急能力
通过故障突袭,随机对系统注入故障,考察相关人员对问题的应急能力,以及问题上报、处理流程是否合理,达到以战养战,锻炼人定位与解决问题的能力。
使用步骤
在release地址下载最新的 chaosblade 工具包,下载地址:Releases · chaosblade-io/chaosblade · GitHub 上传到服务器,解压即用。 blade命令介绍 查看 blade 命令帮助文档
代码语言:javascript复制eg: blade -h
所有的命令都可以添加 -h 来查看此命令如何使用,如创建混沌实验
代码语言:javascript复制eg:blade create -h
所有的命令都可以添加 -d 来查看更细的执行信息
代码语言:javascript复制eg:blade create cpu fullload -d
create,创建一个混沌演练实验,指执行故障注入。
命令是 blade create [TARGET] [ACTION] [FLAGS],比如实施一次 Dubbo consumer 调用 xxx.xxx.Service 接口延迟 3s,则执行的命令为
代码语言:javascript复制blade create dubbo delay --consumer --time 3000 --service xxx.xxx.Service
如果注入成功,则返回实验的 uid,用于状态查询和销毁此实验使用。 destroy,销毁之前的混沌实验,比如销毁上面提到的 Dubbo 延迟实验,命令是
代码语言:javascript复制blade destroy UID
prepare, 混沌实验前的准备,比如演练 Java 应用,则需要挂载 java agent。例如要演练的应用名是 business,则在目标主机上执行
代码语言:javascript复制blade p jvm --process business
如果挂载成功,返回挂载的 uid,用于状态查询或者撤销挂载。 revoke, 撤销之前混沌实验准备,比如卸载 java agent。命令是
代码语言:javascript复制blade revoke UID
query, 查询部分实验所需的系统参数 server, 启动 web server,暴露 HTTP 服务,可以通过 HTTP 请求来调用 chaosblade。 在目标机器xxxx上执行下面命令:
代码语言:javascript复制blade server start -p 9526
执行 CPU 满载实验的命令为:
代码语言:javascript复制curl "http:/xxxx:9526/chaosblade?cmd=create cpu fullload"
status, 查询准备阶段或者实验的状态,命令是
blade status UID 或者 blade status --type create
version, 打印blade版本信息
blade server
在 server 模式下,后台启动 blade,blade 程序会对外暴露 web 服务,上层可通过 http 调用。
请求格式是 chaosblade?cmd=具体命令,例如执行 CPU 满载,则请求是
代码语言:javascript复制chaosblade?cmd=create cpu fullload
重点,因为前面讲的这些功能都是单机命令行的,实际的场景是希望在一个控制台集中操作所有场景,有了这个远程通信能力,上述需求落地才有了可能。
start 启动 server 模式, 暴露 web 服务 stop 停止 server 模式, 关闭 web 服
start 命令参数:
代码语言:javascript复制-p, --port string 服务端口号,默认是 9526
eg:
# 启动 server 模式,服务端口是 8080
[work@myboot00 chaosblade-1.0.0]$ ./blade server start --port 8080
success, listening on :8080
# 触发 CPU 负载 50% 场景
[work@myboot00 ~]$ curl "http://127.0.0.2:8080/chaosblade?cmd=create cpu load --cpu-percent 50"
执行返回结果如下:
{"code":200,"success":true,"result":"69ceda100e8cdaeb"}
# 查看触发结果
[work@myboot00 chaosblade-1.0.0]$ ./blade status 69ceda100e8cdaeb
执行返回结果如下:
{
"code": 200,
"success": true,
"result": {
"Uid": "69ceda100e8cdaeb",
"Command": "cpu",
"SubCommand": "fullload",
"Flag": " --cpu-percent=50",
"Status": "Success",
"Error": "",
"CreateTime": "2021-06-10T16:48:06.008939786 08:00",
"UpdateTime": "2021-06-10T16:48:07.307805573 08:00"
}
}
# 销毁实验场景
[work@myboot00 ~]$ curl "http://127.0.0.2:8080/chaosblade?cmd=destroy 69ceda100e8cdaeb"
执行返回结果如下:
{"code":200,"success":true,"result":{"target":"cpu","action":"fullload","flags":{"cpu-percent":"50"}}}
blade status
查询混沌实验和混沌实验环境状态,可通过创建的混沌实验的 uid 或命令类型来查询混沌实验。 status 可以简写为 s,即 blade status 可以简写为 blade s。
参数:
代码语言:javascript复制--asc bool 默认值为 false,按 CreateTime 进行降序排序
--limit string 查询实验数目限制,支持 OFFSET 子句,例如:limit 4,3 就表示从位置5开始,返回后3项
--status string 实验状态,create 类型支持 Created|Success|Error|Destroyed 状态,prepare 类型支持 Created|Running|Error|Revoked 状态
--target string 实验目标,例如:dubbo
--type string 命令类型,attach|create|destroy|detach
--uid string prepare 或 experiment 的 uid
-h, --help 查看 create 命令帮助
适用的场景
基础资源类故障 cpu利用率高
应用因为某种原因导致CPU使用率达到100%,导致应用对外服务能力下降或不可用。
可以指定核数、具体核满载或者总 CPU 负载百分比。
旨在 CPU 在特定负载下,验证服务质量、监控告警、流量调度、弹性伸缩等能力。
load、fullload、fl 命令都可以,即 :
代码语言:javascript复制blade create cpu load、blade create cpu fullload 或 blade create cpu fl
更多相关附加参数如下:
--climb-time string 攀升持续时间
--cpu-count string 指定 CPU 满载的个数
--cpu-list string 指定 CPU 满载的具体核,核索引从 0 开始 (0-3 or 1,3)
--cpu-percent string 指定 CPU 负载百分比,取值在 0-100
--timeout string 设定运行时长,单位是秒,通用参数
磁盘满
模拟磁盘填充,可以指定填充的目录和填充大小。
验证磁盘满下对系统服务的影响,比如监控告警、服务稳定性等。
代码语言:javascript复制blade create disk fill
更多相关附加参数如下:
代码语言:javascript复制--path string 需要填充的目录,默认值是 /
--percent string 指定磁盘使用率,取值是不带%号的正整数,例如 --percent 80
--reserve string 保留磁盘大小,单位是MB。取值是不包含单位的正整数,例如 --reserve 1024。如果 size、percent、reserve 参数都存在,优先级是 percent > reserve > size
--retain-handle 是否保留填充,默认值是false
--size string 需要填充的文件大小,单位是 M,取值是整数,例如 --size 1024
--timeout string 设定运行时长,单位是秒,通用参数
磁盘IO高
磁盘IO高导致应用故障或降级
验证磁盘 io 高负载下对系统服务的影响,比如监控告警、服务稳定性、是否有对应的预案、故障恢复的时长等。
代码语言:javascript复制blade create disk burn
更多相关附加参数如下:
--path string, 指定提升磁盘 io 的目录,会作用于其所在的磁盘上,默认值是 /
--read ,触发提升磁盘读 IO 负载,会创建 600M 的文件用于读,销毁实验会自动删除
--write, 触发提升磁盘写 IO 负载,会根据块大小的值来写入一个文件,比如块大小是 10,则固定的块的数量是 100,则会创建 1000M 的文件,销毁实验会自动删除
--size string ,块大小, 单位是 M, 默认值是 10,一般不需要修改,除非想更大的提高 io 负载
--timeout string ,设定运行时长,单位是秒,通用参数
内存使用率高
应用因为某种原因导致系统内存占用率很高,导致应用对外服务能力下降或不可用。
代码语言:javascript复制blade create mem load
更多相关附加参数如下:
代码语言:javascript复制--mem-percent string ,内存使用率,取值是 0 到 100 的整数
--mode string ,内存占用模式,有 ram 和 cache 两种,例如 --mode ram。ram 采用代码实现,可控制占用速率,优先推荐此模式;cache 是通过挂载tmpfs实现;默认值是 --mode cache
--rate string,内存占用速率,单位是 MB/S,仅在 --mode ram 时生效
--reserve string ,保留内存的大小,单位是MB,如果 mem-percent 参数存在,则优先使用 mem-percent 参数
--timeout string ,设定运行时长,单位是秒,通用参数
--include-buffer-cache, ram 模式 mem-percent,包括 buffer/cache
--override ,只适用于java,卸载java agent
注意:
1、此场景触发内存占用满,即使指定了 --timeout 参数,也可能出现通过 blade 工具无法恢复的情况,可通过重启机器解决,推荐指定内存百分比。
2、由于目前内存大小计算通过 memory.stat 等文件计算,所以和 free 命令计算不一致,同 top 命令一致,验证时请使用 top 命令查看内存使用。
网络类故障
网络包故障
代码语言:javascript复制blade create network loss(丢包)
blade create network corrupt(损坏)
blade create network duplicate(重复)
blade create network delay(延迟)
blade create network reorder(重排)
可以指定网卡、本地端口、远程端口、目标 IP 。需要特别注意,如果不指定端口、ip 参数,而是整个网卡生效,切记要添加 --timeout 参数或者 --exclude-port 参数,前者是指定运行时间,自动停止销毁实验,后者是指定排除掉不受影响的端口,两者都是防止机器无法连接的情况,如果真实发生此问题,重启机器即可恢复。 本地端口和远程端口之间是或的关系,即这两个端口都会生效,只要指定了本地端口或者远程端口,无需指定需要排除的端口。端口与 IP 之间是与的关系,即指定的 IP:PORT 生效。
公共参数:
代码语言:javascript复制--destination-ip string 目标 IP. 支持通过子网掩码来指定一个网段的IP地址, 例如 192.168.1.0/24. 则 192.168.1.0~192.168.1.255 都生效。你也可以指定固定的 IP,如 192.168.1.1 或者 192.168.1.1/32,也可以通过都号分隔多个参数,例如 192.168.1.1,192.168.2.1。
--exclude-ip string 排除受影响的 IP,支持通过子网掩码来指定一个网段的IP地址, 例如 192.168.1.0/24. 则 192.168.1.0~192.168.1.255 都生效。你也可以指定固定的 IP,如 192.168.1.1 或者 192.168.1.1/32,也可以通过都号分隔多个参数,例如 192.168.1.1,192.168.2.1。
--exclude-port string 排除掉的端口,默认会忽略掉通信的对端端口,目的是保留通信可用。可以指定多个,使用逗号分隔或者连接符表示范围,例如 22,8000 或者 8000-8010。 这个参数不能与 --local-port 或者 --remote-port 参数一起使用
--interface string 网卡设备,例如 eth0 (必要参数)
--local-port string 本地端口,一般是本机暴露服务的端口。可以指定多个,使用逗号分隔或者连接符表示范围,例如 80,8000-8080
--remote-port string 远程端口,一般是要访问的外部暴露服务的端口。可以指定多个,使用逗号分隔或者连接符表示范围,例如 80,8000-8080
--force 强制覆盖已有的 tc 规则,请务必在明确之前的规则可覆盖的情况下使用
--ignore-peer-port 针对添加 --exclude-port 参数,报 ss 命令找不到的情况下使用,忽略排除端口
--timeout string 设定运行时长,单位是秒,通用参数
blade create network loss (丢包) /corrupt (损坏) /duplicate (重复)
--percent string 丢包百分比,取值在[0, 100]的正整数 (必要参数)
blade create network delay (延迟)
--offset string 延迟时间上下浮动的值, 单位是毫秒
--time string 延迟时间,单位是毫秒 (必要参数)
blade create network reorder (重排)
--percent string 立即发送百分比,取值是不带%号的正整数,例如 --percent 50,(必要参数)
--correlation string 和上一包的相关性,取值在 0~100,必要参数,例如 --correlation 70
--gap string 包序列大小,取值是正整数,例如 --gap 5
--time string 网络包延迟时间,单位是毫秒,默认值是 10,取值时正整数
blade create network dns (域名访问不通。修改本地的 hosts,篡改域名地址映射。)
--domain string 域名 (必要参数)
--ip string 映射的 ip (必要参数)
--timeout string 设定运行时长,单位是秒,通用参数
blade create network occupy(网络本地端口占用)
--force 强制占用此端口,会将已使用此端口的进程杀掉
--port string 指定被占用的端口,(必填项)
--timeout string 设定运行时长,单位是秒,通用参数
进程类故障
杀进程
此实验会指定进程号杀掉进程。支持命令行或者命令中进程匹配。
此实验可以验证程序的自愈能力,或者服务进程不存在时,系统的容错能力。
代码语言:javascript复制blade create process kill
--count string 限制杀掉进程的数量,0 表示无限制
--exclude-process string 排除受影响的进程
--ignore-not-found 忽略未发现的进程
--local-port string 本地服务端口可以指定多个,使用逗号分隔或者连接符表示范围,如: 80,8000-8080
--process string 进程关键词,会在整个命令行中查找
--process-cmd string 进程命令,只会在命令中查找
--signal string 指定杀进程的信号量,默认是 9,例如 --signal 15
--timeout string 设定运行时长,单位是秒,通用参数
注:blade 命令不能恢复杀掉的进程。
暂停进程
此实验会暂停进程。支持命令行或者命令中进程匹配。
此实验可以验证程序 Hang 时,系统的容错能力。
代码语言:javascript复制blade create process stop
--process string 进程关键词,会在整个命令行中查找
--process-cmd string 进程命令,只会在命令中查找
--ignore-not-found 忽略未发现的进程
--timeout string 设定运行时长,单位是秒,通用参数
java语言类故障
代码语言:javascript复制blade prepare jvm
挂载 java agent,执行 java 实验场景必要步骤
代码语言:javascript复制-j, --javaHome string 指定 JAVA_HOME 路径,用于指定 java bin 和 tools.jar,如果不添加此参数,默认会优先获取 JAVA_HOME 环境变量,如果获取失败,会解析指定进程参数获取 JAVA_HOME,获取失败,会使用 chaosblade 自带的 tools.jar
--pid string java 进程ID
-P, --port int java agent 暴露服务的本地端口,用于下发实验命令
-p, --process string java 进程关键词,用于定位 java 进程(必要参数)
-a, --async 是否异步连接, 默认是 false
-e, --endpoint string 异步连接结果报告地址,只有异步连接值非空且为true才生效
-d, --debug 开启 debug 模式
-h, --help help for jvm
eg:指定 pid 执行 java agent 挂载
代码语言:javascript复制blade prepare jvm --pid 26652
注意:挂载 java agent 操作是个比较耗时的过程,在未返回结果前请耐心等待。
代码语言:javascript复制blade create jvm
ChaosBlade的原理主要是使用了字节码增强技术(ASM),即改变class内容,再重新通过jvm-sandbox提供的SandboxClassLoader加载到jvm使其生效。所以使用时需要指定jvm进程,以便插入被变更后的字节码。
jvm 本身相关场景,以及可以指定类,方法注入延迟、返回值、异常故障场景,也可以编写 groovy 和 java 脚本来实现复杂的场景。目前支持的场景如下
代码语言:javascript复制blade create jvm CodeCacheFilling 填充 jvm code cache
blade create jvm OutOfMemoryError 内存溢出,支持堆、栈、metaspace 区溢出
blade create jvm cpufullload java 进程 CPU 使用率满载
blade create jvm delay 方法延迟
blade create jvm return 指定返回值
blade create jvm script 编写 groovy 和 java 实现场景
blade create jvm throwCustomException 抛自定义异常场景
jvm 支持的通用参数:
--pid string 指定 java 进程号
--process string 指定 java 进程名
--timeout string 设定运行时长,单位是秒,通用参数
####JVM 方法级别的故障场景通用参数:
--classname string 指定类名,必须是实现类,带全包名,例如 com.xxx.xxx.XController (必填项)
--methodname string 指定方法名,注意相同方法名的方法都会被注入相同故障 (必填项)
--after 方法执行完成返回前注入故障,比如修改复杂的返回对象
--effect-count string 限制影响数量
--effect-percent string 限制影响百分比
各场景还有自身所独有的参数,可以在每个场景文档中查看:
代码语言:javascript复制blade create jvm - chaosblade-help-zh-CN
shell脚本类故障
代码语言:javascript复制blade create script delay
通过指定脚本和函数执行延迟场景。
代码语言:javascript复制--file string 脚本路径(必要参数)
--function-name string 脚本中的函数名(必要参数)
--time string 延迟时间,单位是毫秒(必要参数)
--timeout string 设定运行时长,单位是秒,通用参数
blade create script exit 通过指定脚本和函数执行退出场景。
代码语言:javascript复制--exit-code string 退出码,默认值是 1
--exit-message string 退出信息
--file string 脚本路径(必要参数)
--function-name string 脚本中的函数名(必要参数)
--timeout string 设定运行时长,单位是秒,通用参数
HTTP类故障
代码语言:javascript复制blade create http
blade create http delay delay time 延迟时间
--effect-count string 影响的请求条数
--effect-percent string 影响的请求百分比
--time string 延迟时间,单位是毫秒(必要参数)
--timeout string 设定运行时长,单位是秒,通用参数
--uri string url ,必要参数
--pid string 进程 id
--process string 应用的进程名称
--offset string 延迟时间上下浮动的值, 单位是毫秒
blade create http throwCustomException 抛自定义异常
--effect-count string 影响的请求条数
--effect-percent string 影响的请求百分比
--exception string 异常类,带全包名,必须继承 java.lang.Exception 或 java.lang.Exception 本身(必要参数)
--exception-message string 指定异常类信息,默认值是 chaosblade-mock-exception
--uri string url ,必要参数
--pid string 进程 id
--process string 应用的进程名称
--timeout string 设定运行时长,单位是秒,通用参数
RPC类故障
Dubbo
代码语言:javascript复制blade create dubbo
在dubbo中分为consumer和provider两种角色,当consumer在调用provider时,我们现在想使这个请求增加延时,我们既可以在provider端针对指定的服务增加延时,也可以在consumer调用时针对指定的服务进行延时,所以我们可以稍微看下上面的命令,它其实是在consumer进行控制的,命令也是支持在provider端进行控制的。 参数中的--consumer和--provider,表示的就是命令中可以控制服务调用的两端。
代码语言:javascript复制blade create dubbo delay,延迟时间
blade create dubbo throwCustomException,抛自定义异常
公共参数:
代码语言:javascript复制--appname string consumer或provider应用名称
--consumer 标记consumer角色
--effect-count string 影响的请求条数
--effect-percent string 影响的请求百分比
--group string service组
--methodname string 方法名称
--pid string 进程id
--process string 应用的进程名称
--provider 标记provider
--service string service接口
--timeout string 设定运行时长,单位是秒,通用参数
--version string service版本
blade create dubbo delay
--offset string 延迟时间上下浮动的值, 单位是毫秒
--time string 延迟时间,单位是毫秒(必要参数)
blade create dubbo throwCustomException
--exception string 异常类,带全包名,必须继承 java.lang.Exception 或 java.lang.Exception 本身(必要参数)
--exception-message string 指定异常类信息,默认值是 chaosblade-mock-exception
eg:Dubbo服务超时,由于 Java 应用的故障注入是通过 Java Agent 机制实现,所以首先要先挂载 agent
./blade prepare jvm --process business
./blade create dubbo delay --time 3000 --service com.example.service.DemoService --methodname sayHello --consumer
blade create dubbo threadpoolfull 线程池满
--effect-count string 影响的请求条数
--effect-percent string 影响的请求百分比
--pid string 进程 id
--process string 应用的进程名称
--provider 标记provider
--timeout string 设定运行时长,单位是秒,通用参数
servlet故障
代码语言:javascript复制blade create servlet
Servlet 是 Java 的 web 的接口规范,Java web 服务器都遵循此规范实现。本场景主要模拟 Java Web 请求延迟、异常场景。
blade create servlet delay 请求延迟
blade create servlet throwCustomException 请求异常 servlet 通用参数:
代码语言:javascript复制--effect-count string 影响的请求条数
--effect-percent string 影响的请求百分比
--method string HTTP 请求类型, 例如: GET, POST, or PUT.
--pid string java进程号
--process string java进程名
--querystring string 请求参数,例如http://localhost:8080/dubbodemo/async?name=friend&timeout=2000 中 querystring的值是 name=friend&timeout=2000
--requestpath string 请求 URI,不包含 Context 部分,例如 http://localhost:8080/dubbodemo/async?name=friend&timeout=2000,则 requestpath 的值是 /async,注意要带 /
数据库故障
代码语言:javascript复制blade create mysql
通用参数:
代码语言:javascript复制--database string 使用的数据库名称
--effect-count string 影响的请求条数
--effect-percent string 影响的请求百分比
--host string 数据库 host
--pid string 进程 id
--port string 使用的数据库端口
--process string 应用的进程名称
--sqltype string sql类型,如, select, update等等.
--table string sql的第一个表名.
--timeout string 设定运行时长,单位是秒,通用参数
blade create mysql delay 延迟
--time string 延迟时间,单位是毫秒(必要参数)
--offset string 延迟时间上下浮动的值, 单位是毫秒
blade create mysql throwCustomException 抛自定义异常
--exception string 异常类,带全包名,必须继承 java.lang.Exception 或 java.lang.Exception 本身(必要参数)
--exception-message string 指定异常类信息,默认值是 chaosblade-mock-exception
eg:数据库查询慢
代码语言:javascript复制./blade create mysql delay --time 3000 --sqltype select --port $port --database ss_stl --table stl_cost_config_ratio_seg --effect-percent 50
数据库连接池故障
Druid首先是一个数据库连接池,是一个JDBC组件。
代码语言:javascript复制blade create druid
连接池打满
代码语言:javascript复制blade create druid connectionpoolfull
--effect-count string 影响的请求条数
--effect-percent string 影响的请求百分比
--pid string 进程 id
--process string 应用程序进程名称
--timeout string 设定运行时长,单位是秒,通用参数
docker 相关类故障
创建 docker 相关的混沌实验,比如杀容器,容器网络延迟、丢包,杀容器里的进程等,不同的场景依赖的参数不同。
执行 docker 相关实验场景,必须确保本地能访问 docker server,可通过 tcp 或 socket 方式访问,默认是通过本地 socket 访问,也可通过 --docker-endpoint 参数指定。
很重要的一点是: 如果执行 CPU 场景,必须指定 chaosblade 安装包,因为需要将安装包拷贝到容器 /opt 目录下执行,使用 --blade-tar-file 参数指定,例如:
代码语言:javascript复制--blade-tar-file /home/admin/chaosblade-0.4.0.tar.gz
如果执行网络或者进程场景,无需指定,但这两个场景依赖 chaosblade-tool 镜像,默认是从 registry.cn-hangzhou.aliyuncs.com/chaosblade 仓库下载,也可以通过 --image-repo 参数指定,例如
--image-repo registry-vpc.cn-hangzhou.aliyuncs.com/chaosblade
代码语言:javascript复制blade create docker cpu
容器内 CPU 负载实验场景,同基础资源的 CPU 场景
代码语言:javascript复制blade create docker cpu load 容器内 CPU 负载场景,同 blade create cpu load
--climb-time string 攀升持续时间
--cpu-count string 指定 CPU 满载的个数
--cpu-list string 指定 CPU 满载的具体核,核索引从 0 开始 (0-3 or 1,3)
--cpu-percent string 指定 CPU 负载百分比,取值在 0-100
--timeout string 设定运行时长,单位是秒,通用参数
-h, --help help for fullload
除了上述基础场景各自所需的参数外,在 docker 环境下,还支持的参数如下:
代码语言:javascript复制--blade-override 是否覆盖容器内已有的 chaosblade 工具,默认是 false,表示不覆盖,chaosblade 在容器内的部署路径为 /opt/chaosblade
--blade-tar-file string 指定本地 chaosblade-VERSION.tar.gz 工具包全路径,用于拷贝到容器内执行
--container-id string 目标容器 ID
--docker-endpoint string Docker server 地址,默认为本地的 /var/run/docker.sock
--image-repo string chaosblade-tool 镜像仓库
--image-version string chaosblade-tool 镜像版本
--override 目前只适用于java,卸载 java agent
--timeout string 设定运行时长,单位是秒,通用参数
-h, --help help for fullload
eg:对 container id 是 5239e26f6329 的做 CPU 使用率 80% 的实验场景,执行命令如下:
代码语言:javascript复制blade create docker cpu fullload --cpu-percent 80 --blade-tar-file /root/chaosblade-0.4.0.tar.gz --container-id 5239e26f6329
容器内网络实验场景,同基础资源的网络场景
代码语言:javascript复制blade create docker network
支持的网络场景命令如下:
代码语言:javascript复制blade create docker network delay 容器网络延迟,同 blade create network delay
blade create docker network loss 容器网络丢包,同 blade create network loss
blade create docker network dns 容器内域名访问异常,同 blade create network dns
blade create docker network corrupt 容器内网络包损坏,同 blade create network corrupt
blade create docker network duplicate 容器内网络包重复,同 blade create network duplicate
blade create docker network reorder 容器内网络包乱序,同 blade create network reorder
blade create docker network occupy 容器内网络本地端口占用,同 blade create network occupy
除了上述基础场景各自所需的参数外,在 docker 环境下,还支持的参数如下:
代码语言:javascript复制--container-id string 目标容器 ID
--docker-endpoint string Docker server 地址,默认为本地的 /var/run/docker.sock
--image-repo string chaosblade-tool 镜像仓库
--image-version string chaosblade-tool 镜像版本
容器内进程场景,同基础资源进程场景,例如:
代码语言:javascript复制blade create docker process
支持的进程场景如下:
代码语言:javascript复制blade create docker process kill, 杀容器内指定的进程,同 blade create process kill
blade create docker process stop,挂起容器内指定的进程,同 blade create process stop
除了上述基础场景各自所需的参数外,在 docker 实验场景下还支持的参数是:
--blade-override 是否覆盖容器内已有的 chaosblade 工具,默认是 false,表示不覆盖,chaosblade 在容器内的部署路径为 /opt/chaosblade
--blade-tar-file string 指定本地 chaosblade-VERSION.tar.gz 工具包全路径,用于拷贝到容器内执行
--container-id string 目标容器 ID
--docker-endpoint string Docker server 地址,默认为本地的 /var/run/docker.sock
--image-repo string chaosblade-tool 镜像仓库
--image-version string chaosblade-tool 镜像版本
eg:杀掉容器内 nginx 进程,命令执行如下:
代码语言:javascript复制blade create docker process kill --process nginx --blade-tar-file /root/chaosblade-0.4.0.tar.gz --container-id ee54f1e61c08
blade create docker container: 主要执行 container 资源自身的场景,比如删容器
blade create docker container remove 删除容器
--container-id string 要删除的容器 ID
--docker-endpoint string Docker server 地址,默认为本地的 /var/run/docker.sock
--force 是否强制删除
--timeout string set timeout for experiment
-h, --help help for remove
注意:删除容器后,执行 blade destroy UID 命令不会恢复容器,需要靠容器自身的管理拉起。
kubernetes 相关故障
创建 kubernetes 相关的实验场景,除了使用 blade 命令创建场景外,还可以将实验使用 yaml 文件描述,使用 kubectl 命令执行。目前支持的实验场景如下:
代码语言:javascript复制blade create k8s node-cpu Node 节点 CPU 负载场景
blade create k8s node-network Node 节点网络场景
blade create k8s node-process Node 节点进程场景
blade create k8s node-disk Node 节点磁盘场景
blade create k8s pod-pod Pod 资源场景,比如杀 Pod
blade create k8s pod-network Pod 网络资源场景,比如网络延迟
blade create k8s pod-IO Pod IO 文件系统异常场景
blade create k8s pod-fail Pod 不可用异常场景
blade create k8s container-container Container 资源场景,比如杀容器
blade create k8s container-cpu 容器内 CPU 负载场景
blade create k8s container-network 容器内网络场景
blade create k8s container-process 容器内进程场景
执行 Kubernetes 实验场景,需要提前部署 ChaosBlade Operator。
代码语言:javascript复制Helm 安装包下载地址:https://github.com/chaosblade-io/chaosblade-operator/releases 。
使用以下命令安装:
代码语言:javascript复制helm install --namespace kube-system --name chaosblade-operator chaosblade-operator-<VERSION>.tgz
会安装在 kube-system 命令空间下。ChaosBlade Operator 启动后会在每个节点部署 chaosblade-tool Pod 和一个 chaosblade-operator Pod.可通过以下命令查看安装结果:
kubectl get pod -n kube-system -o wide | grep chaosblade
如果显示 chaosblade-operator 和 chaosblade-tool Pod 都处于 Running 状态,说明部署成功。
作者:韩师学子--小倪
源链接:https://blog.csdn.net/xiao__jia__jia/article/details/122279119
格式整理:IT运维技术圈