云原生背景下故障演练体系建设的思考与实践—云原生混沌工程系列之指南篇

本文涉及的产品
容器服务 Serverless 版 ACK Serverless,317元额度 多规格
应用实时监控服务-可观测链路OpenTelemetry版,每月50GB免费额度
可观测可视化 Grafana 版,10个用户账号 1个月
简介: 生产环境的突袭演练是我们迈出的艰难但有力的一步,锻炼了研发运维人员的应急响应能力,在真实用户场景下锤炼系统,推进了产品的轮班制度,提升了云原生底座的稳定性和竞争力。

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


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


通过使用云计算厂商如阿里云、AWS 等提供的服务,现代服务提供者得以用更低廉的成本,更稳定地进行丰富的软件服务提供。但是真的一切如此轻而易举吗?主流云计算厂商在 SLA 承诺的范围内,都各自出现过一些历史故障,可参见这份血淋淋的 github 上的报告列表[1]。另一方面,各个云产品提供给了用户使用的一些高可用能力,经常依然是需要用正确的姿势来配置和使用的。


混沌工程可以帮助业务系统服务提供者通过创建破坏性事件、观察系统和人员响应方式、针对优化改进这 3 个步骤来发现生产服务中脆弱的环节,并根据预期的 SLA 目标进行实施改进。除了指出需要改进的系统组件设计问题之外,混沌工程还可帮助发现需要监控和告警上的盲点、发现人员对系统理解、应急响应 SOP、排查能力上的不足,进而使得业务系统及其研发、运维人员整体的高可用能力水位大大上浮。因此 Netflix 提出此概念后,各大软件厂商纷纷进行了对内实践和对外产品提供。


云原生在传统云计算基础上,提供了更快更低成本的弹性,更好的软硬一体化灵活性,已经成为云计算发展最快的技术方向。云原生帮助开发者大幅度降低资源成本和交付成本,从而更快更好地赢得市场。同时,云原生也给传统运维、研发方式带来了彻底的变革,这就使得传统的混沌工程手段需要跟随演进。


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


image.gif1.png

在这样差异的背景下,用云原生的手段,实施更加针对植根于云原生应用的场景的混沌工程,是更加恰如其分,能够提供更多能力提升的。


混沌工程实施模式的阶段和发展


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


从演练工具和落地实施来看,一个组织的故障演练经常分为几个发展阶段:手工演练,流程工具自动化演练,常态化无人值守演练,生产突袭演练。


这几个阶段的实施难度是从低到高,当然相应的收益也是从低到高。一个组织(云用户)可以随着自己业务应用服务体量的增大、复杂化和高可用能力的增高的历程,根据实际情况需要选择自己合适的阶段,然后随之进行升级和发展。即使从最简便的手工演练开始做起实施,经常也能带来相当明显且长远的高可用能力系统性提升。


那么每个阶段分别有什么特点,又该如何选择呢


2.png


  • 手工演练:一般在高可用能力建设初期阶段,或者一次性验收的情况下手工注入故障完成。通过人为查看告警是否生效,系统恢复情况来进行演练。在这个阶段只需要一些故障注入的小工具或者脚本,方便后续使用即可。


  • 自动化演练:高可用能力建设到一定阶段后,往往会有定期检查高可用能力是否退化的需求,自动化演练开始排上日程。自动化演练步骤一般包括:环境准备 -> 故障注入 -> 检查 -> 环境恢复。在每个步骤中配置相应的脚本来形成演练流程,下一次就可以一键点击自动化执行了。


  • 常态化执行:演练进行到下一阶段,我们会有更高的要求,希望演练可以自主混沌化执行,以无人值守的方式进行,这又对系统的高可用能力有了新的挑战。这要求系统有不仅有监控告警可以发现故障,也有对应的预案模块来负责恢复,而要做到无人值守,需要系统进行更智能精确的判断故障情况,自动执行相应预案。


3.png


  • 生产突袭:以上演练大多在灰度环境进行,不会影响到业务,生产突袭则要求系统有能力在生产环境控制爆炸半径的前提下进行故障演练,以期发现一些业务相关、规模相关、配置相关、应急响应相关的,在灰度环境遗漏的部分,生产环境的演练对系统的要求较高,需要有一套执行规范,对系统的隔离能力也有较高要求。大多数的工作,能力建设都在灰度环境完成验证,但生产突袭仍作为一个有效且必要的演练手段,用更真实的场景给研发体感,让其真实执行预案,也锻炼了应急能力,对系统有更多信心和认知。


如何进行一次完整的故障演练实施

当应用首次使用 Kubernetes 进行应用部署和扩容时,最先关注的更多是功能是否可用,故障演练则是更高级别的要求,我们假设当前的系统已经初步通过了功能验收,但对于一些故障情况下系统的表现还未知的前提下,来开始我们的故障演练之旅。
故障演练本身作为一种破坏性的操作,需要循序渐进,遵循一定的规范和流程来落地。下面我们从环境建设、系统能力分析、高可用能力建设、演练实施建议几个方面来介绍一下,一个首次在 Kubernetes 中部署起来的应用应该如何循序渐进的实施故障演练。


Step 1:隔离环境建设

故障演练,特别是首次执行之前,我们需要明确好当前注入故障的环境情况,是否可能影响到业务流量,是否会造成无法弥补的损失,在阿里内部,我们有复杂的环境隔离和变更管控,以防故障注入影响到业务流量。


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


  • 业务测试环境:用来进行 e2e 测试,全面的功能验收,这个环境和有业务流量的生产网络是隔离的,从网络上避免了流量错误进入到其他环境,因此可以在这个环境上尽情的进行各种容错性测试。


  • 金丝雀环境:可以理解为是一种全面的链路灰度环境,这个环境有当前系统的所有组件,一般用来做上下游联调,系统内部的链路灰度使用,这个环境是没有实际业务流量的;


  • 安全生产灰度环境:这个环境我们会引入 1% 的生产流量,并提前建设了切流能力,一旦这个环境出现问题,可以把流量迅速切换到生产环境中,该环境一般用来结合用户流量做一段时间的灰度,以免全量发布导致的不可控;


  • 生产环境:真实用户流量的环境,这个环境的任何运维动作都需要进行严格的变更审核和前几个环境的灰度通过才能变更;


故障演练一般会开始在金丝雀环境引入,可以在全链路、无真实流量的环境中做一些高可用能力的建设和验收,常态执行的演练,在这个环境演练多次的场景,可定期在灰度环境和生产环境中、控制爆炸半径的前提下进行真实突袭,作为能力的验收。
image.gif

4.png


一般情况下,考虑到成本投入和系统复杂度,业务应用可能不会建设 4 个隔离环境来循序渐进的推进,但我们推荐应用应该至少有两个环境来区分用户流量,环境上至少有一个和生产隔离的灰度环境,至少初期必须如此。环境建设中需要关注的问题如下:


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


  • 真实性:灰度环境和生产环境尽量保持一致,比如外部依赖,组件版本。


环境建设达标后,才具备了演练的准入条件。


Step 2:故障场景分析

在分析系统的高可用能力时,往往没有一个统一的答案,每个系统的薄弱点,瓶颈都不尽相同,但整理系统高可用能力时,我们可以提供一些通用的思路。


  • 历史故障:


历史故障通常是快速了解一个系统薄弱能力的教科书,通过分析历史故障,进行分类,可以快速得出当前系统那些组件更容易出现问题。


比如系统能力需要进行快速的弹性伸缩,伸缩失败可能影响业务流量,可以推断出它强依赖 Kubernetes 的扩缩容能力,需要监控关注此能力的可用性;比如系统数据读写频繁,历史出现过数据不一致问题,则可以考虑在数据层面进行稳定性建设,增加备份能力,回滚能力等。


  • 架构分析


系统的架构在一定程度上决定了这个系统的瓶颈,通过分析系统的依赖也可以更了解系统的边界,也更便于进行运维上的优化。


比如一个应用的部署方式是主备模式的,那必须要检查的能力就是主备切换是否顺畅,切换过程是否影响到业务流量;比如一个应用强依赖底层存储,一旦存储挂掉,业务会大面积故障,则在整理高可用能力的时候就需要想到存储挂掉后是否有降级方案,存储问题是否可以提前预警。


  • 社区经验:


很多系统的架构都是大同小异的,参考社区或友商的经验就像提前看了模拟考题,总会有意想不到的收获。我们总会在业界爆出一些故障时进行自我反思和重新整理,多次发现了自身的一些问题。网线被挖断、删库跑路等宝贵的经验库,都在我们定期演练的列表中。


在阿里云原生的架构上,我们整理了如下所示的演练模型供参考,在这个高可用能力模型中,我们根据系统架构按照管控层组件、元集群组件、扩展组件,数据存储,节点层,整体集群进行区分,在每个模块中有一些通用的故障可以互相借鉴。image.gif


5.png


Step 3:系统高可用能力建设

在实际进行故障注入前,我们还需要问自己几个问题。根据上述已经分析到的我们想让系统拥有的高可用能力列表,系统是否具备当这些故障来临时有敏捷的发现能力,人员有迅速的响应能力,系统本身是否具备自愈的能力或一些可用来在故障过程中使用快速恢复系统的工具呢?下面我们从发现能力和恢复能力两个方面来给一些通用的建议。


  • 发现能力


监控和告警是能够发现系统是否处于稳态并让应用负责人一目了然的方式。阿里内部团队建设了两种监控告警方式,一种是白盒告警,借助系统内部暴露出来的各种维度的可观测性数据的异常波动来发现潜在问题;一种是黑盒告警,从客户视角把系统当做黑盒,探测正向功能。


  • 恢复能力


故障来临后,最优的结果是系统稳定丝滑,毫无影响,这对系统的能力建设要求极高,而实际的情况往往更为复杂。在阿里内部的实践中,除了对系统本身专门建设了基本的进程自愈、切流能力、迁移能力、限流能力等,也建设了预案中心,中心化的沉淀我们所有的止损能力到系统中,白屏管理,接入,运行,根据专家经验建立止损能力集,作为故障时的重要工具。


Step 4:演练实施


以上步骤完成之后,我们认为系统已具备了初步的高可用能力,可以开始实施故障演练。


一般情况下首次演练我们会挑选一些核心场景进行,在预发或测试环境,工具上使用半自动化的脚本或仅包含故障注入模块的流水线来触发,在研发和运维人员在场的情况下进行首次试验。试验前确认场景的预期,比如故障注入后需要 1min 进行告警,10min 内系统自愈恢复,以便在演练过程中随时确认。演练执行后需要各部分人员进行人工确认系统表现是否符合预期,演练结束后及时恢复故障和环境。场景在演练过程中不符预期的部分,需要多次在此阶段不断验证和演练;符合预期的场景进行标记,可以开始进入到常态化演练阶段。


常态化演练阶段的关键词是混沌化、无人值守,Kubernetes 集群由于架构的优势,本身具备一定的自愈能力,因此更适合无人值守的演练。我们会筛选已经通过半自动演练的场景集合,组织为一些故障演练流水线,每个流水线中一般包含故障注入、监控检查、恢复检查、故障恢复等步骤,来闭环完成单个演练流程。同时阿里内部使用云原生技术进行混沌化触发,实现在演练对象、环境、时间、场景上的随机,使得这些演练场景可以混沌化、常态化、无人值守的执行。通过常态化故障演练,助于发现一些偶发性系统问题,并可以在系统升级过程中协助检查已有的高可用能力。


