作者 | 肖长军(穹谷)阿里云智能事业群技术专家

导读:随着云原生系统的演进,如何保障系统的稳定性受到很大的挑战,混沌工程通过反脆弱思想,对系统注入故障,提前发现系统问题,提升系统的容错能力。ChaosBlade 工具可以通过声明式配置执行混沌实验,简单高效。本文将会重点介绍 ChaosBlade 以及云原生相关的实验场景实践。

ChaosBlade 介绍

ChaosBlade 是阿里巴巴开源的一款遵循混沌实验模型的混沌实验执行工具,具有场景丰富度高、简单易用等特点,而且可以很方便的扩展实验场景,开源后不久就被加入到 CNCF Landspace 中,成为主流的一款混沌工具。

实验场景

目前支持的实验场景如下:

  • 基础资源场景:CPU 负载、内存占用、磁盘 IO 负载、磁盘占用、网络延迟、网络丢包、网络屏蔽、域名不可访问、shell 脚本篡改、杀进程、进程 Hang、机器重启等;
  • 应用服务场景:支持 Java 应用和 C 应用内的实验场景。Java 的场景组件丰富,例如支持 Dubbo、RocketMQ、HttpClient、Servlet、Druid等,而且支持编写 Java 或 Groovy 脚本实现复杂的实验场景;
  • 容器服务场景:支持 Kubernetes 和 Docker 服务,包含 node、pod 和 container 三种资源的实验场景,例如 Pod 网络延迟、丢包等。

混沌实验模型

以上所有的实验场景都遵循混沌实验模型,此模型共分为四层,包含:

  • Target:实验靶点。指实验发生的组件,如容器、应用框架(Dubbo、Redis)等;
  • Scope:实验实施的范围。指具体触发实验的机器或者集群等;
  • Matcher:实验规则匹配器。根据所配置的 Target,定义相关的实验匹配规则,可以配置多个。由于每个 Target 可能有各自特殊的匹配条件,比如 RPC 领域的 Dubbo,可以根据服务提供者提供的服务和服务消费者调用的服务进行匹配,缓存领域的 Redis,可以根据 set、get 操作进行匹配;
  • Action:指实验模拟的具体场景,Target 不同,实施的场景也不一样,比如磁盘,可以演练磁盘满,磁盘 IO 读写高等。如果是应用,可以抽象出延迟、异常、返回指定值(错误码、大对象等)、参数篡改、重复调用等实验场景。

比如一台 IP 是 10.0.0.1 机器上的应用,调用 com.example.HelloService@1.0.0 Dubbo 服务延迟 3s,基于此模型可以描述为对 Dubbo 组件(Target)进行实验,实验实施的范围是 10.0.0.1 主机(Scope),调用 com.example.HelloService@1.0.0 (Matcher)服务延迟 3s(Action),对应的 chaosblade 命令为:

blade create dubbo delay --time 3000 --service com.example.HelloService --version 1.0.0

所以此模型很简单清晰的表达出实验场景,易于理解。下文中的云原生实验场景也基于此模型定义。

面向云原生的实验场景

实现方案

将混沌实验场景按照上述的实验模型,定义为 Kubernetes 中的资源,并通过自定义控制器来管理,可以通过 Yaml 配置或者直接执行 blade 命令执行。

ChaosBlade Operator 定义了资源控制器,并且会以 daemonset 的方式,在每个节点上部署一个 chaosblade-tool pod 来执行混沌实验。不同的实验场景内部实现方式不同,比如 Node 实验场景,其上面部署的 chaosblade-tool 内部执行即可,而 Container 内的实验场景,控制器会将 chaosblade 包拷贝到目标 Container 中执行。

使用方式

安装必要组件

安装 ChaosBlade Operator,可通过地址下载 chaosblade-operator-0.0.1.tgz,使用以下命令安装:

helm install --namespace kube-system --name chaosblade-operator chaosblade-operator-0.0.1.tgz

安装在 kube-system 命令空间下。ChaosBlade Operator 启动后会在每个节点部署 chaosblade-tool Pod 和一个 chaosblade-operator Pod。可通过以下命令查看安装结果:

kubectl get pod -n kube-system -o wide | grep chaosblade

执行实验

执行方式有两种:

  • 一种是通过配置 yaml 方式,使用 kubectl 执行;
  • 另一种是直接使用 chaosblade 包中的 blade 命令执行。

