
项目背景
项目介绍
ChaosBlade 项目托管在 Github 平台,放在 chaosblade-io 组织下,方便项目管理和社区发展。设计 ChaosBlade 初期就考虑了易用性和场景扩展的便捷性,方便大家上手使用以及根据各自需要扩展更多的实验场景,遵循混沌实验模型提供了统一的操作简洁的执行工具,并且根据领域划分将场景实现封装成一个一个单独的项目,方便实现领域内场景扩展。目前包含的场景领域如下:
-
基础资源:比如 CPU、内存、网络、磁盘、进程等实验场景 -
Java 应用:比如数据库、缓存、消息、JVM 本身、微服务等,还可以指定任意类方法注入各种复杂的实验场景 -
C++ 应用:比如指定任意方法或某行代码注入延迟、变量和返回值篡改等实验场景 -
Docker 容器:比如杀容器、容器内 CPU、内存、网络、磁盘、进程等实验场景 -
Kubernetes 平台:比如节点上 CPU、内存、网络、磁盘、进程实验场景,Pod 网络和 Pod 本身实验场景如杀 Pod,容器的实验场景如上述的 Docker 容器实验场景 -
云资源:比如阿里云 ECS 宕机等实验场景
-
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-help-doc: ChaosBlade 工具和场景使用文档 -
chaosblade-dev-doc: ChaosBlade 项目开发文档 -
awesome-chaosblade: ChaosBlade 相关的外部文档
实验模型
实验模型的推导
-
10.0.0.1 机器上挂载的 A 磁盘满造成了服务不可用 -
所有节点上的 B dubbo 服务因为执行缓慢造成上游 A dubbo 服务调用延迟,从而造成用户访问缓慢 -
Kubernetes A 集群中 B 节点上 CPU 所有核使用率满载,造成 A 集群中的 Pod 调度异常 -
Kubernetes C 集群中 D Pod 网络异常,造成 D 相关的 Service 访问异常
实验模型的介绍
-
Scope: 实验实施范围,指具体实施实验的机器、集群及其资源等 -
Target: 实验靶点,指实验发生的组件。如基础资源场景中的 CPU、网络、磁盘等,Java 场景中的应用组件如 Dubbo、Redis、RocketMQ、JVM 等,容器场景中的 Node、Pod、Container自身等 -
Matcher: 实验规则匹配器,根据所配置的 Target,定义相关的实验匹配规则,可以配置多个。由于每个 Target 可能有各自特殊的匹配条件,比如 RPC 领域的 Dubbo、gRPC 可以根据服务提供者提供的服务和服务消费者调用的服务进行匹配,缓存领域的 Redis,可以根据 set、get 操作进行匹配。还可以对 matcher 进行扩展,比如扩展实验场景执行策略,控制实验触发时间。 -
Action: 指实验模拟的具体场景,Target 不同,实施的场景也不一样,比如磁盘,可以演练磁盘满,磁盘 IO 读写高,磁盘硬件故障等。如果是应用,可以抽象出延迟、异常、返回指定值(错误码、大对象等)、参数篡改、重复调用等实验场景。如果是容器服务,可以模拟 Node、Pod、Container 资源异常或者其上的基础资源异常等。
-
混沌实验的实施范围是什么 -
实施混沌实验的对象是什么 -
实验对象触发实验的条件有哪些 -
具体实施什么实验场景
实验模型的意义
-
简洁:层次清晰,通俗易懂 -
通用:覆盖目前所有的故障场景,包含基础资源、应用服务、容器服务、云资源等 -
易实现:很方便的定义清晰的接口规范,实验场景扩展实现简单 -
语言、领域无关:可以扩展多语言、多领域的模型实现
-
更精准的描述混沌实验场景 -
更好的理解混沌实验注入 -
方便沉淀现有的实验场景 -
依据模型发掘更多的场景 -
混沌实验工具更加规范、简洁
实验模型的应用
基于混沌实验模型的 chaosblade cli 设计:
基于混沌实验模型的 chaosblade operator 设计:
apiVersion: chaosblade.io/v1alpha1kind: ChaosBlademetadata:name: loss-node-network-by-namesspec:experiments:scope: nodetarget: networkaction: lossdesc: "node network loss"matchers:name: namesvalue: ["cn-hangzhou.192.168.0.205"]name: percentvalue: ["60"]name: interfacevalue: ["eth0"]name: local-port: ["40690"]
kubectl apply -f loss-node-network-by-names.yaml
~ » kubectl get blade loss-node-network-by-names -o json{"apiVersion": "chaosblade.io/v1alpha1","kind": "ChaosBlade","metadata": {"creationTimestamp": "2019-11-04T09:56:36Z","finalizers": ["finalizer.chaosblade.io"],"generation": 1,"name": "loss-node-network-by-names","resourceVersion": "9262302","selfLink": "/apis/chaosblade.io/v1alpha1/chaosblades/loss-node-network-by-names","uid": "63a926dd-fee9-11e9-b3be-00163e136d88"},"status": {"expStatuses": [{"action": "loss","resStatuses": [{"id": "057acaa47ae69363","kind": "node","name": "cn-hangzhou.192.168.0.205","nodeName": "cn-hangzhou.192.168.0.205","state": "Success","success": true,"uid": "e179b30d-df77-11e9-b3be-00163e136d88"}],"scope": "node","state": "Success","success": true,"target": "network"}],"phase": "Running"}}
kubectl delete -f loss-node-network-by-names.yaml
kubectl delete blade loss-node-network-by-names
blade create k8s node-network loss --percent 60 --interface eth0 --local-port 40690 --kubeconfig config --names cn-hangzhou.192.168.0.205
{"code":200,"success":true,"result":"e647064f5f20953c"}
blade query k8s create e647064f5f20953c --kubeconfig config{"code": 200,"success": true,"result": {"uid": "e647064f5f20953c","success": true,"error": "","statuses": [{"id": "fa471a6285ec45f5","uid": "e179b30d-df77-11e9-b3be-00163e136d88","name": "cn-hangzhou.192.168.0.205","state": "Success","kind": "node","success": true,"nodeName": "cn-hangzhou.192.168.0.205"}]}}
blade destroy e647064f5f20953c
基于混沌实验模型构建混沌实验平台
-
chaosblade 会合并所有领域场景的 yaml 文件,提供给 ChaosBlade SDK -
ChaosBlade SDK 感知 yaml 文件变化,重新解析场景描述文件,透传给上层平台,包含场景和场景参数的变更 -
ChaosBlade SDK 透传用户在平台上所配置的参数,调用 chaosblade 工具执行 -
chaosblade 工具会根据调用参数,和解析各领域 yaml 场景描述文件来调用不同的执行器
总结
-
混沌实验模型使实验场景变量参数化,参数规范化 -
可遵循模型实现实验场景领域化的水平扩展 -
可将混沌实验模型和领域内标准化实现相结合,便捷实现领域内场景垂直扩展 -
上层的领域场景可以复用遵循混沌实验模型定义的场景 -
通过混沌实验模型声明的场景描述可以很好的接入到 chaosblade cli 中 -
遵循实验模型可以很方便的构建上层混沌实验平台
项目意义
未来规划
-
Golang 应用混沌实验场景 -
NodeJS 应用混沌实验场景
-
提供一个混沌实验平台供大家使用 -
完善 ChaosBlade 各项目的开发文档 -
完善 chaosblade 工具的英文文档
-
bug report -
feature request -
performance issue -
help wanted -
doc incomplete -
test missing -
feature design -
any question on project
了解更多

Tips:
# 点下“在看”❤️
# 然后,公众号对话框内发送“Flink”,试试手气?😆
# 本期奖品是来自 Apache Flink 定制版马克杯。

