ChaosBlade 阿里巴巴实验实施工具

ChaosBlade 是什么

ChaosBlade 是阿里巴巴开源的一款遵循混沌工程原理和混沌实验模型的实验注入工具,帮助企业提升分布式系统的容错能力,并且在企业上云或往云原生系统迁移过程中业务连续性保障。

github地址: https://github.com/chaosblade-io/chaosblade/

中文版文档:https://chaosblade-io.gitbook.io/chaosblade-help-zh-cn/blade

目前支持的演练场景有操作系统类的 CPU、磁盘、进程、网络,Java 应用类的 Dubbo、MySQL、Servlet 和自定义类方法延迟或抛异常等以及杀容器、杀 Pod,具体可执行 blade create -h 查看 。

ChaosBlade 能解决哪些问题

1)衡量微服务的容错能力

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

2)验证容器编排配置是否合理

通过模拟杀服务 Pod、杀节点、增大 Pod 资源负载,观察系统服务可用性,验证副本配置、资源限制配置以及 Pod 下部署的容器是否合理。

3)测试 PaaS 层是否健壮

通过模拟上层资源负载,验证调度系统的有效性;模拟依赖的分布式存储不可用,验证系统的容错能力;模拟调度节点不可用,测试调度任务是否自动迁移到可用节点;模拟主备节点故障,测试主备切换是否正常。

4)验证监控告警的时效性

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

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

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

ChaosBlade使用指南


获取 ChaosBlade 最新的 release 包,目前支持的平台是 linux/amd64 和 darwin/64,下载对应平台的包。

wget https://github.com/chaosblade-io/chaosblade/releases/download/v0.2.0/chaosblade-0.2.0.linux-amd64.tar.gz
下载完成后解压即可,无需编译。解压后的目录如下:

.
├── bin
│   ├── chaos_burncpu
│   ├── chaos_burnio
│   ├── chaos_changedns
│   ├── chaos_delaynetwork
│   ├── chaos_dropnetwork
│   ├── chaos_filldisk
│   ├── chaos_killprocess
│   ├── chaos_lossnetwork
│   ├── chaos_stopprocess
│   ├── cplus-chaosblade.spec.yaml
│   ├── jvm.spec.yaml
│   └── tools.jar
├── blade
└── lib
    ├── cplus
    │   ├── chaosblade-exec-cplus.jar
    │   └── script
    │       ├── shell_break_and_return_attach.sh
    │       ├── shell_break_and_return.sh
    │       ├── shell_check_process_duplicate.sh
    │       ├── shell_check_process_id.sh
    │       ├── shell_initialization.sh
    │       ├── shell_modify_variable_attch.sh
    │       ├── shell_modify_variable.sh
    │       ├── shell_remove_process.sh
    │       ├── shell_response_delay_attach.sh
    │       └── shell_response_delay.sh
    └── sandbox
        ├── bin
        │   └── sandbox.sh
        ├── cfg
        │   ├── sandbox-logback.xml
        │   ├── sandbox.properties
        │   └── version
        ├── example
        │   └── sandbox-debug-module.jar
        ├── install-local.sh
        ├── lib
        │   ├── sandbox-agent.jar
        │   ├── sandbox-core.jar
        │   └── sandbox-spy.jar
        ├── module
        │   ├── chaosblade-java-agent-0.2.0.jar
        │   └── sandbox-mgr-module.jar
        └── provider
            └── sandbox-mgr-provider.jar
其中 blade 是可执行文件,即 chaosblade 工具的 cli,混沌实验执行的工具。执行 ./blade help 可以查看支持命令有哪些:

zhuzhonghua@n224-008-172:~/chaos/chaosblade-0.2.0$ ./blade help
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
  query       Query the parameter values required for chaos experiments
  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.
blade 命令列表如下:

prepare:简写 p,混沌实验前的准备,比如演练 Java 应用,则需要挂载 java agent。要演练应用名是 business 的应用,则在目标主机上执行 blade p jvm –process business。如果挂载成功,返回挂载的 uid,用于状态查询或者撤销挂载使用。

revoke:简写 r,撤销之前混沌实验准备,比如卸载 java agent。命令是 blade revoke UID

create: 简写是 c,创建一个混沌演练实验,指执行故障注入。命令是 blade create [TARGET] [ACTION] [FLAGS],比如实施一次 Dubbo consumer 调用 xxx.xxx.Service 接口延迟 3s,则执行的命令为 blade create dubbo delay –consumer –time 3000 –service xxx.xxx.Service,如果注入成功,则返回实验的 uid,用于状态查询和销毁此实验使用。

