在 Ali Kubernetes 系统中,我们这样实践混沌工程

在传统的软件测试中,我们通常通过一个给定的条件来判断系统的反馈,通过断言来判断是否符合预期,测试条件和结果通常比较明确和固定。而混沌工程,是通过注入一些“不确定”因素,象放进了一群淘气的猴子,在系统资源、可用性、安全性、延迟、压力等方面进行捣乱,而此过程中,要求系统可以毫无影响的提供服务,用户无感知。

这其实对系统的自愈能力,健壮性都有很高的要求。故障注入一般是指比较受控的一些实验条件,通过注入一些相对极端的异常场景,为系统提供可靠性测试的过程。 整体来说,混沌是一种故障注入规则,强调了一些不确定性、随机性,比较常见的"猴子"有 Netflix 的"猴子军团",可以用来随机关闭系统实例,注入延时,回收资源,检查安全漏洞等等。

开源工具介绍

除了一般系统的 monkey,基于 Kubernetes 已经有一些"猴子"工具可以测试系统的健壮性。接下来,介绍一下比较常见的三种 Kubernetes monkey:

kube-monkey

https://github.com/asobti/kube-monkey

  • 运行方式:kube-monkey 通过 label 设置受害者 pod,创建了一个单独的 kube-monkey pod 对受害者 pod 施加影响;
  • 注入类型:目前支持的故障注入类型仅有杀容器;
  • 配置项:可以通过配置文件设置运行周期和频率,在一定时间内随机的杀死打标范围内的 pod。

powerfulseal

https://github.com/bloomberg/powerfulseal

  • 注入类型:powerfulseal 的故障注入类型包括杀 pod 和启停 node。
  • 运行方式:包括交互模式,自动模式、打标模式和示例模式。交互模式通过界面交互查询node/namespace/pod,启停 node 或杀死 pod 操作;自动模式通过读取配置文件确定注入范围,注入频率;打标模式通过给 pod 打标确定注入的靶向 pod 及注入频率;示例模式可以反映根据使用资源情况进行故障注入的过程。

Chaos Toolkit-kubernetes

https://github.com/chaostoolkit/chaostoolkit-kubernetes

是 chaos 工具包中的一个,通过 chaos run experiment.json 设置 json 文件来指定 namespace,正则匹配名字等等来随机杀一个 pod。

以上三种"猴子",主要是基于杀 pod 场景来注入故障,虽然是最有力的场面但是比较有局限性,对于商业化系统面临的复杂场景,是值得参考但是不够的。

结合 Ali Kubernetes 故障场景分析


Ali Kubernetes 作为一个管理大规模集群的商业调度系统,需要应对的不仅包括一些基本的 Kubernetes 中 pod 误删误停的故障现象,也包含一些底层 OS、内核、网络、误配置等灾难场景。同时由于其支撑业务生态的复杂性,全链路综合异常流也需要特殊的验证。

为更系统的进行演练,在过程中主要进行了以下几部分工作:

FMEA 分析就是失效模式和效果分析,旨在对系统范围内潜在的失效模式加以分析,以便按照严重程度加以分类,或者确定失效对于该系统的影响。
从故障场景上,分析得出较为符合 Ali Kubernetes 的三大类场景:

  • 通用故障场景:包括网络相关故障(网络 iohang ,断网,网络延迟等),宿主机相关故障(机器重启,机器 load 高等)
  • Ali Kubernetes 业务场景故障:包括 Kubernetes 相关的故障(pod 删除,pod patch等),pod 迁移,混部、etcd 等业务相关场景;
  • chaos 故障:较为随机的故障注入,可以为以上任何故障的组合
     

从影响面上,需要 case by case 确定影响范围为无任何影响,仅影响部分功能,影响核心功能等等;从验证恢复手段上,也可以分为自动恢复、手动恢复,同时需要关注监控情况及恢复时间。

在分析过程中,我们发现,已有的开源工具无法完全满足 Ali Kubernetes 的故障场景。下面举 2 个典型故障场景:

pod 被误删

这个场景并不是简单的 pod 随机删除,而是在 kubelet 连错 apiserver 配置等异常情况下,重启 ali-kubelet 后,al 自行判断了容器在当前集群内不存在,自己做了删除操作。
要引入这个故障需要修改 kubelet 组件的配置,重启 kubelet,才算是真正引入了故障,而当前的无论是 kube-monkey 还是 powerfulseal 场景都无法满足。

master 组件断网

有的人可能会说,直接指定 master 组件的机器引入断网操作,是不是就可以了呢?然鹅现实是比较骨感的,我们也许只知道这个 master 所在集群的 kubeconfig,组件的机器其实也可以随着每次升级变动的。在仅仅已知 kubeconfig 的情况下我们只能先查一下 master 组件的机器信息,再在机器上引入断网的操作,才算是一个整体的故障引入。而目前所有的开源工具也没有此类稍微复杂一些的场景,只是通过指定 pod namespace 来随机的删除一些 pod。
所以综上所述,其实我们需要对此进行扩展开发,除了简单的杀 pod,我们亟需一套可以自由开发的小程序,把这个步骤拼接起来,进行更为复杂的故障注入。

套件实现


为了满足此类复杂的故障注入,我们使用了目前集团内正在开发的一套故障注入系统 monkeyking,并在它的基础上扩展了一些 kubernetes 相关的套件,来达到既可以注入 kubernetes 相关的故障,又可以注入一些通用故障,同时又可以相对自由的扩展故障集合的目的。

这个故障注入的演练流程如下图所示:



它的每一个步骤都可以是我们自由扩展的一个或者多个小程序,各个小程序之间的执行顺序也可以自由的定义。考虑到 Ali Kubernetes 的场景,我们在其中扩展了四大类小程序套件。

通用故障小程序

在这一部分主要实现了一些比较通用的 os 故障,网络故障,比如最基本的指定一个宿主机断网,指定宿主机重启这类。

Kubernetes 套件小程序

这一部分主要实现了一些通用的 Kubernetes 命令,通过指定这些命令和入参,我们可以执行比如 create delete apply patch 这些操作,来间接的达到注入一些 Kubernetes 相关故障的目的。
实现原理如下:

要点说明:

  • 下载集群证书的地址及证书的 md5 码都作为小程序的输入,在执行实际的 kubectl 生效命令前进行下载校验;
  • 底层 toolkit 中已经加入了 kubectl 命令行工具,无需自己找环境进行配置和下载;
  • 目前已经支持了 apply,create,delete,patch,get 操作,支持指定 label,namespace,-o json 的操作

举个例子,上文中 master 组件故障的场景中,我们就可以利用以上的两类小程序来完成故障注入的操作:

开源工具小程序

目前我们和集团安全生产的 MonkeyKing 团队合作,联合在故障注入平台 monkeyking 中集成了开源工具 kube-monkey,实现过程借助了上文的 kubernetes 套件执行,可以通过打标的方式标记受害者,让 kube-monkey 随机的杀受害者 pod。步骤如下:

环境准备

  • 锁演练环境
  • 在当前集群中初始化kube-monkey: 使用kubernetes套件的apply功能提交km-config.yaml文件,部署 kube-monkey deployment

**

给应用标记受害者 label

  • 使用 Kubernetes 套件的 patch 功能,标记受害者

**

验证步骤

  • 自定义组件校验应用服务是否可用

**

故障恢复

  • 使用 Kubernetes 套件的 patch 功能,给受害者去标
  • 使用 Kubernetes 套件的 delete 功能,删除 kube-monkey deployment
  • 解锁演练环境

其他业务相关小程序

这一部分比较自由,主要根据 Ali Kubernetes 的业务需求,接入了一些常用的小程序。

