项目地址
ChaosBlade 是阿里巴巴开源的一款遵循混沌工程原理和混沌实验模型的实验注入工具,帮助企业提升分布式系统的容错能力,并且在企业上云或往云原生系统迁移过程中业务连续性保障。
Chaosblade 是内部 MonkeyKing 对外开源的项目,其建立在阿里巴巴近十年故障测试和演练实践基础上,结合了集团各业务的最佳创意和实践。
ChaosBlade 不仅使用简单,而且支持丰富的实验场景,场景包括:
基础资源:比如 CPU、内存、网络、磁盘、进程等实验场景;
Java 应用:比如数据库、缓存、消息、JVM 本身、微服务等,还可以指定任意类方法注入各种复杂的实验场景;
C++ 应用:比如指定任意方法或某行代码注入延迟、变量和返回值篡改等实验场景;
Docker 容器:比如杀容器、容器内 CPU、内存、网络、磁盘、进程等实验场景;
云原生平台:比如 Kubernetes 平台节点上 CPU、内存、网络、磁盘、进程实验场景,Pod 网络和 Pod 本身实验场景如杀 Pod,容器的实验场景如上述的 Docker 容器实验场景;
将场景按领域实现封装成一个个单独的项目,不仅可以使领域内场景标准化实现,而且非常方便场景水平和垂直扩展,通过遵循混沌实验模型,实现 chaosblade cli 统一调用。目前包含的项目如下:
chaosblade:混沌实验管理工具,包含创建实验、销毁实验、查询实验、实验环境准备、实验环境撤销等命令,是混沌实验的执行工具,执行方式包含 CLI 和 HTTP 两种。提供完善的命令、实验场景、场景参数说明,操作简洁清晰。
chaosblade-spec-go: 混沌实验模型 Golang 语言定义,便于使用 Golang 语言实现的场景都基于此规范便捷实现。
chaosblade-exec-os: 基础资源实验场景实现。
chaosblade-exec-docker: Docker 容器实验场景实现,通过调用 Docker API 标准化实现。
chaosblade-operator: Kubernetes 平台实验场景实现,将混沌实验通过 Kubernetes 标准的 CRD 方式定义,很方便的使用 Kubernetes 资源操作的方式来创建、更新、删除实验场景,包括使用 kubectl、client-go 等方式执行,而且还可以使用上述的 chaosblade cli 工具执行。
chaosblade-exec-jvm: Java 应用实验场景实现,使用 Java Agent 技术动态挂载,无需任何接入,零成本使用,而且支持卸载,完全回收 Agent 创建的各种资源。
chaosblade-exec-cplus: C++ 应用实验场景实现,使用 GDB 技术实现方法、代码行级别的实验场景注入。
中文文档
如果想不下载 chaosblade 工具包,快速体验 chaosblade,可以拉取 docker 镜像并运行,在容器内体验。
操作步骤如下: 下载镜像:
docker pull chaosbladeio/chaosblade-demo
启动镜像:
docker run -it --privileged chaosbladeio/chaosblade-demo
进入镜像之后,可阅读 README.txt 文件实施混沌实验,Enjoy it。
获取 chaosblade 最新的 release 包,目前支持的平台是 linux/amd64 和 darwin/64,下载对应平台的包。
下载完成后解压即可,无需编译。
下载地址
进入解压后的文件夹,可以看到以下内容:
├── bin
│ ├── chaos_burncpu
│ ├── chaos_burnio
│ ├── chaos_changedns
│ ├── chaos_delaynetwork
│ ├── chaos_dropnetwork
│ ├── chaos_filldisk
│ ├── chaos_killprocess
│ ├── chaos_lossnetwork
│ ├── jvm.spec.yaml
│ └── tools.jar
├── blade
└── lib
└── sandbox
An easy to use and powerful chaos engineering experiment toolkit
Usage:
blade [command]
Available Commands:
create Create a chaos engineering experiment
destroy Destroy a chaos experiment
help Help about any command
prepare Prepare to experiment
revoke Undo chaos engineering experiment preparation
status Query preparation stage or experiment status
version Print version info
Flags:
-d, --debug Set client to DEBUG mode
-h, --help help for blade
Use "blade [command] --help" for more information about a command.
我们拿 CPU 满载(CPU 使用率 100%) 演练场景举例(!!注意,在不清楚影响面的情况下,切勿在生产系统机器上执行),执行以下命令实施实验:
./blade create cpu fullload
执行结果返回:
{"code":200,"success":true,"result":"7c1f7afc281482c8"}
通过 top 命令查看 CPU 使用率
CPU usage: 93.79% user, 6.20% sys, 0.0% idle
此时命令已经生效,停止混沌实验,执行:
./blade destroy 7c1f7afc281482c8
返回以下结果,表示停止实验成功
{"code":200,"success":true,"result":"command: cpu fullload --debug false --help false"}
再去观察 CPU 情况,CPU 负载已回到正常状态:
CPU usage: 6.36% user, 4.74% sys, 88.88% idle
一次 CPU 满载演练完成。
这次实验,我们演练 Dubbo 应用,我们的需求是 consumer 调用 com.alibaba.demo.HelloService 服务下的 hello 接口延迟 3 秒。接下来我们下载所需要的 Dubbo Demo:
dubbo-provider
dubbo-consumer
下载完成后,执行以下命令启动应用,注意必须先启动 dubbo-provider,然后再启动 dubbo-consumer:
# 启动 dubbo-provider
nohup java -Djava.net.preferIPv4Stack=true -Dproject.name=dubbo-provider -jar dubbo-provider-1.0-SNAPSHOT.jar > provider.nohup.log 2>&1 &
# 稍等 2 秒,然后启动 dubbo-consumer
nohup java -Dserver.port=8080 -Djava.net.preferIPv4Stack=true -Dproject.name=dubbo-consumer -jar dubbo-consumer-1.0-SNAPSHOT.jar > consumer.nohup.log 2>&1 &
访问 http://localhost:8080/hello?msg=world,返回以下信息,表示启动成功:
{
msg: "Dubbo Service: Hello world"
}
接下来我们要使用 blade 工具进行混沌实验,在执行实验前,我们需要先执行 prepare 命令,挂载所需要的 java agent:
./blade prepare jvm --process dubbo-consumer
返回以下结果,表示实验准备成功:
{"code":200,"success":true,"result":"e669d57f079a00cc"}
我们开始实施混沌实验,我们的需求是 consumer 调用 com.alibaba.demo.HelloService 服务下的 hello 接口延迟 3 秒。 我们执行 ./blade create dubbo delay -h 命令查看 dubbo 调用延迟的命令用法:
Usage:
blade create dubbo delay
Flags:
--appname string The consumer or provider application name
--consumer To tag consumer role experiment.
-h, --help help for delay
--methodname string The method name in service interface
--offset string delay offset for the time
--process string Application process name
--provider To tag provider experiment
--service string The service interface
--time string delay time (required)
--version string the service version
Global Flags:
-d, --debug Set client to DEBUG mode
调用 com.alibaba.demo.HelloService 服务下的 hello 接口延迟 3 秒,我们执行以下命令:
./blade create dubbo delay --time 3000 --service com.alibaba.demo.HelloService --methodname hello --consumer --process dubbo.consumer
返回以下结果,表示执行成功;访问 http://localhost:8080/hello?msg=world 验证是否延迟 3 秒
{"code":200,"success":true,"result":"ec695fee1e458fc6"}
对实施实验的命令进行解析:
--time: 3000,表示延迟 3000 ms;单位是 ms
--service: com.alibaba.demo.HelloService, 表示调用的服务
--methodname: hello,表示服务接口方法
--consumer: 表示演练的是 dubbo consumer
--process: dubbo.consumer,表示对哪个应用进程实施混沌实验
停止当前延迟的混沌实验,再次访问 url 验证是否恢复正常:
./blade destroy ec695fee1e458fc6
不尽兴的话,我们再实施调用刚才那个服务抛异常,执行 ./blade create dubbo throwCustomException -h 命令查看帮助:
Throw custom exception with --exception option
Usage:
blade create dubbo throwCustomException
Aliases:
throwCustomException, tce
Flags:
--appname string The consumer or provider application name
--consumer To tag consumer role experiment.
--exception string Exception class inherit java.lang.Exception (required)
-h, --help help for throwCustomException
--methodname string The method name in service interface
--process string Application process name
--provider To tag provider experiment
--service string The service interface
--version string the service version
Global Flags:
-d, --debug Set client to DEBUG mode
和刚才延迟命令参数差不多,因为相同的参数是演练 dubbo 所需要的,不同的是没有了 --time,多了个 --exception 参数。 我们模拟调用刚才的服务抛 java.lang.Exception 异常:
./blade create dubbo throwCustomException --exception java.lang.Exception --service com.alibaba.demo.HelloService --methodname hello --consumer --process dubbo.consumer
返回以下结果,访问 http://localhost:8080/hello?msg=world 验证是否异常
{"code":200,"success":true,"result":"09dd96f4c062df69"}
停止此次试验,再次访问请求,验证是否恢复:
./blade destroy 09dd96f4c062df69
最后,我们撤销刚才的实验准备,即卸载 Java Agent:
./blade revoke e669d57f079a00cc
如果找不到之前执行 prepare 返回的 UID 的话,执行 ./blade status --type prepare 命令查询:
{
"code": 200,
"success": true,
"result": [
{
"Uid": "e669d57f079a00cc",
"ProgramType": "jvm",
"Process": "dubbo.consumer",
"Port": "59688",
"Status": "Running",
"Error": "",
"CreateTime": "2019-03-29T16:19:37.284579975+08:00",
"UpdateTime": "2019-03-29T17:05:14.183382945+08:00"
}
]
}
了解完相关模型接口之后,在此之上我们可以继续简单的了解模型之间是如何进行交互,一条命令如:blase create cpu fullload输入回车之后,系统是如何一步步解析成对应的模型,并最终执行达到压测负载效果的。话不多说,看下图:
项目地址
Cobra 是一个库,它提供了一个简单的界面来创建类似于 git & go 工具的强大的现代 CLI 界面。
Cobra 也是一个应用程序,它将生成您的应用程序脚手架以快速开发基于 Cobra 的应用程序。
Cobra 提供:
简单易用的基于子-的CLI: ,app server,app fetch等。
完全符合 POSIX 的标志(包括短版和长版)
嵌套子命令
全局、本地和级联标志
易产生的应用程序和命令与cobra init appname&cobra add cmdname
智能建议(app srver...你的意思是app server?)
命令和标志的自动帮助生成
-h、--help、 等的自动帮助标志识别。
为您的应用程序自动生成 shell 自动完成功能(bash、zsh、fish、powershell)
为您的应用程序自动生成的手册页
命令别名,这样您就可以在不破坏它们的情况下更改内容
定义自己的帮助、用法等的灵活性。
可选与viper紧密集成,用于 12 要素应用程序
使用 Cobra 很容易。首先,使用go get来安装最新版本的库。此命令将安装cobra生成器可执行文件以及库及其依赖项:
go get -u github.com/spf13/cobra
接下来,在您的应用程序中包含 Cobra:
import "github.com/spf13/cobra"
首先,程序再一开始的时候,会添加各类基础命令,,诸如:version、prepare、revoke、create等,这些命令除了create拥有多种二级子命令之外,其余都是原生的Cobra命令模型,只有一级命令搭配参数进行操作。这些命令相对来说都比较简单,具体实现可以直接看源码,在熟悉了Cobra之后看一眼就能明白。
除了项目源码和文档,另一个了解chaosblade用法的方式是通过不断的help提示来获取帮助信息。比如:
blade help
blade create help
blade create cpu help
在你输入blade之后不知所措的时候,一路help下去会有惊喜不断,感觉大神提供的彩蛋。
项目地址
Chaosblade-box 是一个场景丰富的混沌工程平台,目前包含的场景有:
Chaosblade-exec-os:基本资源实验场景的实现。
Chaosblade-exec-docker : Docker 容器实验场景实现,通过调用 Docker API 进行标准化。
Chaosblade-operator:实现Kubernetes平台实验场景,混沌实验通过Kubernetes标准CRD方式定义,非常方便使用Kubernetes资源操作方式来创建、更新、删除实验场景,包括使用kubectl、client-go等.,并且还使用了上述的 Chaosblade cli 工具。
Chaosblade-exec-jvm:Java应用实验场景实现,采用Java Agent技术动态挂载,无需任何访问,零成本使用它还支持卸载,完全回收Agent创建的各种资源。
Chaosblade-exec-cplus:C++应用实验场景实现,使用GDB技术实现方法和代码行级实验场景注入。
limus-chaos-generic:进行云原生混沌工程的工具集
转到您克隆的项目根目录并执行编译:
mvn clean package -Dmaven.test.skip=true
如果您编译 Chaosblade-box 图像,您可以执行以下操作:
make build_image
干净的编译:
mvn clean
helm包:
helm package deploy/chaosblade-box
如果你已经安装了 MySQL,你需要创建一个名为 的 schema chaosblade,如果你没有安装 MySQL,你可以通过 Docker 运行它,运行方法如下:
docker run -d -it -p 3306:3306 \
-e MYSQL_DATABASE=chaosblade \
-e MYSQL_ROOT_PASSWORD=DATASOURCE_PASSWORD \
--name mysql-5.6 mysql:5.6 \
--character-set-server=utf8mb4 \
--collation-server=utf8mb4_unicode_ci \
--default-time_zone='+8:00'
注意:必须替换以下参数:DATASOURCE_URL、DATASOURCE_USERNAME、DATASOURCE_PASSWORD
然后运行应用程序,运行方法如下:
nohup java -Duser.timezone=Asia/Shanghai -jar chaosblade-box-web-0.4.2.jar --spring.datasource.url=DATASOURCE_URL --spring.datasource.username=DATASOURCE_USERNAME --spring.datasource.password=DATASOURCE_PASSWORD > chaosblade-box.log 2>&1 &
您可以通过浏览器访问http://127.0.0.1:8080网站使用平台。
如果部署在kubernetes上,使用方法如下:
helm install chaosblade-box chaosblade-box-0.4.2.tgz --set spring.datasource.password=DATASOURCE_PASSWORD --namespace chaosblade
docker pull centos
docker run -it --name centos -d centos:latest
docker exec -it `docker ps | awk '{print $1}' | grep -v CONTAINER` sh
yum install wget
wget https://chaosblade.oss-cn-hangzhou.aliyuncs.com/platform/chaosagentctl.sh
chmod +x chaosagentctl.sh
./chaosagentctl.sh install -r https://chaosblade.oss-cn-hangzhou.aliyuncs.com/platform/chaosagent -t 127.0.0.1:8080 (# IP地址请换成真实地址)
1、下载 chaosblade 客户端程序
2、解压缩至 /opt/chaosblade 目录下