下面以指定一台节点,做 CPU 负载 80% 实验举例。

yaml 配置方式

apiVersion: chaosblade.io/v1alpha1
kind: ChaosBlade
metadata:name: cpu-load
spec:experiments:- scope: nodetarget: cpuaction: fullloaddesc: "increase node cpu load by names"matchers:- name: namesvalue:- "cn-hangzhou.192.168.0.205"- name: cpu-percentvalue:- "80"

如上所示,配置好文件后,保存为 chaosbladecpuload.yaml,使用以下命令执行实验场景:

kubectl apply -f chaosblade_cpu_load.yaml

可通过以下命令查看每个实验的执行状态:

kubectl get blade cpu-load -o json

查看更多实验场景配置事例。

blade 命令执行方式

下载 chaosblade 工具包,解压即可使用。还是上述例子,使用 blade 命令执行如下:

blade create k8s node-cpu fullload --names cn-hangzhou.192.168.0.205 --cpu-percent 80 --kubeconfig ~/.kube/config

使用 blade 命令执行,会返回实验的执行结果。

修改实验

yaml 配置文件的方式支持场景动态修改,比如将上述的 cpu 负载调整为 60%,则只需将上述 value 的值从 80 改为 60 即可,例如:

apiVersion: chaosblade.io/v1alpha1
kind: ChaosBlade
metadata:name: cpu-load
spec:experiments:- scope: nodetarget: cpuaction: loaddesc: "cpu load"flags:- name: cpu-percentvalue: "60"- name: ipvalue: 192.168.0.34

然后使用 kubeclt apply -f chaosblade_cpu_load.yaml 命令执行更新即可。

停止实验

可以通过以下三种方式停止实验:

根据实验资源名停止

比如上述 cpu-load 场景,可以执行以下命令停止实验:

kubectl delete chaosblade cpu-load

通过 yaml 配置文件停止

指定上述创建好的 yaml 文件进行删除,命令如下:

kubectl delete -f chaosblade_cpu_load.yaml

通过 blade 命令停止

此方式仅限使用 blade 创建的实验,使用以下命令停止:

blade destroy <UID>

是执行 blade create 命令返回的结果,如果忘记,可使用 blade status --type create 命令查询。

卸载 chaosblade operator

执行 helm del --purge chaosblade-operator 卸载即可,将会停止全部实验,删除所有创建的资源。

总结

ChaosBlade 基于混沌实验模型,友好地将 Kubernetes 资源控制结合,部署简单而且使用简洁,实验可控。除此之外 ChaosBlade 基于实验模型实现了很多领域场景执行器,可以很方便的扩展实验场景,可详见附录中的项目列表。

社区共建

ChaosBlade 自开源以来,共有近 30 多位贡献者加入和很多企业的关注及使用,非常感谢各位。同时非常欢迎更多的人参与进来,使 ChaosBlade 变的更加强大,覆盖更多的场景,成为各个企业稳定的、通用的混沌工程工具。

贡献的形式可以是提 bug、提交代码、编写文档、补充单元测试、参与问题讨论等等。ChaosBlade 相信:开源世界中,任何帮助都是贡献。

附录

项目列表如下:

  • ChaosBlade CLI(调用入口)
  • ChaosBlade 实验模型定义
  • 基础资源场景执行器
  • Docker 场景执行器
  • Kubernetes 场景执行器
  • Java 应用场景执行器
  • C 应用场景执行器

“ 阿里巴巴云原生微信公众号(ID:Alicloudnative)关注微服务、Serverless、容器、Service Mesh等技术领域、聚焦云原生流行技术趋势、云原生大规模的落地实践,做最懂云原生开发者的技术公众号。”