比如故障演练过程中,环境需要独占,不允许其他测试执行,在这里实现了一个小程序用来对环境进行加解锁操作;比如校验阶段需要验证服务是否可用,这里实现了一个通过 curl 命令校验返回值的方式验证服务是否可用的小程序;比如故障注入过程可能影响vip挂载,这里也实现了一个调用 vip 服务校验 vip 下 ip 数量及是否可用的小程序。

总结

在 Ali Kubernetes 中,我们将故障以场景化的方式进行沉淀,将底层 os,内核、网络、误配置等故障联合 Kubernetes 相关故障,引入混沌工程的理念进行注入,有效的发现了很多系统稳定性问题,驱动开发人员更多关注系统健壮性。

后续我们会在 Ali Kubernetes  演进过程中持续发力,基于架构和业务场景输入更多 Kubernetes 相关的故障场景,为系统的高可用保驾护航。


原文链接
本文为云栖社区原创内容,未经允许不得转载。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/519503.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

解决idea一直updating index

是因为使用了电脑清理软件,可走以下流程解决问题, 点击【File 】-> 选择【invalidate Caches/Restart】 -> 点击【invalidate and Restart】,完美解决问题。

经过卖房创业与“云吞面”群聊,老季带着优刻得迎来了“开市大吉”……

CSDN记者晶少快报于上海证券交易所现场 今日,优刻得UCloud科技股份有限公司正式在科创板挂牌上市,股票简称优刻得,股票代码为688158。作为唯一一家没有“爸爸”的云计算服务商,2012年成立的优刻得UCloud,自创立近8年来…

天气模式_北方降雪骤减!南方开启湿冷模式多阴雨!|天气展望

刚刚过去的周末许多小伙伴期盼的雪花如愿到货白雪飘飘的冬日浪漫你感受到了吗→“初雪”刷屏?今天,来聊聊关于雪的那些事~然而在北方雪花纷飞的同时象象看到后台许多南方的粉丝感叹这雪与我无关只能穿着半袖开着空调吃着雪糕来感受下雪的氛围这不冷空气决…

Git bash 编码格式配置_02

文章目录1. 中文配置2. 基础编码3. 配置环境变量1. 中文配置 2. 基础编码 在git bash命令窗口总依次执行 git config --global i18n.commitencoding utf-8 #这个主要就是log输出的编码格式 git config --global i18n.logoutputencoding utf-8 git config --global gui.encodi…

AbutionGraph:构建以知识图谱为核心的下一代数据中台

作者 | 图特摩斯科技创始人闭雨哲来源 | AI科技大本营(ID:rgznai100)前言图特摩斯科技(Thutmose)基于自研的图形数据库AbutionGraph(实时多维数据存储与计算一体化的高可用平台)为核心,构建AI智…

Git 克隆远程项目到本地_01

git clone 远程项目ssh地址栗子: git clone gitgithub.com:gb-heima/yyblog.git

保证一致性吗_RabbitMQ消息一致性:重要消息,请设置持久化

在应用开发中,持久化也是经常被提起的,持久化就是存在在内存当中的数据,要写入到磁盘中,这样在内存中的数据由于各种原因丢失掉后,可以通过磁盘重新加载到内存中来,对于消息中间件,持久化也至关…

大厂HR年底绷不住了:怎么招程序员这么难,尤其搞这项技术的!!

力与力之间的作用一定是相互的。当我们感觉找工作难的时候,其实企业和HR也在每天崩溃:“怎么招程序员这么难?”以Python程序员为例,很多大牛都能拿到10~20万的年薪,但是很多企业却根本招不到人,…

国内RISC-V产学研基地成立,Intel、Arm、RISC-V将三分天下?

作者 | 伍杏玲来源 | CSDN(ID:CSDNnews)在IT界,CPU芯片和操作系统是网信领域最基础的核心技术。但在芯片领域,技术和资本的门槛较高,应用范围最广的指令集架构需获得专利授权才能使用,如x86、Ar…

git设置mergetool可视化工具

