作者:​智妍(郑妍)、​浣碧(何颖)​

什么是混沌工程,云原生大潮下的混沌工程特色

经过运用云核算厂商如阿里云、AWS 等供给的服务,现代服务供给者得以用更低廉的本钱,更安稳地进行丰厚的软件服务供给。但是真的一切如此轻而易举吗?干流云核算厂商在 SLA 许诺的范围内,都各自呈现过一些前史毛病,可拜见这份血淋淋的 github 上的陈述列表 [1] 。另一方面,各个云产品供给给了用户运用的一些高可用才干,常常依然是需求用正确的姿势来装备和运用的。

混沌工程可以帮助事务体系服务供给者经过创立破坏性事情、调查体系和人员呼应方法、针对优化改进这 3 个过程来发现出产服务中脆弱的环节,并依据预期的 SLA 目标进行施行改进。除了指出需求改进的体系组件规划问题之外,混沌工程还可帮助发现需求监控和告警上的盲点、发现人员对体系理解、应急呼应 SOP、排查才干上的不足,然后使得事务体系及其研制、运维人员全体的高可用才干水位大大上浮。因而 Netflix 提出此概念后,各大软件厂商纷繁进行了对内实践和对外产品供给。

云原生在传统云核算基础上,供给了更快更低本钱的弹性,更好的软硬一体化灵活性,现已成为云核算开展最快的技能方向。云原生帮助开发者大幅度降低资源本钱和交付本钱,然后更快更好地赢得商场。同时,云原生也给传统运维、研制方法带来了彻底的革新,这就使得传统的混沌工程手法需求跟从演进。

云原生布景下,其上的运用服务的混沌工程施行和传统有什么不同呢?从咱们在阿里电商、中间件云原生化的大量实践中,总结出以下主要差异:

1.png

在这样差异的布景下,用云原生的手法,施行更加针对植根于云原生运用的场景的混沌工程,是更加恰如其分,可以供给更多才干提高的。

混沌工程施行形式的阶段和开展

既然混沌工程能带来如此多的好处,一个基于云原生的运用服务或体系想要实践,要怎么落地呢?

从演练东西和落地施行来看,一个安排的毛病演练常常分为几个开展阶段:手艺演练,流程东西自动化演练,常态化无人值守演练,出产突袭演练。

这几个阶段的施行难度是从低到高,当然相应的收益也是从低到高。一个安排(云用户)可以随着自己事务运用服务体量的增大、复杂化和高可用才干的增高的进程,依据实践状况需求挑选自己合适的阶段,然后随之进行升级和开展。即使从最简便的手艺演练开端做起施行,常常也能带来适当显着且长远的高可用才干体系性提高。

那么每个阶段别离有什么特色,又该怎么挑选呢

  • 手艺演练: 一般在高可用才干建造初期阶段,或许一次性检验的状况下手艺注入毛病完结。经过人为查看告警是否生效,体系康复状况来进行演练。在这个阶段只需求一些毛病注入的小东西或许脚本,方便后续运用即可。

  • 自动化演练: 高可用才干建造到必定阶段后,往往会有定时查看高可用才干是否退化的需求,自动化演练开端排上日程。自动化演练过程一般包括:环境准备 -> 毛病注入 -> 查看 -> 环境康复。在每个过程中装备相应的脚本来构成演练流程,下一次就可以一键点击自动化履行了。

  • 常态化履行: 演练进行到下一阶段,咱们会有更高的要求,期望演练可以自主混沌化履行,以无人值守的方法进行,这又对体系的高可用才干有了新的挑战。这要求体系有不只有监控告警可以发现毛病,也有对应的预案模块来担任康复,而要做到无人值守,需求体系进行更智能准确的判断毛病状况,自动履行相应预案。

  • 出产突袭: 以上演练大多在灰度环境进行,不会影响到事务,出产突袭则要求体系有才干在出产环境操控爆破半径的前提下进行毛病演练,以期发现一些事务相关、规模相关、装备相关、应急呼应相关的,在灰度环境遗失的部分,出产环境的演练对体系的要求较高,需求有一套履行标准,对体系的阻隔才干也有较高要求。大多数的作业,才干建造都在灰度环境完结验证,但出产突袭仍作为一个有用且必要的演练手法,用更实在的场景给研制体感,让其实在履行预案,也训练了应急才干,对体系有更多决心和认知。