面向云原生的混沌工程工具-ChaosBlade相关推荐

  1. 云原生 | 混沌工程工具 ChaosBlade Operator Pod 篇(文末赠书)

    作者:丁源 RadonDB 测试负责人 负责 RadonDB 云数据库.容器化数据库的质量性能测试,迭代验证.对包括云数据库以及容器化数据库性能和高可用方案有深入研究. 继<混沌工程工具 Cha ...

  2. 阿里开源混沌工程工具 ChaosBlade

    开发四年只会写业务代码,分布式高并发都不会还做程序员? >>>   近日,阿里开源了混沌工程工具 ChaosBlade.该项目是遵循混沌工程(Chaos Engineering)原理 ...

  3. 借助混沌工程工具 ChaosBlade 构建高可用的分布式系统

    为什么80%的码农都做不了架构师?>>>    在分布式架构环境下,服务间的依赖日益复杂,可能没有人能说清单个故障对整个系统的影响,构建一个高可用的分布式系统面临着很大挑战.在可控范 ...

  4. 六年打磨!阿里开源混沌工程工具 ChaosBlade

    阿里妹导读:减少故障的最好方法就是让故障经常性的发生.通过不断重复失败过程,持续提升系统的容错和弹性能力.今天,阿里巴巴把六年来在故障演练领域的创意和实践汇浓缩而成的工具进行开源,它就是 " ...

  5. 干货 | 阿里巴巴混沌测试工具ChaosBlade两万字解读

    点击上方"方志朋",选择"设为星标" 做积极的人,而不是积极废人 一.前言 ChaosBlade 是一款遵循混沌工程实验原理,建立在阿里巴巴近十年故障测试和演练 ...

  6. 深度 | 面向云原生数据湖的元数据管理技术解析

    简介: 作者:沐远.明惠 背景 数据湖当前在国内外是比较热的方案,MarketsandMarkets市场调研显示预计数据湖市场规模在2024年会从2019年的79亿美金增长到201亿美金.一些企业已经 ...

  7. CODING —— 云原生时代的研发工具领跑者

    本文为 CODING 创始人兼 CEO 张海龙在腾讯云 CIF 工程效能峰会上所做的分享. 文末可前往峰会官网,观看回放并下载 PPT. 大家上午好,很高兴能有机会与大家分享 CODING 最近的一些 ...

  8. 混沌工程工具-阿里ChaoBlade的原理与安装模拟CPUIO异常

    混沌工程工具-阿里ChaoBlade的原理与安装模拟CPU&IO异常 1.概述 从这篇文章开始,介绍一个有趣的测试工程它就是混沌工程. 2.混沌工程介绍 2.1.混沌工程定义 英文原著定义 根 ...

  9. ChaosBlade混沌工程工具

    目录 ChaosBlade介绍 使用步骤 blade命令介绍 适用的场景 基础资源类故障 网络类故障 进程类故障 java语言类故障 shell脚本类故障 HTTP类故障 RPC类故障 servlet ...

最新文章

  1. 《敏捷制造——敏捷集成基础结构设计》——1.2相关问题的国内外研究现状
  2. Samba常用配置及GUEST访问
  3. 狂风暴雨——电闪雷鸣篇:数据流层核心思想揭秘
  4. TextBox和DataGridView控件的事件发生顺序
  5. Day 1 二分搜索训练总结
  6. linux添加cmd命令行参数,Windows 终端命令行参数 | Microsoft Docs
  7. 阿里如何实现100%容器化镜像化?八年技术演进之路回顾 1
  8. 实现流水灯以间隔500ms的时间闪烁(系统定时器SysTick实现的精确延时)
  9. 数据挖掘在呼叫中心的六大应用点
  10. 关于prototype使用位置问题的讨论
  11. 【华为敏捷/DevOps实践】4. 如何从Excel做项目管理的方式中走出来
  12. LibcarePlus用户态程序热补丁
  13. LeetCode学习记录(4-6)
  14. gis 空间分析 鸟类栖息地选取_鸟类的栖息地选择
  15. c语言知道坐标求圆面积,用C语言编程推算圆的面积公式
  16. 【PTA~L1-080 乘法口诀数列】
  17. numpy和pandas简单使用
  18. html css 基本词汇
  19. JavaWeb程序设计———名片管理系统
  20. html 获取下一个兄弟节点,JS/JQuery获取当前元素的上一个/下一个兄弟级元素等元素的方法...

热门文章

  1. MySQL DELETE:删除数据
  2. 16、Java Swing JProgressBar:进度条组件
  3. 18、INSERT:插入数据(添加数据)
  4. 检查表单元素的值是否为空
  5. 1031 Hello World for U (20 分)【难度: 一般 / 知识点: 找规律】
  6. 【es6】谈谈Promise
  7. JSTL标签显示分页
  8. 用这样的方法,我解决了leetcode的大部分的这种题型!
  9. Java多线程面试准备:聊聊Executor框架
  10. idea + Maven + Spring + myBatis的单元测试