项目背景
阿里巴巴内部从最早引入混沌工程解决微服务的依赖问题,到业务服务、云服务稳态验证,进一步升级到公共云、专有云的业务连续性保障,以及在验证云原生系统的稳定性等方面积累了比较丰富的场景和实践经验。并且当时混沌工程相关的开源工具存在场景能力分散、上手难度大、缺少实验模型标准,场景难以扩展和沉淀等问题。这些问题就会导致很难实现平台化,你很难通过一个平台去囊括这些工具。所以我们开源了 ChaosBlade 这个混沌工程实验执行工具,目的是服务于混沌工程社区,共同推进混沌工程领域的发展。
一、前言
随着微服务的盛行以及容器技术的普及,借助 Kubernetes 的容器编排能力,部署一套分布式系统的难度也越来越低。但随之而来的是越来越复杂的系统,以及越来越难的系统可靠性测试,有时仅仅是一个接口的故障,就可能导致整个系统的雪崩。在雪崩中,找到那个最初故障的接口也十分困难,因为到处都在报错。为了解决这些问题,除了不断减少服务的耦合,建立强大的监控系统以及设置熔断、限流等策略等方式,这时混沌工程就出现了。
ChaosBlade 是一款遵循混沌工程实验原理,建立在阿里巴巴近十年故障测试和演练实践基础上,并结合了集团各业务的最佳创意和实践,提供丰富故障场景实现,帮助分布式系统提升容错性和可恢复性的混沌工程工具。
什么是混沌工程
根据混沌工程原则(PRINCIPLES OF CHAOS ENGINEERING):混沌工程是在分布式系统上进行实验的学科, 目的是建立对系统抵御生产环境中失控条件的能力以及信心。
大规模分布式软件系统的发展正在改变软件工程。作为一个行业,我们很快就采用了提高开发灵活性和部署速度的实践。但伴随着这些优点,一个迫切问题出现了,那就是:我们对投入生产的复杂系统有多少信心?
即使分布式系统中的所有单个服务都正常运行, 但这些服务之间的交互也会导致不可预知的结果。这些不可预知的结果, 由影响生产环境的罕见且具有破坏性的事件复合而成,令这些分布式系统存在内在的混沌。
需要在异常行为出现之前,在整个系统内找出这些弱点。这些弱点包括以下形式:
·当服务不可用时的不正确回滚设置
·不当的超时设置导致的重试风暴
·由于下游依赖的流量过载导致的服务中断
·单点故障时的级联失败等
在这些弱点通过生产环境暴露给用户之前,必须主动的发现这些重要的弱点。并需要一种方法来管理这些系统固有的混沌, 通过增加的灵活性和速率以提升我们对生产环境部署的信心, 尽管系统的复杂性是由这些部署所导致的。
采用基于经验和系统的方法解决了分布式系统在规模增长时引发的问题, 并以此建立对系统抵御这些事件的能力和信心。通过在受控实验中观察分布式系统的行为来了解它的特性,我们称之为混沌工程。
项目介绍
ChaosBlade 项目托管在 Github 平台,放在 chaosblade-io 组织下,方便项目管理和社区发展。设计 ChaosBlade 初期就考虑了易用性和场景扩展的便捷性,方便大家上手使用以及根据各自需要扩展更多的实验场景,遵循混沌实验模型提供了统一的操作简洁的执行工具,并且根据领域划分将场景实现封装成一个一个单独的项目,方便实现领域内场景扩展。该项目将场景按领域实现封装成单独的项目,不仅可以使领域内场景标准化实现,而且非常方便场景水平和垂直扩展,通过遵循混沌实验模型,实现 chaosblade cli 统一调用。目前包含的场景领域如下:
·基础资源:比如 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 相关的外部文档
中文版文档:https://chaosblade-io.gitbook.io/chaosblade-help-zh-cn/
实验模型
前面提到 ChaosBlade 项目是遵循混沌实验模型设计,不仅简化了实验场景定义,而且可以很方便的扩展场景,并且通过 chaosblade cli 工具可以统一调用,便于构建上层的混沌实验平台。Chaosblade 可直接编译运行,cli 命令提示使执行混沌实验更加简单。目前支持的演练场景有操作系统类的 CPU、磁盘、进程、网络,Java 应用类的 Dubbo、MySQL、Servlet 和自定义类方法延迟或抛异常等以及杀容器、杀 Pod。
实验模型的推导
目前的混沌实验主要包含故障模拟,我们一般对故障的描述如下:
10.0.0.1 机器上挂载的 A 磁盘满造成了服务不可用
所有节点上的 B dubbo 服务因为执行缓慢造成上游 A dubbo 服务调用延迟,从而造成用户访问缓慢
Kubernetes A 集群中 B 节点上 CPU 所有核使用率满载,造成 A 集群中的 Pod 调度异常
Kubernetes C 集群中 D Pod 网络异常,造成 D 相关的 Service 访问异常
通过上述,我们可以使用以下句式来描述故障:因为某某机器(或集群中的资源,如 Node,Pod)上的哪个组件发生了什么故障,从而造成了相关影响。我们也可以通过下图来看故障描述拆分:
可以通过这四部分来描述现有的故障场景,所有我们抽象出了一个故障场景模型,也称为混沌实验模型
实验模型的介绍
此实验模型详细描述如下:
·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 下的项目遵循此混沌实验模型设计,需要注意的是此模型定义了混沌实验场景如何设计,但是实验场景的具体实现每个领域各不相同,所以将 ChaosBlade 依据领域实现封装成各自独立的项目,每个项目根据各领域的最佳实践来实现,不仅能满足各领域使用习惯,而且还可以通过混沌实验模型来建立与 chaosblade cli 项目的关系,方便使用 chaosblade 来统一调用,各领域下的实验场景依据混沌实验模型生成 yaml 文件描述,暴露给上层混沌实验平台,混沌实验平台根据实验场景描述文件的变更,自动感知实验场景的变化,无需新增场景时再做平台开发,使混沌平台更加专注于混沌工程其他部分。以下分为基于混沌实验模型的 chaosblade cli 设计、基于混沌实验模型的 chaosblade operator 设计和基于混沌实验模型构建混沌实验平台三部分详细介绍混沌实验模型的应用。
基于混沌实验模型的 chaosblade cli 设计
chaosblade 项目本身使用 Golang 构建,解压即用,工具采用 CLI 方式执行,使用简单,具备完善的命令提示。根据 chaosblade-spec-go项目对混沌实验模型的定义,解析遵循混沌实验模型实现的实验场景 yaml 描述,将实验场景转换为 cobra 框架所支持的命令参数,实现变量参数化、参数规范化,而且将整个实验对象化,每个实验对象都会有个 UID,方便管理。
ChaosBlade 能解决哪些问题?
1)衡量微服务的容错能力
通过模拟调用延迟、服务不可用、机器资源满载等,查看发生故障的节点或实例是否被自动隔离、下线,流量调度是否正确,预案是否有效,同时观察系统整体的 QPS 或 RT 是否受影响。在此基础上可以缓慢增加故障节点范围,验证上游服务限流降级、熔断等是否有效。最终故障节点增加到请求服务超时,估算系统容错红线,衡量系统容错能力。
2)验证容器编排配置是否合理
通过模拟杀服务 Pod、杀节点、增大 Pod 资源负载,观察系统服务可用性,验证副本配置、资源限制配置以及 Pod 下部署的容器是否合理。
3)测试 PaaS 层是否健壮
通过模拟上层资源负载,验证调度系统的有效性;模拟依赖的分布式存储不可用,验证系统的容错能力;模拟调度节点不可用,测试调度任务是否自动迁移到可用节点;模拟主备节点故障,测试主备切换是否正常。
4)验证监控告警的时效性
通过对系统注入故障,验证监控指标是否准确,监控维度是否完善,告警阈值是否合理,告警是否快速,告警接收人是否正确,通知渠道是否可用等,提升监控告警的准确和时效性。
5)定位与解决问题的应急能力
通过故障突袭,随机对系统注入故障,考察相关人员对问题的应急能力,以及问题上报、处理流程是否合理,达到以战养战,锻炼人定位与解决问题的能力。
2. 功能和特点
1)场景丰富度高
ChaosBlade 支持的混沌实验场景不仅覆盖基础资源,如 CPU 满载、磁盘 IO 高、网络延迟等,还包括运行在 JVM 上的应用实验场景,如 Dubbo 调用超时和调用异常、指定方法延迟或抛异常以及返回特定值等,同时涉及容器相关的实验,如杀容器、杀 Pod。后续会持续的增加实验场景。
2)使用简洁,易于理解
ChaosBlade 通过 CLI 方式执行,具有友好的命令提示功能,可以简单快速的上手使用。命令的书写遵循阿里巴巴集团内多年故障测试和演练实践抽象出的故障注入模型,层次清晰,易于阅读和理解,降低了混沌工程实施的门槛。
3)场景扩展方便
所有的 ChaosBlade 实验执行器同样遵循上述提到的故障注入模型,使实验场景模型统一,便于开发和维护。模型本身通俗易懂,学习成本低,可以依据模型方便快捷的扩展更多的混沌实验场景。
·Cli 包含 create、destroy、status、prepare、revoke、version 6 个命令
·相关混沌实验数据使用 SQLite 存储在本地(chaosblade 目录下)
·Create 和 destroy 命令调用相关的混沌实验执行器创建或者销毁混沌实验
·Prepare 和 revoke 命令调用混沌实验准备执行器准备或者恢复实验环境,比如挂载 jvm-sandbox
·混沌实验和混沌实验环境准备记录都可以通过 status 命令查询
使用文档
你可以从 Releases 地址下载最新的 chaosblade 工具包,下载完成后解压即可,无需编译。如果想注入 Kubernetes 相关故障场景,需要安装 chaosblade-operator,详细的中文使用文档请查看 chaosblade-help-zh-cn。
wgethttps://github.com/chaosblade-io/chaosblade/releases/download/v0.2.0/chaosblade-0.2.0.linux-amd64.tar.gz
chaosblade 支持 CLI 和 HTTP 两种调用方式,支持的命令如下:
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
server:启动 web server,暴露 HTTP 服务,可以通过 HTTP 请求来调用 chaosblade。例如在目标机器xxxx上执行:blade server start -p 9526,执行 CPU 满载实验:curl "http:/xxxx:9526/chaosblade?cmd=create%20cpu%20fullload"
以上命令帮助均可使用 blade help [COMMAND] 或者 blade [COMMAND] -h 查看,也可查看新手指南,或者上述中文使用文档,快速上手使用。
使用文档
你可以从 Releases 地址下载最新的 chaosblade 工具包,解压即用。如果想注入 Kubernetes 相关故障场景,需要安装 chaosblade-operator,详细的中文使用文档请查看 chaosblade-help-zh-cn。
chaosblade 支持 CLI 和 HTTP 两种调用方式,支持的命令如下:
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
server:启动 web server,暴露 HTTP 服务,可以通过 HTTP 请求来调用 chaosblade。例如在目标机器xxxx上执行:blade server start -p 9526,执行 CPU 满载实验:curl "http:/xxxx:9526/chaosblade?cmd=create%20cpu%20fullload"
以上命令帮助均可使用 blade help [COMMAND] 或者 blade [COMMAND] -h 查看,也可查看新手指南,或者上述中文使用文档,快速上手使用。
blade 是可执行文件,即 chaosblade 工具的 cli,混沌实验执行的工具。执行 ./blade help 可以查看支持命令有哪些:
wangchengjian@1:~/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]。
该项目体验极好,仅需一个可执行文件 blade,就可完成多种场景的实验(一些复杂场景如 Java 应用实验,则需要相关工具包),同时如果不想下载 chaosblade 工具包,快速体验 chaosblade,可以拉取 docker 镜像并运行,在容器内体验。
操作步骤如下: 下载镜像:
docker pull chaosbladeio/chaosblade-demo
启动镜像:
docker run-it--privilegedchaosbladeio/chaosblade-demo
进入镜像之后,可阅读 README.txt 文件实施混沌实验。
创建场景,具体可执行 blade create -h 查看:
Create a chaos engineering experiment
Usage:
blade create [command]
Aliases:
create, c
Examples:
create dubbo delay --time 3000 --offset 100 --service com.example.Service --consumer
Available Commands:
cplus c++ experiment
cpu Cpu experiment
disk Disk experiment
docker Execute a docker experiment
druid Druid experiment
dubbo dubbo experiment
http http experiment
jvm method
k8s Kubernetes experiment
mysql mysql experiment
network Network experiment
process Process experiment
rocketmq Rocketmq experiment,can make message send or pull delay and exception
script Script chaos experiment
servlet java servlet experiment
Flags:
-h, --help help for create
Global Flags:
-d, --debug Set client to DEBUG mode
Use "blade create [command] --help" for more information about a command.
在分布式架构环境下,服务间的依赖日益复杂,可能没有人能说清单个故障对整个系统的影响,构建一个高可用的分布式系统面临着很大挑战。在可控范围或环境下,使用 ChaosBlade 工具,对系统注入各种故障,持续提升分布式系统的容错和弹性能力,以构建高可用的分布式系统。
场景大图ChaosBlade-Operator
ChaosBlade-Operator 是 ChaosBlade 的 Kubernetes 平台实验场景实现,也是本系列文章主要使用的工具。其将混沌实验通过 Kubernetes 标准的 CRD 方式定义,很方便的使用 Kubernetes 资源操作的方式来创建、更新、删除实验场景,包括使用 kubectl、client-go 等方式执行,而且还可以使用上述的 chaosblade cli 工具执行。
Pod 网络延迟场景
应用示例
通过一个具体的实验场景来说明 chaosblade cli 的使用。
我们执行的实验是对其中一个 provider 服务实例注入调用 mk-demo 数据库延迟的故障,可以看到上图左下角,这个就是对 demo 数据库注入延迟的命令,可以看出命令非常简洁清晰,比如很明确的表达出我们的实验目标是 mysql,我们的实验场景是做延迟,后面这些都是这些数据库的匹配器,比如表,查询类型,还有控制实验的影响条数等等,使用 ChaosBlade 可以很有效的控制实验的爆炸半径。执行这条命令就可以对这台机器的 provider 服务注入故障,大家可以看到我注入故障之后,这里这个图就是我立刻收到了钉钉的报警,那么这个 case 是符合预期的 case,但是即使符合预期的case,也是有价值的,需要相关的开发和运维人员是要去排查延迟的问题根因并恢复,有助于提高故障应急效率。 chaosblade 的中文使用文档:https://chaosblade-io.gitbook.io/chaosblade-help-zh-cn
例子2:演示一下CPU使用率100%的故障,即使用blade create cpu fullload命令。blade create cpu的用法如下:
wangchengjian@1:~/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.
执行实验:
wangchengjian@1:~/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命令等。
此时命令已经生效。下一步停止实验,执行:
wangchengjian@1:~/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 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 方式执行,具体可参考:https://github.com/chaosblade-io/chaosblade/blob/master/exec/kubernetes/executor.go 代码实现。
通过上述介绍,可以看出在设计 ChaosBlade 项目初期就考虑了云原生实验场景,将混沌实验模型与 Kubernetes 设计理念友好的结合在一起,不仅可以遵循 Kubernetes 标准化实现,还可以复用其他领域场景和 chaosblade cli 调用方式,所谓的历史包袱根本不存在 :-)。
基于混沌实验模型构建混沌实验平台
前面也提到了遵循混沌实验模型实现的实验场景,可通过 yaml 文件来描述,上层实验平台可以自动感知实验场景的变更,无需平台再做开发,达到实验平台与实验场景解耦的目的,使大家可以更加专注于混沌实验平台本身的开发上。下面拿 AHAS Chaos 平台举例来说明如何基于混沌实验模型和 ChaosBlade 构建混沌实验平台。
可以看到:
·chaosblade 会合并所有领域场景的 yaml 文件,提供给 ChaosBlade SDK
·ChaosBlade SDK 感知 yaml 文件变化,重新解析场景描述文件,透传给上层平台,包含场景和场景参数的变更
·ChaosBlade SDK 透传用户在平台上所配置的参数,调用 chaosblade 工具执行
·chaosblade 工具会根据调用参数,和解析各领域 yaml 场景描述文件来调用不同的执行器
总结
混沌实验模型的应用可归纳为以下几点:
·混沌实验模型使实验场景变量参数化,参数规范化
·可遵循模型实现实验场景领域化的水平扩展
·可将混沌实验模型和领域内标准化实现相结合,便捷实现领域内场景垂直扩展
·上层的领域场景可以复用遵循混沌实验模型定义的场景
·通过混沌实验模型声明的场景描述可以很好的接入到 chaosblade cli 中
·遵循实验模型可以很方便的构建上层混沌实验平台
项目意义
混沌工程领域已提出多年,混沌工程社区的每一个人都贡献着自己的力量来完善整个混沌工程领域体系,尤其是混沌工程理论的提出推动了整个混沌工程领域快速发展。我们在阿里巴巴内部实践混沌工程很多年,深知落地混沌工程之路充满各种挑战,也知道注入混沌实验只是混沌工程中的一环,混沌工程背后的思考、落地方案和实践经验也是很重要的一部分。我们只是想把我们认为好用的内部工具奉献给社区,随后将刚才提到的实践经验也通过各种渠道分享给大家,大家可以将此工具与实践经验相结合,作为企业落地混沌工程的一个入手点,共同推进混沌工程领域的进步,仅此而已。 上述详细介绍了 ChaosBlade 工具的设计和背后的思考,以及将混沌实验模型与各领域标准实现相结合的优势,欢迎对高可用架构感兴趣的各位加入到 ChaosBlade 社区中来,加入到混沌工程社区中来。总而言之,ChaosBlade 相信:开源世界中,任何帮助都是贡献。
未来规划
ChaosBlade 社区在增强原有领域的同时,比如增强云原生领域场景,还会增加更多领域的场景,例如:
·Golang 应用混沌实验场景
·NodeJS 应用混沌实验场景
除实验场景外,还会以下规划:
·提供一个混沌实验平台供大家使用
·完善 ChaosBlade 各项目的开发文档
·完善 chaosblade 工具的英文文档
网友评论