混沌工程是一种通过在生产环境引入故障来验证系统对非预期故障防御能力的方法,能够帮助提升集群的容错性和可恢复性。阿里云容器服务ACK中的混沌工程功能可以通过配置告警规则、在集群中创建破坏性事件、接收并处理告警、优化改进等多个步骤来发现监控和告警的盲点,从而提高运维人员对系统的理解,建立标准操作流程SOP(Standard Operating Procedure),完善集群的运维体系。本文介绍容器服务ACK中混沌工程的概念、使用场景以及如何使用混沌工程建设1-5-10的运维体系。
使用场景
使用容器服务ACK的运维人员往往对集群的架构、功能缺乏全面的认知,在使用容器服务时很难建设有效的报警和运维体系,导致当故障来临时,由于缺少应急方案而延误宝贵的恢复时间。容器服务ACK的混沌工程提供如下典型使用场景。
- 场景一
企业刚进行云原生转型,希望容器服务ACK提供可落地的运维体系。
- 场景二
企业刚经历一次重大故障,针对故障完善了自身的系统,需要通过演练来验证系统的可靠性。
- 场景三
企业已经拥有云原生应用的运维经验,希望发现集群中存在的问题,完善自身的运维体系,实现容器服务ACK上的最佳运维方案,提高故障响应效率。
针对以上场景,您可以通过混沌工程的故障演练,实现建设一套从故障产生(实际故障或混沌注入)、故障发现(监控报警)、故障恢复(自愈或根据SOP恢复)的1-5-10的运维体系,即1分钟收到报警,5分钟定位到问题,10分钟完成故障恢复。
如何使用混沌工程进行故障演练
混沌工程作为一种破坏性的操作,可能会对集群中运行的应用带来故障,因此要遵循一定的规范和流程。以下从环境建设、故障场景分析、1-5-10的运维体系建设来介绍如何使用混沌工程在容器集群中进行故障演练。
环境建设
使用混沌工程的前提是不能影响真实生产的业务,因此在开启混沌工程前,需要建设隔离环境,避免故障注入影响真实业务。按照环境功能划分为以下几类:
环境 | 描述 |
---|---|
开发测试环境 | 用于业务代码开发自测,该环境通常是不稳定且与生产环境的网络是完全隔离的,因此可在此环境随意进行故障演练。但由于环境不够稳定,因此在此环境演练往往达不到预期效果。 |
验收测试环境 | 通常用于E2E测试、全面功能验收的环境,具备生产所需的全链路系统。该环境与生产环境的网络也是完全隔离的,环境中各个系统也相对稳定,因此可在此环境进行演练。 |
灰度发布环境 | 灰度发布环境通常和生产环境采用一样的配置,用于系统正式发布前的灰度验证。该环境具备一键切流能力,系统灰度过程可以引入部分生产流量做验证,一旦出现不符合预期的情况,可将流量快速切回生产环境。 |
容灾环境 | 为了保证生产环境发生故障时业务的高可用,通常需要建设容灾环境。容灾环境是与生产环境相同的备份环境,生产环境正常运行时无生产流量,当生产环境出现故障时,可将生产流量切换至容灾环境,由容灾环境系统对外提供服务。 |
生产环境 | 具有真实业务流量的环境,该环境的任何运维操作都需要进行严格的变更审核,需要进行严格的测试、灰度验证后才能进行变更。生产环境需要建设配套的监控、告警、工具等一系列运维体系,保证其稳定运行。 |
测试阶段的混沌工程通常会在验收测试环境进行,可以在稳定、安全隔离的测试环境中做多场景的故障演练和功能验收;在验收测试环境经过验证的演练场景可作为常态化执行的演练,经过风险评估后,可定期在灰度环境、容灾环境和生产环境中进行突袭演练,模拟真实生产故障,验证生产环境的高可用。
通常情况下,考虑到成本投入和系统复杂度,业务应用不会建设多套隔离环境。在使用混沌工程时,除真实的生产环境外,推荐至少建设一套与生产环境隔离的灰度环境。环境建设中需要关注的问题如下:
- 隔离性:灰度环境和生产环境需尽量隔离,包括但不限于网络隔离、权限隔离、数据隔离等。
- 一致性:灰度环境和生产环境需尽量保持一致,包括但不限于外部依赖、系统版本、配置信息等。
故障场景分析
在进行混沌工程时,需要分析演练场景。由于各个业务环境不尽相同,演练场景没有固定的答案,需要您针对各自系统的特点进行总结,下面提供一些通用的思路供您参考。
- 历史故障
历史故障通常是快速了解一个系统薄弱环节的有效方式,通过对历史故障进行复盘分析,可以快速得出当前系统的依赖、风险以及稳定性。比如系统数据读写频繁,历史出现过数据不一致导致的故障,则可以考虑在数据层面进行稳定性建设,增加备份能力、回滚能力等。
- 架构分析
系统的架构在一定程度上决定了这个系统的瓶颈,通过分析系统的依赖可以了解系统的边界,便于进行运维上的优化。比如应用的部署方式是主备模式的,则需要检查应用是否具备主备切换能力、切换过程是否顺畅、是否影响业务流量等。
- 社区经验
高可用系统的架构和故障往往具有相通性,因此可以参考社区的经验及业界常见的故障,检视自身的系统是否存在类似的问题,比如机房断电、误删数据库等故障场景。
- 常见故障场景
根据容器服务ACK集群的架构、组件特性,梳理常见的故障场景如下。
场景 异常组件 异常场景 管控组件故障 kube-apiserver 组件容器部分副本不可用 组件容器全部副本不可用 组件容器CPU、内存、网络高负载 - kube-controller-manager
- kube-scheduler
- kube-proxy
- cloud-controller-manager
- etcd
组件容器副本数少于半数不可用 组件容器副本数高于半数不可用 组件容器CPU、内存、网络、磁盘高负载 系统组件故障 网络组件 Terway、Flannel容器不可用、异常重启 CoreDNS容器不可用、异常重启 CoreDNS解析延迟 LocalDNS容器不可用、异常重启 Nginx Ingress Controller容器不可用、异常重启 Kube-Proxy容器不可用、异常重启 存储插件 CSI容器不可用和异常重启 Storage-Operator容器不可用、异常重启 节点故障 Kubelet 进程启动失败、异常重启、无响应 运行时 Dockerd进程启动失败、异常重启、无响应 Containerd进程启动失败、异常重启、无响应 节点 CPU、内存、网络、磁盘高负载 网络异常 文件句柄数、进程ID不足 节点异常重启、无响应 业务容器故障 Pod Pod状态异常 Pod Out Of Memory异常 Pod不可用、异常重启 Pod CPU、网络、磁盘高负载
运维体系建设
真实生产运维中产生故障时,需要有快速的发现、响应、定位、恢复机制,需要生产系统具备稳定性和自愈能力,需要有快速故障恢复的运维工具和操作手册,因此一个完善的系统运维体系是必要的。容器服务ACK希望通过混沌工程帮您建设一套从故障产生、故障发现、故障恢复的1-5-10运维体系,以下将从故障发现、故障恢复、运维体系验证三个方面阐述如何建设一个完善的容器服务运维体系。
- 故障发现
监控和告警是快速进行故障发现的有效机制,是保证服务高可用的重要部分。通过完备的监控系统,运维人员可以根据流量模型、数据分析、度量趋势来推算系统的异常趋势,提前发现系统中潜在的故障。当系统产生故障时,告警机制可以快速触达运维人员,缩短运维人员的响应时间,从而能更快更准确地发现故障。容器服务ACK提供了监控和告警的能力,能够帮您快速进行故障发现。关于监控和告警的更多信息,请参见可观测性体系概述。
- 故障恢复
当系统产生故障时,最理想的情况是系统可自行自愈,不受影响,但这对系统的稳定性要求极高,在真实运行环境中往往很难做到。因此在系统建设的过程中,需要根据不同的场景建设应急预案中心,在故障发生时运维人员可以通过SOP进行故障恢复。容器服务ACK为集群中的关键组件提供了高可靠性和自愈能力,同时提供了告警与SOP关联的能力,能够在告警的同时将对应的处理手册触达运维人员,引导运维人员快速进行故障定位和恢复。
- 1-5-10运维体系验证
容器服务ACK的目标是帮您建设1-5-10的运维体系。当系统具备了故障发现和故障恢复的能力后,您可以通过混沌工程注入故障的方式,来验证当前运维体系的时效性和可靠性,从而发现运维体系中的薄弱环节,进而有针对性地完善您的运维体系。