怎么进行一次完好的毛病演练施行

当运用初次运用 Kubernetes 进行运用布置和扩容时,最先重视的更多是功用是否可用,毛病演练则是更高级别的要求,咱们假定当时的体系现已开端经过了功用检验,但对于一些毛病状况下体系的表现还不知道的前提下,来开端咱们的毛病演练之旅。毛病演练自身作为一种破坏性的操作,需求按部就班,遵循必定的标准和流程来落地。下面咱们从环境建造、体系才干剖析、高可用才干建造、演练施行主张几个方面来介绍一下,一个初次在 Kubernetes 中布置起来的运用应该怎么按部就班的施行毛病演练。

Step 1:阻隔环境建造

毛病演练,特别是初次履行之前,咱们需求明确好当时注入毛病的环境状况,是否或许影响到事务流量,是否会形成无法弥补的损失,在阿里内部,咱们有复杂的环境阻隔和改变管控,以防毛病注入影响到事务流量。

在环境类别上,咱们会区别为以下几类:

  • 事务测验环境:用来进行 e2e 测验,全面的功用检验,这个环境和有事务流量的出产网络是阻隔的,从网络上避免了流量错误进入到其他环境,因而可以在这个环境上纵情的进行各种容错性测验。

  • 金丝雀环境:可以理解为是一种全面的链路灰度环境,这个环境有当时体系的一切组件,一般用来做上下游联调,体系内部的链路灰度运用,这个环境是没有实践事务流量的;

  • 安全出产灰度环境:这个环境咱们会引进 1% 的出产流量,并提早建造了切流才干,一旦这个环境呈现问题,可以把流量灵敏切换到出产环境中,该环境一般用来结合用户流量做一段时间的灰度,避免全量发布导致的不可控;

  • 出产环境:实在用户流量的环境,这个环境的任何运维动作都需求进行严厉的改变审阅和前几个环境的灰度经过才干改变;

毛病演练一般会开端在金丝雀环境引进,可以在全链路、无实在流量的环境中做一些高可用才干的建造和检验,常态履行的演练,在这个环境演练屡次的场景,可定时在灰度环境和出产环境中、操控爆破半径的前提下进行实在突袭,作为才干的检验。

一般状况下,考虑到本钱投入和体系复杂度,事务运用或许不会建造 4 个阻隔环境来按部就班的推进,但咱们推荐运用应该至少有两个环境来区别用户流量,环境上至少有一个和出产阻隔的灰度环境,至少初期必须如此。环境建造中需求重视的问题如下:

  • 阻隔性:灰度环境和出产环境尽量做到阻隔,包括但不限于网络阻隔,权限阻隔,数据阻隔等,考虑到一些容灾的才干,还可以将两个集群建造在不同地域的 Kubernetes 集群中。

  • 实在性:灰度环境和出产环境尽量保持一致,比方外部依靠,组件版本。

环境建造合格后,才具有了演练的准入条件。

Step 2:毛病场景剖析

在剖析体系的高可用才干时,往往没有一个一致的答案,每个体系的单薄点,瓶颈都不尽相同,但整理体系高可用才干时,咱们可以供给一些通用的思路。

  • 前史毛病:

前史毛病通常是快速了解一个体系单薄才干的教科书,经过剖析前史毛病,进行分类,可以快速得出当时体系那些组件更简单呈现问题。

比方体系才干需求进行快速的弹性弹性,弹性失败或许影响事务流量,可以推断出它强依靠 Kubernetes 的扩缩容才干,需求监控重视此才干的可用性;比方体系数据读写频繁,前史呈现过数据不一致问题,则可以考虑在数据层面进行安稳性建造,添加备份才干,回滚才干等。

  • 架构剖析

体系的架构在必定程度上决议了这个体系的瓶颈,经过剖析体系的依靠也可以更了解体系的鸿沟,也更便于进行运维上的优化。

比方一个运用的布置方法是主备形式的,那必须要查看的才干便是主备切换是否顺畅,切换过程是否影响到事务流量;比方一个运用强依靠底层存储,一旦存储挂掉,事务会大面积毛病,则在整理高可用才干的时候就需求想到存储挂掉后是否有降级计划,存储问题是否可以提早预警。

  • 社区经历:

许多体系的架构都是迥然不同的,参阅社区或友商的经历就像提早看了模拟考题,总会有意想不到的收获。咱们总会在业界爆出一些毛病时进行自我反思和重新整理,屡次发现了自身的一些问题。网线被挖断、删库跑路等宝贵的经历库,都在咱们定时演练的列表中。

在阿里云原生的架构上,咱们整理了如下所示的演练模型供参阅,在这个高可用才干模型中,咱们依据体系架构按照管控层组件、元集群组件、扩展组件,数据存储,节点层,全体集群进行区别,在每个模块中有一些通用的毛病可以互相借鉴。

Step 3:体系高可用才干建造

在实践进行毛病注入前,咱们还需求问自己几个问题。依据上述现已剖析到的咱们想让体系拥有的高可用才干列表,体系是否具有当这些毛病降临时有灵敏的发现才干,人员有灵敏的呼应才干,体系自身是否具有自愈的才干或一些可用来在毛病过程中运用快速康复体系的东西呢?下面咱们从发现才干和康复才干两个方面来给一些通用的主张。

  • 发现才干

监控和告警是可以发现体系是否处于稳态并让运用担任人一望而知的方法。阿里内部团队建造了两种监控告警方法,一种是白盒告警,借助体系内部暴露出来的各种维度的可观测性数据的反常波动来发现潜在问题;一种是黑盒告警,从客户视角把体系作为黑盒,探测正向功用。

  • 康复才干

毛病降临后,最优的结果是体系安稳丝滑,毫无影响,这对体系的才干建造要求极高,而实践的状况往往更为复杂。在阿里内部的实践中,除了对体系自身专门建造了根本的进程自愈、切流才干、迁移才干、限流才干等,也建造了预案中心,中心化的沉淀咱们一切的止损才干到体系中,白屏管理,接入,运转,依据专家经历树立止损才干集,作为毛病时的重要东西。

Step 4:演练施行

以上过程完结之后,咱们以为体系已具有了开端的高可用才干,可以开端施行毛病演练。

一般状况下初次演练咱们会挑选一些核心场景进行,在预发或测验环境,东西上运用半自动化的脚本或仅包括毛病注入模块的流水线来触发,在研制和运维人员在场的状况下进行初次实验。实验前确认场景的预期,比方毛病注入后需求 1min 进行告警,10min 内体系自愈康复,以便在演练过程中随时确认。演练履行后需求各部分人员进行人工确认体系表现是否符合预期,演练结束后及时康复毛病和环境。场景在演练过程中不符预期的部分,需求屡次在此阶段不断验证和演练;符合预期的场景进行标记,可以开端进入到常态化演练阶段。

常态化演练阶段的关键词是混沌化、无人值守,Kubernetes 集群因为架构的优势,自身具有必定的自愈才干,因而更适合无人值守的演练。咱们会挑选现已经过半自动演练的场景调集,安排为一些毛病演练流水线,每个流水线中一般包括毛病注入、监控查看、康复查看、毛病康复等过程,来闭环完结单个演练流程。同时阿里内部运用云原生技能进行混沌化触发,实现在演练对象、环境、时间、场景上的随机,使得这些演练场景可以混沌化、常态化、无人值守的履行。经过常态化毛病演练,助于发现一些偶发性体系问题,并可以在体系升级过程中帮忙查看已有的高可用才干。

出产突袭的施行需求依据体系的架构状况进行,在阿里内部的施行中,一种操控危险的方法是挑选流量低峰去进行,并提早预备一键切流预案,一旦呈现毛病无法康复的状况,当即切流止损。其他突袭相关的危险操控规划咱们会在后续的系列文章中详细剖析。

结语

在内部云原生领域施行毛病演练的过程中,咱们剖析了 200 多个演练场景,经过 1000+/月的频次进行常态化毛病演练,有用的发现了 90 多个问题,避免了问题半径进一步扩展;经过演练流程的搭建、校验和混沌化履行,定时监测体系的告警和预案康复才干,有用的阻拦 50 多个新增高可用问题上线。出产环境的突袭演练是咱们迈出的艰难但有力的一步,训练了研制运维人员的应急呼应才干,在实在用户场景下锤炼体系,推进了产品的轮班制度,提高了云原生底座的安稳性和竞争力。

相关链接

[1] github 上的陈述列表:​​https://github.com/danluu/post-mortems​​

点击此处,前往毛病演练 Chaos 主页查看更多概况!