内容来源:DevOps案例深度研究 – Netflix的文化与工程实践战队(本文只展示部分案例PPT及研究成果,更多细节请关注案例分享活动,及本公众号)。
本案例内容贡献者:高金梅,李晓莉,潘雄鹰,潘晓华,任广印,孙亚雄,王英伟
本次案例解读:潘晓华
原文首发于简书-潘晓华Michael
一、Netflix实施混沌工程的背景
- 很长时间内有两套系统在同时运行,运维的复杂度更高了。
- Netflix的用户量已经达到了1亿,对应用稳定性依赖很高,如果出现故障对用户的影响非常大,甚至是致命的。
- 它的业务不断复杂,引入微服务架构,对应用的高可用性要求越来越高。
- 生产环境非常复杂,是多样性的,很难在测试环境中完全模拟生产的状态。
二、混乱工程的发展
2010年,捣乱猴子诞生
2011年,猴子军团,有了更多场景下的工具集
2012年,开源了捣乱猴子的代码,建立社区,影响了越来越多的公司混沌工程的发展
2014年,Netflix创建了新的工作角色,混沌工程师,代表了Netflix将混沌工程融入了公司的运维文化中
2015年,Netflix与社区正式提出混沌工程原则,从此混沌工程不只是一些工具的集合,而有了一套理论支撑
2016年,Netflix前员工Kolton Andrus创立了Gremlin,正式将混沌实验工具商用化,可以看到混沌工程影响着越来越多的企业。
2017年,Chaos Monkey 2.0
三、Netflix猴子军团
(Netflix猴子军团)
Chaos Monkey,捣乱猴子,可以随机关闭生产环境中的实例,确保网站系统能够经受故障的考验,同时不会影响客户的正常使用。
Latency Monkey,延迟猴子,在RESTful服务的调用中引入人为的延时来模拟服务降级,测量上游服务是否会做出恰当响应。通过引入长时间延时,还可以模拟节点甚至整个服务不可用。
Conformity Monkey,一致性猴子,查找不符合最佳实践的实例,并将其关闭。例如,如果某个实例不在自动伸缩组里,那么就该将其关闭,让服务所有者能重新让其正常启动。
Doctor Monkey,医生猴子,查找不健康实例的工具,除了运行在每个实例上的健康检查,还会监控外部健康信号,一旦发现不健康实例就会将其移出服务组。
Janitor Monkey,守卫猴子,查找不再需要的资源,将其回收,这能在一定程度上降低云资源的浪费。
Security Monkey,安全猴子,这是Conformity Monkey的一个扩展,检查系统的安全漏洞,同时也会保证SSL和DRM证书仍然有效。
10-18 Monkey,本地化猴子,进行本地化及国际化的配置检查,确保不同地区、使用不同语言和字符集的用户能正常使用Netflix。
Chaos Gorilla,捣乱大猩猩,Chaos Monkey的升级版,可以模拟整个Amazon Availability Zone故障,以此验证在不影响用户,且无需人工干预的情况下,能够自动进行可用区的重新平衡。
Chaos Kong,捣乱金刚,Chaos Gorilla的升级版,可以模拟整个Region的故障。
四、混沌工程的原则
五、混沌工程实践步骤
(混沌工程实践步骤)
有了这些原则,就可以根据业务的真实场景设计混沌工程实验。
在真实展开实验时分为两个阶段:准备阶段、执行阶段。
1)准备阶段
- 确认本次实验需要验证的目标。遵循建立稳定状态的假设、多样化现实世界事件的原则。例如:Redis的超时不会对系统影响。代码中已经对Redis超时的情况做了相关的工作,保证业务的可靠。实验只是用来测试验证。
- 选择实验范围。遵循对线上业务影响最小、尽量与生产环境相近的原则。例如先测试环境验证,生产环境选择最小量用户验证。
- 确认监控指标。例如:订单成交量、应用请求响应时间、应用响应错误率,做好监控实时查看状态。
- 团队成员沟通。遵循最小化影响范围。确保团队相关成员了解实施情况,关注业务状态。准备阶段一般只是第一次实验的时候操作,一旦验证好了以后以后,后续重复执行本次工程不需要重新准备,除非对实验过程有变动。
2)执行阶段
- 执行实验。遵循最小化影响范围。执行过程中实时关注指标,如果有异常,随时终止实验。例如,把Redis延时调大,查看监控指标是否有异常。
- 分析结果。遵循最小化影响范围。根据收集的指标数据确认假设Redis的超时不会对系统影响。如果验证假设不成立,则需要分析代码,确认好原因,再组织下一次的混沌工程实验。
- 扩大实验范围。遵循最小化影响范围。先小范围测试,再逐步扩大测试范围。
- 自动化。遵循持续自动化运行实验。当对代码有足够的信心之后,将混沌工程实践做成自动化,让混沌工程实验能够持续保证业务的可用性,获得最大的价值。
六、Chaos Monkey在K8S集群下的应用
Kube-monkey:模拟在指定时间随机删除K8s集群中的pod。
Powerfulseal:控制K8S中的Pod及Node节点的状态。
Gremlin:是一个商业版工具。通过web/API/CLI的方式对容器、主机,提供数十种攻击方式,方便与其它工具进行集成。
总结
参考文章
Netflix 混沌工程手册:https://www.infoq.cn/theme/13
Unleash the Chaos Monkey:https://www.ibm.com/developerworks/agile/library/a-devops4/index.html
Netflix的Chaos Monkey的一个实现用于Kubernetes集群:https://go.ctolib.com/kube-monkey.html
获得1.25亿用户以后,Netflix总结了这些系统可用性经验:https://www.huxiu.com/article/258949.html?rec=similar
Istio Chaos Engineering: I Meant to Do That:https://developers.redhat.com/blog/2018/04/10/istio-chaos-engineering/
AWS云上混沌工程实践之启动篇:https://aws.amazon.com/cn/blogs/china/aws-chaos-engineering-start/
拓展阅读: