ChaosBlade混沌工程工具

ChaosBlade混沌工程工具,第1张

ChaosBlade混沌工程工具

目录

ChaosBlade介绍

使用步骤

blade命令介绍

适用的场景

基础资源类故障

网络类故障

进程类故障

java语言类故障

shell脚本类故障

HTTP类故障

RPC类故障

servlet故障

数据库故障

docker 相关类故障

kubernetes 相关故障


ChaosBlade介绍

ChaosBlade 是阿里巴巴开源的一款遵循混沌工程原理和混沌实验模型的实验注入工具。
定义:混沌工程是一门对系统进行实验的学科,旨在了解系统对应生产环境的各种混乱状况的能力,建立对系统的信心。所有系统的用户都希望系统具备可靠性,但影响可靠性的因素有很多。混沌工程师能找到证据,指明那些异常但不可回避的状况下系统的应变情况。

混沌工程的唯一目标就是证明系统存在缺陷。通过开展混沌工程方面的科学实验,你可以测试系统是否存在缺陷,从而了解系统在混乱的类生产环境条件下如何表现。

混沌工程实验:一个持续性迭代的闭环体系

  • 架构抵御故障的能力:通过对实验对象的架构高可用性的分析和评估,找出潜在的系统单点风险,确定合理的实验范围。
  • 实验指标设计:评估目前实验对象判定业务正常运行所需的业务指标、应用健康状况指标和其他系统指标。
  • 实验环境选择:选择实验对象可以应用的实验环境:开发、测试、预生产、生产。
  • 实验工具使用:评估目前实验对象对实验工具的熟悉程度。
  • 故障注入场景及爆炸半径:讨论和选择可行的故障注入场景,并评估每个场景的爆炸半径。
  • 实验自动化能力:衡量目前实验对象的平台自动化实施能力。
  • 环境恢复能力:根据选定的故障注入场景,评估实验对象对环境的清理和恢复能力。
  • 实验结果整理:根据实验需求,讨论确定实验结果和解读分析报告的内容项。

故障注入测试:故障注入测试是从系统的故障状态开始,测试系统在发生故障后的运行规律。

与现有的测试方法相比,最大的不同在于测试开始时的系统状态不同,现有的测试都是从系统的正确状态开始,测试系统如何转入故障状态。

故障注入不关注为什么出现这样的故障,它关注的是出现了这样的故障后,是否能监控发现,是否有对应的预案,故障恢复的时长等,是服务的稳定性以及系统的容错能力。

  • 衡量微服务的容错能力

    通过模拟调用延迟、服务不可用、机器资源满载等,查看发生故障的节点或实例是否被自动隔离、下线,流量调度是否正确,预案是否有效,同时观察系统整体的QPS或RT是否受影响。在此基础上可以缓慢增加故障节点范围,验证上游服务限流降级、熔断等是否有效。最终故障节点增加到请求服务超时,估算系统容错红线,衡量系统容错能力。

  • 验证监控告警的时效性

    通过对系统注入故障,验证监控指标是否准确,监控维度是否完善,告警阈值是否合理,告警是否快速,告警接收人是否正确,通知渠道是否可用等,提升监控告警的准确和时效性。

  • 定位与解决问题的应急能力

    通过故障突袭,随机对系统注入故障,考察相关人员对问题的应急能力,以及问题上报、处理流程是否合理,达到以战养战,锻炼人定位与解决问题的能力。

使用步骤
  1. 在release地址下载最新的 chaosblade 工具包,下载地址:Releases · chaosblade-io/chaosblade · GitHub
  2. 上传到服务器,解压即用。
blade命令介绍

查看 blade 命令帮助文档
eg: blade -h

所有的命令都可以添加 -h 来查看此命令如何使用,如创建混沌实验
eg:blade create -h

所有的命令都可以添加 -d 来查看更细的执行信息
eg:blade create cpu fullload -d

  • create,创建一个混沌演练实验,指执行故障注入。
    命令是 blade create [TARGET] [ACTION] [FLAGS],比如实施一次 Dubbo consumer 调用 xxx.xxx.Service 接口延迟 3s,则执行的命令为 
    blade create dubbo delay --consumer --time 3000 --service xxx.xxx.Service
    如果注入成功,则返回实验的 uid,用于状态查询和销毁此实验使用。
  • destroy,销毁之前的混沌实验,比如销毁上面提到的 Dubbo 延迟实验,命令是 
    blade destroy UID
  • prepare, 混沌实验前的准备,比如演练 Java 应用,则需要挂载 java agent。例如要演练的应用名是 business,则在目标主机上执行 
    blade p jvm --process business
    如果挂载成功,返回挂载的 uid,用于状态查询或者撤销挂载。
  • revoke, 撤销之前混沌实验准备,比如卸载 java agent。命令是
     blade revoke UID
  • query, 查询部分实验所需的系统参数
  • server, 启动 web server,暴露 HTTP 服务,可以通过 HTTP 请求来调用 chaosblade。
    在目标机器xxxx上执行下面命令:
    blade server start -p 9526
    执行 CPU 满载实验的命令为:
    ​
    curl "http:/xxxx:9526/chaosblade?cmd=create%20cpu%20fullload"
  • status, 查询准备阶段或者实验的状态,命令是
    blade status UID 或者 blade status --type create
  • version, 打印blade版本信息

