要了解ChaosBlade是什么,我们需要先介绍下什么是混沌工程。顾名思义,混沌工程是一门对系统进行实验的学科,旨在了解系统对应生产环境的各种混乱状况的能力。我们都希望系统具备可靠性,但影响可靠性的因素有很多,混沌工程能找到证据,指明哪些异常不可回避的状况下系统的应变情况。它的唯一目标就是证明系统存在缺陷。通过开展混沌工程方面的科学实验,可以测试系统是否存在缺陷,了解系统在混乱的类生产环境条件下如何表现。
ChaosBlade正是一款开源的混沌工程实验工具,可用于模拟应用程序、云原生、基础设施的各种异常或故障场景,以测试系统的弹性能力和容错性,帮助企业更好地发现系统是否存在缺陷,进而排查系统中的问题、解决云原生过程中高可用等问题。ChaosBlade除了提供丰富的预设场景外,它独特之处在于它还允许用户自定义场景和插件,以满足各种测试场景和需求。如果你打算进行 ChaosBlade的二次开发,建议遵循以下步骤:
1、了解 ChaosBlade
首先,了解 ChaosBlade 的基本概念和架构非常重要。它由一个核心 Engine 组件和多个插件组件构成,可以通过 REST API 或blade命令行接口进行配置、控制执行和查询。Engine负责协调插件组件的工作,并将所有的请求转发到相应的插件组件中执行。插件组件实现了各种测试场景和工具,例如基础资源故障、网络模拟、进程注入、文件操作、数据库故障等等。
详细的组件架构(Component Architecture)图如下:

Cli包含create、destroy、status、prepare、revoke、version 6个命令;
混沌实验数据使用SQLite存储在本地(chaosblade.dat);
Create和destroy命令调用相关的混沌实验执行器创建或者销毁混沌实验;
Prepare和 revoke命令调用混沌实验准备执行器准备或者恢复实验环境,比如挂载jvm-sandbox;
混沌实验和混沌实验环境准备记录可以通过status命令查询。
2、配置和部署ChaosBlade
在进行ChaosBlade二次开发之前,需要了解如何自己编译和部署ChaosBlade。首先,你需要获取ChaosBlade的源代码(如下图),并在相应的组件仓库内的文件Makefile里找到对应命令,执行的对应构建、编译、打包等命令,以生成相应的可执行的二进制文件(chaosblade-1.7.1-linux-amd64.tar.gz、)和 Docker镜像(chaosblade-tool-1.7.1、chaosblade-operator-1.7.1)。
各组件源码地址如下表:
源码地址 | *** |
https://github.com/chaosblade-io/chaosblade.git | Engine(cli) |
https://github.com/chaosblade-io/chaosblade-operator.git | k8s组件 |
https://github.com/chaosblade-io/chaosblade-exec-middleware.git | 中间件组件 |
https://github.com/chaosblade-io/chaosblade-exec-os.git | 基础资源组件 |
https://github.com/chaosblade-io/chaosblade-exec-jvm.git | Java应用组件 |
https://github.com/chaosblade-io/chaosblade-exec-docker.git | docker组件(旧) |
https://github.com/chaosblade-io/chaosblade-exec-cri.git | cri组件(新) |
https://github.com/chaosblade-io/chaosblade-exec-golang.git | Go应用组件 |
https://github.com/chaosblade-io/chaosblade-exec-cloud.git | cloud组件 |
https://github.com/chaosblade-io/chaosblade-exec-cplus.git | C++应用组件 |
如果你想自己编译和部署chaosblade,操作如下:

2.1 不同的系统环境编译命令不同
-
• 如果是在mac 系统,编译当前最新版本可以执行: make build_darwin
-
• 如果是在linux系统,编译当前最新版本可以执行: make build_linux
-
• 你也可以选择部分组件进行编译, 比如,你只想编译blade-cli and os 场景组件,执行: macke build_with cli os
-
• 如果是mac系统,执行: make build_with cli os_darwin
-
• 如果你想选择cli和基础资源组件,在编译linux系统, 可执行: ARGS="cli os" make build_with_linux
-
• 编译后可以得到如下的组件工具集,如果是主机环境直接就可以测试使用了,如果要部署到k8s等环境,还需要配合编译operator仓库代码进行使用。


