cover_image

混沌测试

王新宇 GrowingIO技术团队
2021年12月02日 10:30

↑ 点击关注 ↑ 更多技术干货


图片

什么是混沌测试:


混沌测试是一种可试验的、基于系统的方法来处理大规模分布式系统中的混乱问题。通过不断试验,了解系统的实际能承受的韧性边界并建立信心,通过不同的试验方法和目的,观察分布式系统的行为和反应。一句话——以试验的方法尽早揭露系统弱点。

混沌测试类似于"故障演练",不局限于测试,而更像是工程实践。为什么这么说,通常的测试用例会有"期望结果"和"实际结果",通过将两个结果比较,或者对用户行为的预期,来判断测试通过或失败。而混沌试验类似于"探索性测试",试验本身没有明确是输入和预期结果,通过对系统和服务的干预,来观察系统的"反应"。将混沌测试原则融入在试验过程中:在生产环境小规模模拟系统故障并定期自动化执行试验,通过试验结果与正常结果进行比对,观察系统"边界"。

混沌测试平台Chaos-mesh

Chaos-mesh简介

Chaos Mesh 是一个开源的云原生混沌工程平台,提供丰富的故障模拟类型,具有强大的故障场景编排能力,方便用户在开发测试中以及生产环境中模拟现实世界中可能出现的各类异常,帮助用户发现系统潜在的问题。Chaos Mesh 提供完善的可视化操作,旨在降低用户进行混沌工程的门槛。用户可以方便地在 Web UI 界面上设计自己的混沌场景,以及监控混沌实验的运行状态。

Chaos-mesh核心优势

Chaos Mesh 作为业内领先的混沌测试平台,具备以下核心优势:

  • 核心能力稳固:Chaos Mesh 起源于 TiDB的核心测试平台,发布初期即继承了大量 TiDB 已有的测试经验。

  • 被充分验证:Chaos Mesh 被众多公司以及组织所使用,例如腾讯和美团等;同时被用于众多知名分布式系统的测试体系中,例如 Apache APISIX 和 RabbitMQ 等。

  • 系统易用性强:图形化操作和基于 Kubernetes 的使用方式,充分利用了自动化能力。

  • 云原生:Chaos Mesh 原生支持 Kubernetes 环境,提供了强悍的自动化能力。

  • 丰富的故障模拟场景:Chaos Mesh 几乎涵盖了分布式测试体系中基础故障模拟的绝大多数场景。

  • 灵活的实验编排能力:用户可以通过平台设计自己的混沌实验场景,场景可包含多个混沌实验编排,以及应用状态检查等。

  • 安全性高:Chaos Mesh 具有多层次安全控制设计,提供高安全性。

  • 活跃的社区:Chaos Mesh 为全球知名开源混沌测试平台,CNCF 开源基金会孵化项目。

  • 强大的扩展能力:Chaos Mesh 为故障测试类型扩展和功能扩展提供了充分的扩展能力。


图片

Chaos-mesh 架构概览


Chaos Mesh 基于 Kubernetes CRD (Custom Resource Definition) 构建,根据不同的故障类型定义多个 CRD 类型,并为不同的 CRD 对象实现单独的 Controller 以管理不同的混沌实验。Chaos Mesh 主要包含以下三个组件:

  • Chaos Dashboard:Chaos Mesh 的可视化组件,提供了一套用户友好的 Web 界面,用户可通过该界面对混沌实验进行操作和观测。同时,Chaos Dashboard 还提供了 RBAC 权限管理机制。

  • Chaos Controller Manager:Chaos Mesh 的核心逻辑组件,主要负责混沌实验的调度与管理。该组件包含多个 CRD Controller,例如 Workflow Controller、Scheduler Controller 以及各类故障类型的 Controller。

  • Chaos Daemon:Chaos Mesh 的主要执行组件。Chaos Daemon 以DaemonSet的方式运行,默认拥有 Privileged 权限(可以关闭)。该组件主要通过侵入目标 Pod Namespace 的方式干扰具体的网络设备、文件系统、内核等。