blade server

在 server 模式下,后台启动 blade,blade 程序会对外暴露 web 服务,上层可通过 http 调用。

请求格式是 chaosblade?cmd=具体命令,例如执行 CPU 满载,则请求是

chaosblade?cmd=create%20cpu%20fullload

重点,因为前面讲的这些功能都是单机命令行的,实际的场景是希望在一个控制台集中 *** 作所有场景,有了这个远程通信能力,上述需求落地才有了可能。

start 启动 server 模式, 暴露 web 服务
stop 停止 server 模式, 关闭 web 服

start 命令参数:

-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%20cpu%20load%20--cpu-percent%2050"

执行返回结果如下:

{"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%2069ceda100e8cdaeb"
​

执行返回结果如下:

{"code":200,"success":true,"result":{"target":"cpu","action":"fullload","flags":{"cpu-percent":"50"}}}

blade status

查询混沌实验和混沌实验环境状态,可通过创建的混沌实验的 uid 或命令类型来查询混沌实验。 status 可以简写为 s,即 blade status 可以简写为 blade s。

参数:

--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 命令帮助

适用的场景

场景

blade create支持的命令

基础资源类cpu cpu
disk 磁盘
mem 内存
network 网络
process 进程
file 文件
strace strace,常用来跟踪进程执行时的系统调用和所接受的信号语言本身jvm JVM
script 脚本HTTPhttpRPC框架dubbo Dubbo,RPC框架
tars tars,RPC开发框架web容器servlet java servlet数据库&缓存hbase hbase数据库
jedis jedis,Redis官方首选的Java客户端开发包
lettuce redis 客户端 lettuce
mongodb MongoDB数据库
mysql mysql数据库
psql Postgrelsql数据库
redisson redisson,是架设在Redis基础上的一个Java驻内存数据网格数据库连接池druid Druid,JDBC数据库连接池、监控组件消息kafka kafka,分布式发布订阅消息系统,它可以处理消费者在网站中的所有动作流数据。
rabbitmq rabbitmq
rocketmq Rocketmq,可以使消息发送或拉取延迟或异常云原生服务docker Docker,应用容器引擎
k8s Kubernetes,用于管理云平台中多个主机上的容器化的应用云平台es ElasticSearch,实时搜索与数据分析引擎 基础资源类故障

cpu利用率高

应用因为某种原因导致CPU使用率达到100%,导致应用对外服务能力下降或不可用。

可以指定核数、具体核满载或者总 CPU 负载百分比。

旨在 CPU 在特定负载下,验证服务质量、监控告警、流量调度、d性伸缩等能力。

load、fullload、fl 命令都可以,即 :

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 设定运行时长,单位是秒,通用参数

磁盘满

模拟磁盘填充,可以指定填充的目录和填充大小。

验证磁盘满下对系统服务的影响,比如监控告警、服务稳定性等。

blade create disk fill

更多相关附加参数如下:

--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 高负载下对系统服务的影响,比如监控告警、服务稳定性、是否有对应的预案、故障恢复的时长等。

blade create disk burn

更多相关附加参数如下:
--path string, 指定提升磁盘 io 的目录,会作用于其所在的磁盘上,默认值是 /
--read ,触发提升磁盘读 IO 负载,会创建 600M 的文件用于读,销毁实验会自动删除
--write, 触发提升磁盘写 IO 负载,会根据块大小的值来写入一个文件,比如块大小是 10,则固定的块的数量是 100,则会创建 1000M 的文件,销毁实验会自动删除
--size string ,块大小, 单位是 M, 默认值是 10,一般不需要修改,除非想更大的提高 io 负载
--timeout string ,设定运行时长,单位是秒,通用参数

内存使用率高

应用因为某种原因导致系统内存占用率很高,导致应用对外服务能力下降或不可用。

blade create mem load

更多相关附加参数如下:

--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 命令查看内存使用。

网络类故障

网络包故障

​​​​​​​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 生效。

公共参数:

--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 设定运行时长,单位是秒,通用参数

进程类故障

杀进程

此实验会指定进程号杀掉进程。支持命令行或者命令中进程匹配。

此实验可以验证程序的自愈能力,或者服务进程不存在时,系统的容错能力。

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 时,系统的容错能力。

blade create process stop

--process string 进程关键词,会在整个命令行中查找
--process-cmd string 进程命令,只会在命令中查找
--ignore-not-found 忽略未发现的进程
--timeout string 设定运行时长,单位是秒,通用参数

java语言类故障
blade prepare jvm

挂载 java agent,执行 java 实验场景必要步骤

-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 挂载

blade prepare jvm --pid 26652

注意:挂载 java agent *** 作是个比较耗时的过程,在未返回结果前请耐心等待。

blade create jvm 

ChaosBlade的原理主要是使用了字节码增强技术(ASM),即改变class内容,再重新通过jvm-sandbox提供的SandboxClassLoader加载到jvm使其生效。所以使用时需要指定jvm进程,以便插入被变更后的字节码。

jvm 本身相关场景,以及可以指定类,方法注入延迟、返回值、异常故障场景,也可以编写 groovy 和 java 脚本来实现复杂的场景。目前支持的场景如下

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 限制影响百分比

各场景还有自身所独有的参数,可以在每个场景文档中查看:

blade create jvm - chaosblade-help-zh-CN

shell脚本类故障
blade create script delay

通过指定脚本和函数执行延迟场景。

--file string 脚本路径(必要参数)
--function-name string 脚本中的函数名(必要参数)
--time string 延迟时间,单位是毫秒(必要参数)
--timeout string 设定运行时长,单位是秒,通用参数

blade create script exit

通过指定脚本和函数执行退出场景。

--exit-code string 退出码,默认值是 1
--exit-message string 退出信息
--file string 脚本路径(必要参数)
--function-name string 脚本中的函数名(必要参数)
--timeout string 设定运行时长,单位是秒,通用参数

HTTP类故障
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

blade create dubbo

在dubbo中分为consumer和provider两种角色,当consumer在调用provider时,我们现在想使这个请求增加延时,我们既可以在provider端针对指定的服务增加延时,也可以在consumer调用时针对指定的服务进行延时,所以我们可以稍微看下上面的命令,它其实是在consumer进行控制的,命令也是支持在provider端进行控制的。
参数中的--consumer和--provider,表示的就是命令中可以控制服务调用的两端。

blade create dubbo delay,延迟时间
blade create dubbo throwCustomException,抛自定义异常

公共参数:
--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故障
blade create servlet

Servlet 是 Java 的 web 的接口规范,Java web 服务器都遵循此规范实现。本场景主要模拟 Java Web 请求延迟、异常场景。

blade create servlet delay 请求延迟

blade create servlet throwCustomException 请求异常

servlet 通用参数:

--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,注意要带 /

数据库故障
blade create mysql

通用参数:

--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:数据库查询慢 

./blade create mysql delay --time 3000 --sqltype select --port $port --database ss_stl --table stl_cost_config_ratio_seg --effect-percent 50

数据库连接池故障

Druid首先是一个数据库连接池,是一个JDBC组件。

blade create druid

连接池打满

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 参数指定,例如: 

--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
blade create docker cpu

容器内 CPU 负载实验场景,同基础资源的 CPU 场景

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 环境下,还支持的参数如下:

--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% 的实验场景,执行命令如下:

blade create docker cpu fullload --cpu-percent 80 --blade-tar-file /root/chaosblade-0.4.0.tar.gz --container-id 5239e26f6329

容器内网络实验场景,同基础资源的网络场景

blade create docker network

支持的网络场景命令如下:

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 环境下,还支持的参数如下:

--container-id string 目标容器 ID
--docker-endpoint string Docker server 地址,默认为本地的 /var/run/docker.sock
--image-repo string chaosblade-tool 镜像仓库
--image-version string chaosblade-tool 镜像版本

容器内进程场景,同基础资源进程场景,例如:

blade create docker process

支持的进程场景如下:

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 进程,命令执行如下:

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 命令执行。目前支持的实验场景如下:

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。
Helm 安装包下载地址:https://github.com/chaosblade-io/chaosblade-operator/releases 。
使用以下命令安装:

helm install --namespace kube-system --name chaosblade-operator chaosblade-operator-.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 状态,说明部署成功。

blade create k8s的详细使用手册见:

blade create k8s - chaosblade-help-zh-CN

欢迎分享,转载请注明来源:内存溢出

原文地址: http://www.outofmemory.cn/zaji/5694093.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2022-12-17
下一篇 2022-12-17

发表评论

登录后才能评论

评论列表(0条)

保存