2.2 部署
2.2.1 测试使用
你可以使用命令行或 Docker的方式来启动和运行ChaosBlade。命令行方式:比较简单,详见官网https://chaosblade.io Docker方式启动自行测试使用:docker pull chaosbladeio/chaosblade-demo docker run -it --privileged chaosbladeio/chaosblade-demo
2.2.2 正式部署
在启动ChaosBlade之前,你需要配置和设置以下内容:请先确保环境中已经部署 Kubernetes 集群,Kubernetes版本必须不低于版本 v1.16。确保环境中已经安装 Helm(Helm v3 )
2.2.2.1 主机环境下部署
tar -xvf chaosblade-1.7.1-linux-amd64.tar.gz && cd chaosblade-1.7.1/ 验证安装 ./blade v
2.2.2.2 Kubernete环境下部署
helm install chaosblade-operator chaosblade-operator-1.7.1.tgz --namespace chaosblade 验证安装,请执行以下命令:
kubectl get pod -n chaosblade
以下是预期输出
NAME READY STATUS RESTARTS AGE chaosblade-operator-34234959-labgb 1/1 Running 0 6s
chaosblade-tool-d95jd 1/1 Running 0 6s
chaosblade-tool-hrqcv 1/1 Running 0 6s
chaosblade-tool-q56jd 1/1 Running 0 6s
2.2.2.3 其他
如果需要监控cpu,磁盘等一些基础资源指标,可以配置和启动 Metrics 存储和可视化
3、开发新的插件或场景
一旦你熟悉了 ChaosBlade的基本概念、配置、组件、安装部署,你就可以开始进行二次开发了。在 ChaosBlade 中,你可以为特定的场景开发新的插件或实验场景。要开发新的插件或场景,你需要遵循以下步骤:
-
• 了解插件或场景的基本需求和功能,并定义相应的接口和协议
-
• 实现插件或场景的核心功能和逻辑,并进行单元测试和集成测试
-
• 编写相应的文档和使用指南。然后发布到社区和官方网站,推动和维护第三方插件和场景的生态系统和社区。比如你想扩展一个基础资源的实验:杀死进程,需要fork一份https://github.com/chaosblade-io/chaosblade-exec-os.git 组件下的代码到自己的github仓库,进行扩展。
-
• 如下图所示:新增文件,方法和参数等等

-
• 功能测试完成后,提交pr到ChaosBlade社区,或者自己的私有库,打tag,把新版本重新引入 chaosblade的仓库,如下图:

参考上面编译过程,重新编译出chaosblade-1.7.1-linux-amd64.tar.gz,替换运行即可。
-
• 同时如果你想把这个基础资源的实验:杀死进程扩展到云原生node、pod、container 场景中,还需要修改operator仓库,重新编译打包 chaosblade-operator-1.7.1.tgz, 如下图:

-
• 卸载原有的重新helm安装即可;helm uninstall chaosblade-operator -n chaosblade 然后使用新包执行,重新安装:
helm install chaosblade-operator chaosblade-operator-1.7.1.tgz --namespace chaosbalde4、贡献代码和提交PR
在ChaosBlade社区中,任何人都可以参与和贡献代码,以改进和增强ChaosBlade的功能和性能。要贡献代码,你需要遵循以下步骤:
-
• Fork上方官方的 ChaosBlade代码仓库,并创建一个新分支来进行开发
-
• 编写相应的代码和文档,遵守相关的代码规范和标准
-
• 执行测试、检查语法和代码格式,并确保通过所有的 CI/CD 流程
-
• 提交代码到 GitHub,并创建一个新的pull-request,等待审核和合并。
如果你的代码被审核通过并被合并到 ChaosBlade的主代码库中,那么恭喜你,你就成功地贡献了代码,并对该CNCF开源项目做出了贡献。