图片


Chaos Mesh 的整体架构如上图所展示,可以自上而下分为三个部分:

  • 用户输入和观测的部分。用户输入以用户操作 (User) 为起点到达 Kubernetes API Server。用户不直接和 Chaos Mesh 的 Controller 交互,一切用户操作最终都将反映为某个 Chaos 资源的变更(比如 NetworkChaos 资源的变更)。

  • 监听资源变化、调度 Workflow 和开展混沌实验的部分。Chaos Mesh 的 Controller 只接受来自 Kubernetes API Server 的事件,这种事件描述某个 Chaos 资源的变更,例如新的 Workflow 对象或者 Chaos 对象被创建。

  • 具体节点故障的注入部分。该部分主要由 Chaos Daemon 组件负责,接受来自 Chaos Controller Manager 组件的指令,侵入到目标 Pod 的 Namespace 下,执行具体的故障注入。例如设置 TC 网络规则,启动 stress-ng 进程抢占 CPU 或内存资源等。


图片

Chaos-mesh 基本功能


故障注入

故障注入是混沌实验的核心。Chaos Mesh 充分考虑分布式系统可能出现的故障,提供全面、细粒度的故障类型,分为基础资源类型故障、平台类型故障和应用层故障三大类。

  • 基础资源类型故障:

o  PodChaos:模拟 Pod 故障,例如 Pod 节点重启、Pod 持续不可用,以及特定 Pod 中的某些容器故障。

o  NetworkChaos:模拟网络故障,例如网络延迟、网络丢包、包乱序、各类网络分区。

o  DNSChaos:模拟 DNS 故障,例如 DNS 域名解析失败、返回错误 IP 地址。

o  HTTPChaos:模拟 HTTP 通信故障,例如 HTTP 通信延迟。

o  StressChaos:模拟 CPU 抢占或内存抢占场景。

o  IOChaos:模拟具体某个应用的文件 I/O 故障,例如 I/O 延迟、读写失败。

o  TimeChaos:模拟时间跳动异常。

o  KernelChaos:模拟内核故障,例如应用内存分配异常。

  • 平台类型故障:

o  AWSChaos:模拟 AWS 平台故障,例如 AWS 节点重启。

o  GCPChaos:模拟 GCP 平台故障,例如 GCP 节点重启。

  • 应用层故障:

o  JVMChaos:模拟 JVM 应用故障,例如函数调用延迟。


图片

可视化操作


Chaos Mesh 为用户提供了单独的 Chaos Dashboard 组件,即可视化支持。Chaos Dashboard 极大地简化了混沌实验,用户可以直接通过可视化界面来管理和监控混沌实验,仅需点一点鼠标就能够定义混沌实验的范围、指定混沌注入的类型、定义调度规则,以及在界面上获取到混沌实验的结果等。


图片


图片

安全保障


Chaos Mesh通过 Kubernetes 原生的RBAC基于角色的权限控制)功能对权限进行管理。用户可以根据实际的权限需求自由地创建多种 Role,然后绑定到用户名Service Account上,最后生成 Service Account 对应的 Token。用户使用该 Token 登陆 Dashboard,只能在该Service Account允许的权限范围内进行 Chaos 实验。此外 Chaos Mesh 还支持通过设置Namespace-Annotation 的方式开启特定Namespace下混沌实验的权限,进一步保障混沌实验的可控性。

Chaos-Mesh 安装及部署

首先在这里使用的是基本Minikube搭建的k8s集群,徒手搭建过k8s的同学都晓得其中的煎熬,复杂的认证,配置环节相当折磨人,出错率相当高,而Minikube就是为解决这个问题而衍生出来的工具,它基于go语言开发,可以在单机环境下快速搭建可用的k8s集群,非常适合测试和本地开发,现有的大部分在线k8s实验环境也是基于Minikube。

