简介:ChaosBlade是阿里巴巴2019年开源的混沌工程项目,目前已加入CNCFSandbox。最初包含多环境、多语言的混沌工程实验工具chaosblade,现在已经发展为多集群、多环境、多语言的混沌工程平台chaosblade-box。该平台支持实验工具托管和工具自动化部署。通过统一的用户实验接口,将用户的精力集中在通过混沌工程解决云原生过程中的高可用问题上。本文详细介绍了ChaosBlade,从混沌实验模型抽象、混沌实验工具开源和混沌工程平台升级项目三个阶段入手。作者|肖长军(青谷)桑杰ChaosBlade是阿里巴巴2019年开源的混沌工程项目,已加入CNCFSandbox。最初包含多环境、多语言的混沌工程实验工具chaosblade,现在已经发展为多集群、多环境、多语言的混沌工程平台chaosblade-box。该平台支持实验工具托管和工具自动化部署。通过统一的用户实验接口,将用户的精力集中在通过混沌工程解决云原生过程中的高可用问题上。本文详细介绍了ChaosBlade,从混沌实验模型抽象、混沌实验工具开源和混沌工程平台升级项目三个阶段入手。在今年的可信云测评中,阿里云故障演练平台以最高分率先通过了可信云混沌工程平台能力要求的最高级别——高级认证。混沌实验模型ChaosBlade项目涵盖基础资源、应用服务、容器服务等混沌实验场景。实验工具在设计之初就考虑了场景模型的统一,便于场景扩展和沉淀,也为平台托管实验工具的统一场景调用提供了模型基础。ChaosBlade项目中所有的实验场景都遵循这个实验模型的设计。下面将通过实验模型的推导、介绍、意义和具体应用来详细介绍该模型。1.实验模型的推导混沌实验主要包括故障模拟。我们一般将故障描述为:10.0.0.1机器挂载的A盘已满,服务不可用;所有节点上的Bdubbo服务运行缓慢,上游Adubbo服务调用延迟,导致用户访问缓慢;在KubernetesA集群中,节点B上的所有CPU核心都被充分利用,导致A集群中的Pod调度异常;KubernetesC集群中,DPod网络异常,导致D相关Service访问异常。通过以上,我们可以用下面的句子来描述故障:因为某台机器上的哪个组件(或者集群中的资源,比如Node、Pod)发生故障,造成了相关的影响。通过下图我们也可以看到故障描述的拆分:现有的故障场景可以通过这四个部分进行描述,所以我们抽象出一个故障场景模型,也称为混沌实验模型。2.实验模型介绍实验模型的详细描述如下:Scope:实验实施的范围,指实验机、集群及其资源的具体实施。目标:实验目标是指进行实验的组件。比如基础资源场景中的CPU、网络、磁盘等,Java场景中的应用组件如Dubbo、Redis、RocketMQ、JVM等,容器场景中的Node、Pod、Container本身等。Matcher:实验规则匹配器,根据配置的Target,定义相关的实验匹配规则,可以配置多种配置。由于每个Target可能有自己特殊的匹配条件,比如RPC领域的Dubbo和gRPC可以根据服务提供者提供的服务和服务消费者调用的服务进行匹配,缓存领域的Redis可以根据set和get操作匹配。也可以扩展matcher,比如扩展实验场景的执行策略,控制实验的触发时间等。Action:指实验模拟的具体场景。目标不同,实施场景也不同。比如磁盘可以钻,磁盘满,磁盘IO读写高,磁盘硬件故障。如果是应用,可以抽象出延迟、异常、返回指定值(错误码、大对象等)、参数篡改、重复调用等实验场景。如果是容器服务,可以在上面模拟Node、Pod、Container资源异常或者基础资源异常。使用该模型可以清楚地表达混沌实验实施中需要明确的以下问题:混沌实验的实施范围是什么?混沌实验的实施对象是什么?触发实验的条件是什么?具体的实施场景是什么?该模型具有以下特点:简洁:层次清晰,通俗易懂;通用:覆盖当前所有故障场景,包括基础资源、应用服务、容器服务、云资源等;易于实现:定义清晰的接口规范非常方便,实验场景扩展实现简单;语言与领域独立:可以扩展多语言、多领域模型的实现。该模型具有以下意义:更准确地描述混沌实验场景;更好地理解混沌实验注入;现有实验场景的便捷沉淀;基于模型发现更多场景;混沌实验工具更加规范简洁。4、实验模型的应用混沌实验模型的应用可以归纳为:混沌实验模型可以参数化实验场景变量,并对参数进行标准化;可跟随模型实现实验场景域的水平扩展;将混沌实验模型与域结合,实现内部标准化,方便实现场景在域内的纵向扩展;上域场景可以复用混沌实验模型定义的场景;混沌实验模型声明??的场景描述可以很好的接入ChaosBlade;按照实验模型搭建上层混沌实验平台非常方便。下面重点介绍基于该模型实现的混沌工程工具ChaosBlade。混沌工程实验工具:ChaosBlade最早引入混沌工程解决微服务的依赖问题,到业务服务和云服务稳态验证,进一步升级到公有云和私有云的业务连续性保障,以及在验证云中。我们在原生系统的稳定性方面积累了丰富的场景和实践经验。当时混沌工程相关的开源工具存在场景能力分散、上手难、缺乏实验模型标准、场景扩展沉淀困难等问题。这些问题导致很难实现平台化,你很难通过一个平台来包含这些工具。因此,下面将通过场景介绍、使用、架构设计和案例,对开源的混沌工程实验执行工具chaosblade进行详细介绍。1、混沌实验场景Chaosblade工具设计前期考虑了易用性和场景扩展的便利性,让大家可以根据自己的需求上手,扩展更多的实验场景。它遵循混沌实验模型,提供统一、简单的执行工具。.混沌实验工具支持Linux、Windows、Docker、Kubernetes等系统平台,涵盖Java、Golang、NodeJS、C++语言应用,涉及200多个实验场景,3000多个实验参数(v1.0.0-GA)。目前包含的场景如下:基础资源:如CPU、内存、网络、磁盘、进程、内核等应用服务:如数据库、缓存、消息、JVM自身、微服务等你也可以指定任意注入各种复杂实验场景的类方法;指定任意方法或一行代码注入延迟、变量和返回值篡改等实验场景Docker容器:如杀容器、CPU、内存、网络、磁盘、进程等实验场景Kubernetes平台:如CPU关于节点、内存、网络、磁盘、进程的实验场景,Pod网络和Pod本身的实验场景如杀掉Pod,容器实验场景如上述Docker容器实验场景云资源:如阿里云ECS宕机和其他实验场景2.工具使用ChaosBlade是一个工具,下载解压后可以直接使用。无需安装,支持的调用方式包括CLI方式直接执行blade命令。比如这里给出的网络延迟的例子,加上-h参数就可以看到非常完整的命令提示符。比如我想调用一个9520端口做网络丢包。对齐之前的实验模型,我们可以看到,它的演练目标是网络,它的动作是丢包,它的匹配器是调用一个远程服务端口9520,执行成功后会返回实验结果.我们将每个实验场景作为一个对象,它会返回一个实验对象的UID,用于后续的实验管理,比如销毁和查询实验都是通过这个UID来完成的。销毁实验,即恢复实验,直接执行bladedestroy命令即可。ChaosBlade的另一种调用方式是Web方式,通过执行服务器命令对外暴露HTTP服务。那么在上层,如果自己搭建一个混沌实验平台,可以直接通过HTTP请求来调用。3.工具架构设计ChaosBlade按照领域被打包成独立的项目。每个项目都是按照每个领域的最佳实践来实现的,既满足了每个领域的使用习惯,又可以通过chaos实验模型和chaosbladecli项目建立起来,方便使用chaosblade统一调用。各领域实验场景基于混沌实验模型生成yaml文件描述,暴露给上层混沌实验平台。混沌实验平台根据实验场景描述文件的变化,自动感知实验场景的变化。在不需要增加新场景的时候做平台开发,让ChaosPlatform可以更专注于ChaosEngineering的其他部分。目前包含的执行器项目如下:chaosblade:混沌实验管理工具,包括创建实验、销毁实验、查询实验、准备实验环境、取消实验环境等命令。混沌实验的执行工具,执行方式包括CLI和HTTP。.提供完整的命令、实验场景、场景参数说明,操作简洁明了。chaosblade-spec-go:混沌实验模型Golang语言定义,易用Golang语言的场景均基于此规范。chaosblade-exec-os:CPU、网络、内存、磁盘等基础资源实验场景的实现。chaosblade-exec-docker:Docker容器实验场景的实现,通过调用DockerAPI实现标准化。chaosblade-operator:Kubernetes平台实验场景的实现。混沌实验通过Kubernetes标准CRD方法定义。使用Kubernetes资源操作创建、更新、删除实验场景非常方便,包括使用kubectl、client-go等执行,也可以使用前面提到的chaosbladecli工具执行。chaosblade-exec-jvm:Java应用实验场景实现,采用JavaAgent技术动态挂载,无需任何访问,零成本使用,并支持卸载,完全回收Agent创建的各种资源。chaosblade-exec-cplus:C++应用实验场景实现,采用GDB技术实现方法和代码行级实验场景注入。4.工具用例通过一个Dubbo微服务案例,介绍了chaosblade工具的使用。这个微服务Demo分三层调用,消费者调用提供者,提供者调用基础,提供者也调用mk-demo数据库,提供者和基础服务有两个实例。本案例实现的实验场景是数据库调用的延迟。我们首先定义监控指标:慢SQL数量和告警信息,并做出预期假设:慢SQL数量增加,钉钉群收到慢SQL告警。接下来进行实验。我们直接使用chaosblade工具来执行。你可以看看左下角。当我们调用mysql查询进行demo-provider注入时,如果数据库是demo,表名是d\_discount,50%的查询操作会延迟600毫秒。我们使用阿里云产品ARMS进行监控告警。可以看到,混沌实验完成后,很快钉钉群就收到了报警。因此,我们对比之前定义的监测指标,是符合预期的。但需要注意的是,这次达到预期不代表以后一定会达到预期,因此需要通过混沌工程的不断验证。如果出现慢SQL,可以通过ARMS的链接跟踪进行排查定位,可以清楚的看到是哪条语句执行慢了。混沌工程平台:Chaosblade-box对ChaosBlade品牌进行升级并开源chaosblade-box混沌工程平台,让用户专注于通过混沌工程解决系统高可用问题,而不是专注于实验工具的选择和部署.平台托管主流的混沌实验工具,实现工具的自动化部署,通过统一的操作页面实现混沌工程的实现。下面通过平台的功能特点、架构设计和用例介绍混沌工程平台chaosblade-box。1.平台具有以下特点:支持开源实验工具托管:平台可以托管业界主流的实验工具,如自带的chaosblade、外部的litmuschaos。ChaosMesh实验工具也将在未来托管。丰富的实验场景:包括基础资源(CPU、内存、网络、磁盘、进程、内核、文件等)、多语言应用服务(Java、C++、NodeJS、Golang等)、Kubernetes平台(涵盖Container、Pod、节点资源场景,包括以上实验场景)。实验工具自动化部署:在主机或集群上自动部署实验工具,无需手动部署实验工具。统一的混沌实验用户界面:用户无需关心不同工具的使用,在统一的用户界面中进行混沌实验。多维实验模式:支持从宿主机到Kubernetes资源再到应用维度的实验编排。集成云原生生态:采用Helm部署管理,集成Prometheus监控,支持云原生实验工具托管等。2.平台架构设计通过控制台页面,可以实现chaosblade、litmuschaos等托管工具的自动化部署。根据社区建立的混沌实验模型,统一实验场景,将目标资源按宿主机、Kubernetes、应用划分,由目标管理器控制,在实验创建页面,可以实现白屏的目标资源选择。该平台通过调用执行混沌实验来执行不同工具的实验场景。接入prometheus监控,可以观察实验metric指标,后期会提供丰富的实验报告。Chaosblade-box的部署也非常简单。详情请参考:https://github.com/chaosblade-io/chaosblade-box/releases3。使用说明安装部署完成后,您可以在机器列表页面配置Kubernetes集群或主机信息,查看集群或主机数据。选择实验管理以创建实验。drill维度支持host、Node、Pod、Container维度。选择对应的维度后,会出现对应的资源列表,可以轻松选择。演练内容包含托管的所有实验场景。实验创建完成后会自动跳转到钻取详情页面,点击执行跳转到任务详情页面。演练任务详情页展示了实验的基本信息和实验任务的状态,可以轻松掌控实验,明确实验任务的状态。未来规划1.chaosbladeChaosBlade未来将基于云原生,提供多集群、多环境、多语言的混沌工程平台和混沌工程实验工具。实验工具持续关注实验场景的丰富性和稳定性,支持更多的Kubernetes资源场景和标准化的应用服务实验场景标准,提供多语言实验场景标准实现。2、Chaosblade-box将开源阿里云故障演练平台(可信云混沌工程平台高级认证)的核心功能,并与现有混沌工程平台集成,实现更多能力的开放。同时,它简化了混沌工程工具的部署和实施。未来将承载更多的混沌实验工具和兼容的主流平台,实现场景推荐,提供业务和系统监控集成,输出实验报告,在易用性的基础上完成混沌工程的闭环运行。.作者简介:肖长军(花名:琼谷):阿里巴巴技术专家,开源项目ChaosBladeFounder&Maintainer,阿里云故障演练平台负责人,可信云标准专家,混沌工程布道者,分布式系统架构与稳定性多年性-建设经验。Sanjay:曾就职于中国农业银行研发中心,从事金融相关系统大数据的研发工作。版权声明:本文内容由阿里云实名注册用户投稿,版权归原作者所有。阿里云开发者社区不拥有自己的版权,也不承担相应的法律责任。具体规则请参考《阿里云开发者社区用户服务协议》和《阿里云开发者社区知识产权保护指引》。如发现本社区涉嫌抄袭内容,请填写侵权投诉表进行举报,一经查实,本社区将立即删除涉嫌侵权内容。