文章目录1. 下载并安装BeyondCompar2. 设置git配置3. 配置git mergetool3. 添加暂存区4. 将暂存区文件提交到版本库5. 原则1. 下载并安装BeyondCompar 2. 设置git配置 打开 git bash 3. 配置git mergetool 依次执行以下命令即可 git config --global merge.tool bc4 git …

盘点丨2019十大边缘计算项目

来源 | 边缘计算社区(ID:edgewnet)5G和物联网让边缘计算备受瞩目,巨头们纷纷跑步入场,边缘计算项目百花齐放,参差不齐。边缘计算社区经过1个月收集,梳理了10个2019年表现优异的边缘计算开源项目、边缘计算框…

Navicat for MySQL中如何新建用户并赋予权限

文章目录1. 激活2. 新建用户3. 赋予权限1. 激活 打开Navicat for MySQL软件,打开连接并激活数据库 2. 新建用户 点击新建用户,输入用户名,输入主机名,输入密码,确认密码。 3. 赋予权限 点击服务器权限对其赋予…

十年云计算大爆发,微软正在摧毁其它竞争对手

作者 | Kelly Teal译者 | 陆离责编 | 徐威龙出品 | CSDN云计算(ID:CSDNcloud) 近日,Synergy Research做出了三份关于云计算的新行业研究报告,其中包括了一些可以帮助渠道合作伙伴建立相关业务的指导建议。报告指出&…

mysql pb_请详细的说一下怎样用pb连接mysql,好吗

展开全部第一步 当然是装驱动 不过开发环境装了 就要求客户机也要装 可以考虑INSTALLSHILED打包时 把MYSQL驱动环境带32313133353236313431303231363533e4b893e5b19e31333365653164进去 还有一个简单办法 EXE所在目录带上MYODBC3.DLL 就免驱动安装过程了 不过注册ODBC时 需要…

探秘 Dubbo 的度量统计基础设施 - Dubbo Metrics

对服务进行实时监控,了解服务当前的运行指标和健康状态,是微服务体系中不可或缺的环节。Metrics 作为微服务的重要组件,为服务的监控提供了全面的数据基础。近日,Dubbo Metrics 发布了2.0.1版本,本文将为您探秘 Dubbo …

VS在win32平台与mysql链接_visual C++如何与MySQL在windows下建立连接

展开全部#ifdef WIN32#include #include #include #else#include #include #define SQLHANDLE static MYSQL#endif#include #include #include #include SQLHANDLE hDBEnv, hDBC;int DB_Open(char * dbcn, char * usr, char * pwd){int r;#ifdef WIN32r SQLAllocHandle(SQL_HA…

利用Serverless Kubernetes和Kaniko快速自动化构建容器镜像

前言: 在云原生时代中,容器镜像是一切应用分发的基础载体,除了dockerhub作为流行的镜像仓库外,各大公有云厂商也都提供了功能丰富镜像仓库服务,如ACR(Aliyun Container Registry), GCR&#xf…

2020边缘计算状态报告:2028年企业IT基础设施边缘支出将达87亿美元

近日,知名市场研究机构State of the Edge发布了2020年最新的对边缘计算领域的研究报告——《边缘计算状态报告2020》(以下简称“报告”)。“边缘化”是指人或事物从中心和主流位置向“非中心”、“非主流”方向移动。而本次报告指出&#xff…

想提升微服务容错性?试试这5种模式

作者 | Igor Perikov译者 | 陆离责编 | 徐威龙出品 | CSDN云计算(ID:CSDNcloud) 在本文中,我将介绍微服务中的几种容错机制及其实现的方法。如果你在维基百科上查找“容错性”,你将会发现有如下的定义:“容…

21世纪了还愚公移山?数据库这么迁移更稳定!

背景 在系统的快速迭代过程中,业务系统往往部署在同一个物理库,没有做核心数据和非核心数据的物理隔离。随着数据量的扩大这种情况会带来稳定性的风险,如库的慢sql,磁盘,IO等等都会相互整体影响,从而影响核…