生产突袭的实施需要根据系统的架构情况进行,在阿里内部的实施中,一种控制风险的方式是选择流量低峰去进行,并提前预备一键切流预案,一旦出现故障无法恢复的情况,立即切流止损。其他突袭相关的风险控制设计我们会在后续的系列文章中详细分析。


结语


在内部云原生领域实施故障演练的过程中,我们分析了 200 多个演练场景,通过 1000+/月的频次进行常态化故障演练,有效的发现了 90 多个问题,避免了问题半径进一步扩大;通过演练流程的搭建、校验和混沌化执行,定期监测系统的告警和预案恢复能力,有效的拦截 50 多个新增高可用问题上线。生产环境的突袭演练是我们迈出的艰难但有力的一步,锻炼了研发运维人员的应急响应能力,在真实用户场景下锤炼系统,推进了产品的轮班制度,提升了云原生底座的稳定性和竞争力。


相关链接


[1] github 上的报告列表:https://github.com/danluu/post-mortems


点击此处,前往故障演练 Chaos 主页查看更多详情!

相关实践学习
通过Ingress进行灰度发布
本场景您将运行一个简单的应用,部署一个新的应用用于新的发布,并通过Ingress能力实现灰度发布。
容器应用与集群管理
欢迎来到《容器应用与集群管理》课程,本课程是“云原生容器Clouder认证“系列中的第二阶段。课程将向您介绍与容器集群相关的概念和技术,这些概念和技术可以帮助您了解阿里云容器服务ACK/ACK Serverless的使用。同时,本课程也会向您介绍可以采取的工具、方法和可操作步骤,以帮助您了解如何基于容器服务ACK Serverless构建和管理企业级应用。 学习完本课程后,您将能够: 掌握容器集群、容器编排的基本概念 掌握Kubernetes的基础概念及核心思想 掌握阿里云容器服务ACK/ACK Serverless概念及使用方法 基于容器服务ACK Serverless搭建和管理企业级网站应用
相关文章
|
6天前
|
Kubernetes Cloud Native Docker
云原生时代的容器化实践:Docker和Kubernetes入门
【10月更文挑战第37天】在数字化转型的浪潮中,云原生技术成为企业提升敏捷性和效率的关键。本篇文章将引导读者了解如何利用Docker进行容器化打包及部署,以及Kubernetes集群管理的基础操作,帮助初学者快速入门云原生的世界。通过实际案例分析,我们将深入探讨这些技术在现代IT架构中的应用与影响。
28 2
|
9天前
|
监控 Kubernetes Cloud Native
云原生之旅:从理论到实践的探索
【10月更文挑战第34天】本文将引导你走进云原生的世界,从基础概念出发,逐步深入到实际的应用部署。我们将探讨云原生技术如何改变现代软件开发和运维的方式,并展示通过一个简单应用的部署过程来具体理解服务编排、容器化以及自动化管理的实践意义。无论你是云原生技术的初学者还是希望深化理解的开发者,这篇文章都将为你提供有价值的视角和知识。
25 3
|
16天前
|
弹性计算 Kubernetes Cloud Native
云原生架构下的微服务设计原则与实践####
本文深入探讨了在云原生环境中,微服务架构的设计原则、关键技术及实践案例。通过剖析传统单体架构面临的挑战,引出微服务作为解决方案的优势,并详细阐述了微服务设计的几大核心原则:单一职责、独立部署、弹性伸缩和服务自治。文章还介绍了容器化技术、Kubernetes等云原生工具如何助力微服务的高效实施,并通过一个实际项目案例,展示了从服务拆分到持续集成/持续部署(CI/CD)流程的完整实现路径,为读者提供了宝贵的实践经验和启发。 ####
|
5天前
|
运维 Kubernetes Cloud Native
云原生技术入门及实践
【10月更文挑战第39天】在数字化浪潮的推动下,云原生技术应运而生,它不仅仅是一种技术趋势,更是企业数字化转型的关键。本文将带你走进云原生的世界,从基础概念到实际操作,一步步揭示云原生的魅力和价值。通过实例分析,我们将深入探讨如何利用云原生技术提升业务灵活性、降低成本并加速创新。无论你是云原生技术的初学者还是希望深化理解的开发者,这篇文章都将为你提供宝贵的知识和启示。
|
4天前
|
Cloud Native 安全 API
云原生架构下的微服务治理策略与实践####
—透过云原生的棱镜,探索微服务架构下的挑战与应对之道 本文旨在探讨云原生环境下,微服务架构所面临的关键挑战及有效的治理策略。随着云计算技术的深入发展,越来越多的企业选择采用云原生架构来构建和部署其应用程序,以期获得更高的灵活性、可扩展性和效率。然而,微服务架构的复杂性也带来了服务发现、负载均衡、故障恢复等一系列治理难题。本文将深入分析这些问题,并提出一套基于云原生技术栈的微服务治理框架,包括服务网格的应用、API网关的集成、以及动态配置管理等关键方面,旨在为企业实现高效、稳定的微服务架构提供参考路径。 ####
24 5
|
7天前
|
运维 Cloud Native 安全
云原生技术在现代软件开发中的实践与挑战####
【10月更文挑战第21天】 本文将深入探讨云原生技术在现代软件开发中的应用,分析其带来的优势及面临的挑战。通过案例分析和数据支持,揭示云原生化转型的关键因素,并展望未来发展趋势。 ####
21 7
|
6天前
|
负载均衡 监控 Cloud Native
云原生架构下的微服务治理策略与实践####
在数字化转型浪潮中,企业纷纷拥抱云计算,而云原生架构作为其核心技术支撑,正引领着一场深刻的技术变革。本文聚焦于云原生环境下微服务架构的治理策略与实践,探讨如何通过精细化的服务管理、动态的流量调度、高效的故障恢复机制以及持续的监控优化,构建弹性、可靠且易于维护的分布式系统。我们将深入剖析微服务治理的核心要素,结合具体案例,揭示其在提升系统稳定性、扩展性和敏捷性方面的关键作用,为读者提供一套切实可行的云原生微服务治理指南。 ####
|
6天前
|
消息中间件 缓存 Cloud Native
云原生架构下的性能优化实践与挑战####
随着企业数字化转型的加速,云原生架构以其高度解耦、弹性伸缩和快速迭代的特性,成为现代软件开发的首选模式。本文深入探讨了云原生环境下性能优化的关键策略与面临的主要挑战,通过案例分析,揭示了如何有效利用容器化、微服务、动态调度等技术手段提升应用性能,同时指出了在复杂云环境中确保系统稳定性和高效性的难题,为开发者和架构师提供了实战指南。 ####
18 3
|
6天前
|
运维 Kubernetes Cloud Native
深入理解云原生架构:从理论到实践
【10月更文挑战第38天】本文将引导读者深入探索云原生技术的核心概念,以及如何将这些概念应用于实际的软件开发和运维中。我们将从云原生的基本定义出发,逐步展开其背后的设计哲学、关键技术组件,并以一个具体的代码示例来演示云原生应用的构建过程。无论你是云原生技术的初学者,还是希望深化理解的开发者,这篇文章都将为你提供有价值的见解和实操指南。
|
6天前
|
Cloud Native 持续交付 云计算
云原生技术入门与实践
【10月更文挑战第37天】本文旨在为初学者提供云原生技术的基础知识和实践指南。我们将从云原生的概念出发,探讨其在现代软件开发中的重要性,并介绍相关的核心技术。通过实际的代码示例,我们展示了如何在云平台上部署和管理应用,以及如何利用云原生架构提高系统的可伸缩性、弹性和可靠性。无论你是云原生领域的新手,还是希望深化理解的开发者,这篇文章都将为你打开一扇通往云原生世界的大门。