destroy:简写是 d,销毁之前的混沌实验,比如销毁上面提到的 Dubbo 延迟实验,命令是 blade destroy UID

status:简写 s,查询准备阶段或者实验的状态,命令是 blade status UID 或者 blade status –type create

以上命令帮助均可使用 blade help [COMMAND]。

应用示例
首先我们来演示一下CPU使用率100%的故障,即使用blade create cpu fullload命令。blade create cpu的用法如下:

hidden@hidden:~/chaos/chaosblade-0.2.0$ ./blade create cpu -h
Cpu experiment, for example full load

Usage:
  blade create cpu [flags]
  blade create cpu [command]

Examples:
cpu fullload

Available Commands:
  fullload    cpu fullload

Flags:
      –cpu-count string   Cpu count
      –cpu-list string    CPUs in which to allow burning (0-3 or 1,3)
  -h, –help               help for cpu

Global Flags:
  -d, –debug   Set client to DEBUG mode

Use “blade create cpu [command] –help” for more information about a command.
执行实验:

hidden@hidden:~/chaos/chaosblade-0.2.0$ ./blade create cpu fullload
{“code”:200,”success”:true,”result”:”d9e3879cb68416a2″}
注意上面的result: d9e3879cb68416a2中的d9e3879cb68416a2,这个在停止实验的时候会用到(./blade destroy UID)。

采用iostat -c 1 1000命令查看CPU使用率(%idle):

avg-cpu:  %user   %nice %system %iowait  %steal   %idle
          98.75    0.00    1.25    0.00    0.00    0.00
查看CPU的使用率还可以使用sar命令、top命令等。

此时命令已经生效。下一步停止实验,执行:

hidden@hidden:~/chaos/chaosblade-0.2.0$ ./blade destroy d9e3879cb68416a2
{“code”:200,”success”:true,”result”:”command: cpu fullload –debug false –help false”}
再观察CPU的情况,负载已经回到正常状态:

avg-cpu:  %user   %nice %system %iowait  %steal   %idle
           0.25    0.00    0.50    2.00    0.00   97.25
至此,一次CPU满负荷的故障演练完成。

ChaosBlade 模型实现

  1. 模型定义
    遵循此模型,可以简单明了的执行一次混沌实验,控制实验的最小爆炸半径。并且可以方便快捷的扩展新的实验场景或者增强现有场景。chaosblade 和 chaosblade-exec-jvm 工程都根据此模型实现。

在给出模型之前先讨论实施一次混沌实验明确的问题:

对什么做混沌实验?

混沌实验实施的范围是是什么?

具体实施什么实验?

实验生效的匹配条件有哪些?

举个例子:一台 ip 是 10.0.0.1 机器上的应用,调用 com.example.HelloService@1.0.0 Dubbo 服务延迟 3s。根据上述的问题列表,先明确的是要对 Dubbo 组件混沌实验,实施实验的范围是 10.0.0.1 单机,对调用 com.example.HelloService@1.0.0 服务模拟 3s 延迟。明确以上内容,就可以精准的实施一次混沌实验,抽象出以下模型:

Target:实验靶点,指实验发生的组件,例如 容器、应用框架(Dubbo、Redis、Zookeeper)等。

Scope:实验实施的范围,指具体触发实验的机器或者集群等。

Matcher:实验规则匹配器,根据所配置的 Target,定义相关的实验匹配规则,可以配置多个。由于每个 Target 可能有各自特殊的匹配条件,比如 RPC 领域的 HSF、Dubbo,可以根据服务提供者提供的服务和服务消费者调用的服务进行匹配,缓存领域的 Redis,可以根据 set、get 操作进行匹配。

Action:指实验模拟的具体场景,Target 不同,实施的场景也不一样,比如磁盘,可以演练磁盘满,磁盘 IO 读写高,磁盘硬件故障等。如果是应用,可以抽象出延迟、异常、返回指定值(错误码、大对象等)、参数篡改、重复调用等实验场景。

回到上述的例子,可以叙述为对 Dubbo 组件(Target)进行故障演练,演练的是 10.0.0.1 主机(Scope)的应用,调用 com.example.HelloService@1.0.0 (Matcher)服务延迟 3s(Action)。

伪代码可以写成:

Toolkit.
    // 实验靶点
    dubbo.
    // 范围,此处是主机
    host(“1.0.0.1”).
    // 组件匹配器,消费者还是服务提供者
    consumer().
    // 组件匹配器,服务接口
    service(“com.example.HelloService”).
    // 组件匹配器,1.0.0 接口版本
    version(“1.0.0”).
    // 实验场景,延迟 3s
    delay(3000);
针对上述例子,ChaosBlade 调用命令是:

blade create dubbo delay –time 3000 –consumer –service com.example.HelloService –version 1.0.0

dubbo: 模型中的 target,对 dubbo 实施实验。

delay: 模型中的 action,执行延迟演练场景。

–time: 模型中 action 参数,指延迟时间。

–consumer、–service、–version:模型中的 matchers,实验规则匹配器。

注:由于 ChaosBlade 是在单机执行的工具,所以混沌实验模型中的 scope 默认为本机,不再显示声明。

云环境实验

Chaosblade Operator:在云原生场景下,将 Kubernetes 设计理解与混沌实验模型相结合标准化实现方案

chaosblade operator

chaosblade-operator 项目是针对 Kubernetes 平台所实现的混沌实验注入工具,遵循上述混沌实验模型规范化实验场景,把实验定义为 Kubernetes CRD 资源,将实验模型中的四部分映射为 Kubernetes 资源属性,很友好的将混沌实验模型与 Kubernetes 声明式设计结合在一起,依靠混沌实验模型便捷开发场景的同时,又可以很好的结合 Kubernetes 设计理念,通过 kubectl 或者编写代码直接调用 Kubernetes API 来创建、更新、删除混沌实验,而且资源状态可以非常清晰的表示实验的执行状态,标准化实现 Kubernetes 故障注入。除了使用上述方式执行实验外,还可以使用 chaosblade cli 方式非常方便的执行 kubernetes 实验场景,查询实验状态等。 遵循混沌实验模型实现的 chaosblade operator 除上述优势之外,还可以实现基础资源、应用服务、Docker 容器等场景复用,大大方便了 Kubernetes 场景的扩展,所以在符合 Kubernetes 标准化实现场景方式之上,结合混沌实验模型可以更有效、更清晰、更方便的实现、使用混沌实验场景。 下面通过一个具体的案例来说明 chaosblade-operator 的使用:对 cn-hangzhou.192.168.0.205 节点本地端口 40690 访问模拟 60% 的网络丢包。 使用 yaml 配置方式,使用 kubectl 来执行实验

apiVersion: chaosblade.io/v1alpha1
kind: ChaosBlade
metadata:
  name: loss-node-network-by-names
spec:
  experiments:
  - scope: node
    target: network
    action: loss
    desc: "node network loss"
    matchers:
    - name: names
      value: ["cn-hangzhou.192.168.0.205"]
    - name: percent
      value: ["60"]
    - name: interface
      value: ["eth0"]
    - name: local-port
      value: ["40690"]

执行实验:

kubectl apply -f loss-node-network-by-names.yaml

查询实验状态,返回信息如下(省略了 spec 等内容):

~ » 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

或者直接删除此 blade 资源

kubectl delete blade loss-node-network-by-names

还可以编辑 yaml 文件,更新实验内容执行,chaosblade operator 会完成实验的更新操作。

使用 chaosblade cli 的 blade 命令执行

blade create k8s node-network loss --percent 60 --interface eth0 --local-port 40690 --kubeconfig config --names cn-hangzhou.192.168.0.205

如果执行失败,会返回详细的错误信息;如果执行成功,会返回实验的 UID:

{"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

除了上述两种方式调用外,还可以使用 kubernetes client-go 方式执行,具体可参考:executor.go 代码实现。

通过上述介绍,可以看出在设计 ChaosBlade 项目初期就考虑了云原生实验场景,将混沌实验模型与 Kubernetes 设计理念友好的结合在一起,不仅可以遵循 Kubernetes 标准化实现,还可以复用其他领域场景和 chaosblade cli 调用方式。

详细的中文使用文档:https://chaosblade-io.gitbook.io/chaosblade-help-zh-cn/blade-create-k8s

赞(2) 打赏
特别声明:除特殊标注,本站文章均为原创,遵循CC BY-NC 3.0,转载请注明出处。三伏磨 » ChaosBlade 阿里巴巴实验实施工具

评论 抢沙发

  • 昵称 (必填)
  • 邮箱 (必填)
  • 网址

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

微信扫一扫打赏