随着云原生质的发展,混沌工程逐渐走进大家的视野。通过混沌工程,可以发现并解决云原生质过程中的高可用性问题。2019年,阿里巴巴开放了混沌工程工具——chaos blade的源码。今年年初又开放了混沌工程主机chaosblade-box,chaosblade品牌进一步升级。围绕云原生面临的高可用性挑战和混沌工程机遇,详细介绍了开源控制台的设计、特点、实践和未来规划,旨在帮助企业更好地理解控制台,通过它实现混沌工程的落地,解决云原生系统下的高可用性问题。
去年年底,AWS和谷歌都出现了严重的服务故障:AWS故障是由于数据流服务kinesis出现问题,导致许多云服务不可用;谷歌的失败是因为登录服务的扩展额度问题,导致多个服务不可用。可以发现,它们都存在一些问题,如一个服务故障影响多个服务因服务依赖不合理而不可用、缺乏应急预案、整体故障恢复时间长、监控和报警系统不完善等。Google的故障发生直到故障发生后几十分钟才被感知,AWS的CloudWatch不可用。失败是不可避免的,凡事总有失败的风险。
特别是随着敏捷开发、DevOps、微服务、云原生架构和治理的出现,应用的交付能力大大提高,但系统的复杂度也与日俱增。在业务快速迭代的同时,如何保证业务的持续高可用和稳定,面临着巨大的挑战。混沌工程通过主动注入故障,可以提前发现系统的薄弱点,促进架构的改进,最终实现业务弹性。
打不过我的东西会让我变得强大,建立一个有韧性的框架是混沌工程的目标。弹性架构由两部分组成,一部分是弹性系统,如冗余、可扩展性、降级熔丝、故障隔离等。,避免级联故障,构建具有容灾容错能力的弹性系统。另一部分是韧性组织,包括高效交付、故障预案、应急响应等组织的合作建设。高弹性系统也会出现意想不到的故障,因此弹性组织可以弥补弹性系统缺失的部分,通过混沌工程构建最终的弹性架构。
常见的云原生高可用架构基本都是基于多可用区域或者跨区域容灾架构,业务应用部署在微服务架构下的集群中,中间件具有容错和容灾能力等等。从底层设施到顶层业务,都存在潜在的故障风险,比如机房断线、整个可用区域不可用、集群宕机、中间件节点崩溃等等。从可用区域到集群、主机,再到细粒度的要求,断层影响的爆炸半径逐渐减小,这也是混沌工程原理中很重要的一点——控制爆炸半径。控制爆炸半径一般有两种方式:一是环境隔离,通过隔离实验室和集群来控制影响面;二是基于实验工具或平台本身的场景控制能力,比如chaosblade的实验工具,可以通过实验参数控制实验粒度,比如微服务调用延迟,可以控制单个服务接口、版本甚至一个请求。下面介绍chaosblade混沌实验工具。
Chaosblade是一个遵循混沌实验模型的混沌实验执行工具。具有场景丰富、简单易用的特点,扩展场景特别方便。开源软件很快被添加到CNCF空间,成为主流的混沌工具。Chaosblade是一款无需安装,下载解压即可直接使用的工具。它支持的调用方式包括CLI和直接执行刀片命令。这里举一个网络屏蔽的例子:我们可以通过添加-h参数看到一个完美的命令提示符,比如调用一个9520端口进行网络丢包,它的演练目标是network;它的作用是丢包;它的匹配器调用一个远程服务端口9520。成功执行后,将返回实验结果。我们会把每个实验场景当做一个对象,它会返回一个实验对象的UID。这个UID用于后续的实验管理,比如销毁和查询实验。要破坏实验,也就是恢复实验,直接执行blade destroy命令即可。
Chaosblade支持多平台多语言环境,包括Linux、Kubernetes、Docker平台,以及Java、NodeJS、C++、Golang语言应用。涉及200多个场景,3000多个参数,为用户提供丰富的场景和实验参数控制。使用blade -h命令查看详细的文档,包括案例和场景以及参数介绍。下面重点说一下chaosblade对应用服务场景的支持。
Chaosblade支持Java、C++、Golang和NodeJS语言应用。其中Java应用更加丰富,包括OOM、线程池满、指定线程数、CPU负载、codecache满等JVM场景,也支持很多常用组件。例如Druid、Dubbo、Elasticsearch、HBase、HttpClient、Redis、Kafka、莴苣、MongoDB、MySQL、PostgreSQL、RabbitMQ、RocketMQ、Servlet、Tars、gRPC等。Java scenario更强大的一个功能是,可以通过指定任意类和方法来注入异常、延迟和篡改返回,甚至可以自己编写Groovy或Java脚本来实现更复杂的实验场景,满足自己的业务实验需求。它还支持链路识别和请求数量限制的能力。Golang场景是通过在编译时将隐藏的逻辑注入任何代码行来实现的。目前支持修改变量值、参数值、返回值、异常、延迟、内存溢出和死机场景。目前已有40家注册企业在试用或在用,其中包括一些深度合作的企业用户。下面举个例子来说明chaosblade的故障注入的执行过程。
以云原生Dubbo应用调用下游PetQueryService服务延迟三秒的故障场景为例。我们可以通过chaosblade提供的blade工具或者kubectl,通过编码来实现。下面是一个使用kubectl和它自己的刀片工具的例子。首先,看看使用Kubektl来执行。通过配置ChaosBlade类型的YAML文件,并使用kubectl apply命令创建一个实验,Kubernetes将创建一个chaosblade资源,然后通过kubectl delete命令删除这个咨询,以恢复实验。chaosblade资源创建后,chaosblade operator监控chaosblade资源的创建,查询目标容器,根据需要透明传输与场景相关的实验工具,调用刀片工具在容器中进行实验。使用blade执行命令,如上图所示,指定K8s下的dubbo应用注入延迟故障,通过process参数指定应用名称,通过time参数指定延迟时间,通过service参数指定受影响的服务接口,分别通过names参数和container-names指定Pod和Container名称,如果不清楚参数可以添加-h查看命令帮助。
从以上案例可以看出,chaosblade的工具简单易用,支持丰富的实验场景。我们在这个工具的基础上升级了ChaosBlade这个品牌。
我们开放了chaosblade-box混沌工程控制台,可以实现混沌实验的平台化操作,支持托管更多的混沌工程实验工具,比如litmuschaos。品牌升级后,进一步解决了用户在混沌工程中的落地困难,让用户将更多的精力投入到提升系统韧性上,旨在通过混沌工程帮助企业解决系统云生化过程中的高可用问题。
Chaosblade-box是一个面向多集群、多环境、多语言的云原生混沌工程平台。主要功能如下:
让我们对下面的页面进行截图,以了解chaosblade-box平台的功能。
根据上图,我们可以看到chaosblade-box平台的整体功能。在托管更多工具场景的基础上,可以规范实验场景和实验控制界面,简化用户操作,降低使用门槛,并提供详细的白屏日志,方便问题跟踪和故障排除。接下来,我们来看看平台的技术架构图。
控制台页面可以实现chaosblade、litmus等托管工具的部署,按照社区建立的混沌实验模型统一实验场景,按照主机、Kubernetes、应用划分目标资源,由目标管理器控制。在实验创建页面,可以在白屏中实现目标资源的选择。该平台可以通过调用混沌实验执行来执行不同工具的实验场景,观察实验的度量指标,并通过普罗米修斯监控的接入,在后续提供丰富的实验报告。
下面通过一个杀Pod的实验场景来介绍一下平台的使用。
第一步是展开混沌刀片盒。部署完成后,在实验列表页面上创建实验,并选择Kubernetes Pod实验维度。实验创建分为四个步骤。前两步资源选择和场景选择是必选的,后两步监控访问和实验名称是可选的。在吊舱列表中选择多个目标吊舱,然后选择杀人吊舱的实验场景,监视普罗米修斯吊舱,完成实验创建。在实验详细信息页面,可以点击【执行实验】进入实验任务详细信息页面,查看实验详细信息。
Chaosblade-box后续规划重点是托管更多实验工具,实现更多工具的自动部署,支持更多语言应用,添加更复杂的调度策略和进程安排,生成实验报告。实验报告分为三个阶段:一是实验基础报告,包含实验和监测的基本信息;二是实验缺陷报告,包含实验中发现的问题;第三,实验高可用建设报告,根据实验中发现的问题提出解决方案和建议。
作者|肖长军(秋谷)
本文为阿里云原创内容,未经允许不得转载。