Minikube需要本地的虚拟机作为载体,这里使用的是VirtualBox创建的本地虚拟机环境。它可以用kubectl工具作为控制单元操作Minikube。


图片


使用二进制下载在x86-64 macOS上安装最新的 Minikube稳定版本:

图片


启动集群:

图片


与集群的交互工具kubectl:

1.下载最新版本的kubectl:

curl-LO https://storage.googleapis.com/kubernetes-release/release/$(curl-s https://storage.googleapis.com/kubernetes-release/release/stable.txt)/bin/linux/amd64/kubectl

2. 使kubectl二进制可执行

图片

3. 将二进制文件移动到PATH中

图片

这里要强调的是kubectl的版本需要与Minikube对应k8s的版本相差在两个小版本号之内,不然可能造成kubectl无法与Minikube交互的情况。

创建Chaos-mesh混沌实验(通过yaml文件方式创建)

以模拟网络故障为例,新建一个包含如下配置示例的 network-delay.yaml 文件。


图片


示例YAML文件中定义了一个持续12s的网络延迟故障,实验目标是default namespace下带有“app”:“web-show”标签的应用。

使用 kubectl apply -f 命令创建并运行此混沌实验:

图片


混沌实验开始后,如需检查混沌实验的运行状况,请使用kubectl describe命令查看此混沌实验对象的status或是event。

图片


创建Chaos-mesh混沌实验(通过dashboard面板创建)

以模拟CPU负载为例,点击NEW EXPERIMENT,选择STRESS TEST(注意哦,这里可不是指的性能测试中的概念)


图片


输入个CPU worker数量以及CPU负载百分比。然后点击提交。

紧接着选择实验目标。这里使用的是label_selector。然后点两次提交。


图片


然后到相应的POD所在的进程中查看CPU使用率。


图片


可以看到这个工具是直接启动了一个叫stress-ng-cpu的进程。通过这个名字,我们就能理解,这就是用stress-ng这个工具启动一个进程。利用新的进程把CPU消耗掉。

综上所述,通过Chaos-mesh这样一套主动找出系统中脆弱环节的方法学混沌测试工具,可以通过实证的验证方法为我们打造更具弹性的系统。同时让我们更透彻的掌控系统运行时的各种行为规律。让我们能够在不断打造更具弹性(系统应对故障,从故障中恢复的能力)系统的同时,树立运行高可用分布式系统的信息。


图片


作者:王新宇,测试实习生,主要负责测试自动化脚本和部分质量平台服务端。



关于 GrowingIO

作为国内领先的一站式数据增长引擎整体方案服务商,GrowingIO以数据智能分析为核心,通过构建客户数据平台,打造增长营销闭环,帮助企业提升数据驱动能力,赋能商业决策、实现业务增长

GrowingIO专注于零售、电商、保险、酒旅航司、教育、内容社区等行业,成立以来,累计服务超过1500家企业级客户,获得LVMH集团、百事、达能、老佛爷百货、戴尔、lululemon、美素佳儿、宜家、乐高、美的、海尔、安踏、汉光百货、上汽集团、广汽蔚来、理想汽车、招商仁和人寿、飞鹤、红星美凯龙、东方航空、滴滴、新东方、喜茶、每日优鲜、奈雪的茶、永辉超市等客户的青睐。

招聘信息

GrowingIO技术团队是一个活力四射、对技术充满激情的团队,多个岗位持续招聘中!诚招前端工程师/大数据工程师/Java工程师等,欢迎有兴趣的同学投递简历至:jianli@growingio.com(邮件标题请注明具体岗位名称),更多职位及信息可进入招聘官网查看。

图片


点击「阅读原文」获取 GrowingIO 15 天免费试用!

↓↓↓

继续滑动看下一个
GrowingIO技术团队
向上滑动看下一个