一、前言
很久之前曾基于linux内核自带的TC和netem模拟一些公网中遇到的极端情况(延迟、丢包、重复、损坏和乱序等),验证了我们传输程序的健壮性!
具体细节可见这篇老博客: https://blog.csdn.net/u013128262/article/details/84784663
最近在复现kafka生产端一个timeout异常场景时,发现之前方案时因为内核和OS版本问题有些差异而无法直接使用老的命令,便把目光迅速调整到阿里开源的这款混沌工程新贵ChaosBlade(https://github.com/chaosblade-io/chaosblade
)。
二、ChaosBlade简介
ChaosBlade 是阿里巴巴开源的一款遵循混沌工程原理和混沌实验模型的实验注入工具,帮助企业提升分布式系统的容错能力,并且在企业上云或往云原生系统迁移过程中业务连续性保障。
ChaosBlade 不仅使用简单,而且支持丰富的实验场景,场景包括:
- 基础资源:比如 CPU、内存、网络、磁盘、进程等实验场景;
- Java 应用:比如数据库、缓存、消息、JVM 本身、微服务等,还可以指定任意类方法注入各种复杂的实验场景;
- C++ 应用:比如指定任意方法或某行代码注入延迟、变量和返回值篡改等实验场景;
- Docker 容器:比如杀容器、容器内 CPU、内存、网络、磁盘、进程等实验场景;
- 云原生平台:比如 Kubernetes 平台节点上 CPU、内存、网络、磁盘、进程实验场景,Pod 网络和 Pod 本身实验场景如杀 Pod,容器的实验场景如上述的 Docker 容器实验场景;
ChaosBlade还提供混沌实验管理工具,包含创建实验、销毁实验、查询实验、实验环境准备、实验环境撤销等命令,是混沌实验的执行工具,执行方式包含 CLI 和 HTTP 两种。提供完善的命令、实验场景、场景参数说明,操作简洁清晰。
所以ChaosBlade是可以非常方便地支持网络故障模拟场景!
三、使用ChaosBlade实现网络故障模拟
Talk is cheap,just do it!
1、下载程序包
直接从github上下载最新的程序包: https://github.com/chaosblade-io/chaosblade/releases
2、ChaosBlade支持的网络故障实验
[$] <> ./blade create network -h
Network experiment
Usage:
blade create network [flags]
blade create network [command]
Examples:
network delay --interface eth0 --time 3000
# You can execute "blade query network interface" command to query the interfaces
Available Commands:
corrupt Corrupt experiment
delay Delay experiment
dns Dns experiment
drop Drop experiment
duplicate Duplicate experiment
loss Loss network package
occupy Occupy the specify port
reorder Reorder experiment
Flags:
-h, --help help for network
Global Flags:
-d, --debug Set client to DEBUG mode
--uid string Set Uid for the experiment, adapt to docker
从helper看出ChaosBlade支持一下网络故障模拟:
- corrupt Corrupt experiment 网络包损坏实验场景
- delay Delay experiment 网络延迟实验场景
- dns Dns experiment 篡改 dns 域名解析实验场景
- drop Drop experiment 网络屏蔽实验场景
- duplicate Duplicate experiment 网络屏蔽只支持端口,不支持整个网卡,具有局限性,建议使用网络丢包 100% 来替代此命令
- loss Loss network package 网络丢包实验场景
- occupy Occupy the specify port 网络本地端口占用
- reorder Reorder experiment 网络包重排序实验场景
更多操作详见官方入门手册: https://github.com/chaosblade-io/chaosblade/wiki/%E6%96%B0%E6%89%8B%E6%8C%87%E5%8D%97
3、使用网络丢包实验场景
复现kafka生产端timeout场景的话,直接使用最常用的网络丢包实验即可。
Loss network package
支持的参数:
--destination-ip string destination ip. Support for using mask to specify the ip range such as 92.168.1.0/24 or comma separated multiple ips, for example 10.0.0.1,11.0.0.1.
--exclude-ip string Exclude ips. Support for using mask to specify the ip range such as 92.168.1.0/24 or comma separated multiple ips, for example 10.0.0.1,11.0.0.1
--exclude-port string Exclude local ports. Support for configuring multiple ports, separated by commas or connector representing ranges, for example: 22,8000. This flag is invalid when --local-port or --remote-port is specified
--force Forcibly overwrites the original rules
--ignore-peer-port ignore excluding all ports communicating with this port, generally used when the ss command does not exist
--interface string Network interface, for example, eth0 (required)
--local-port string Ports for local service. Support for configuring multiple ports, separated by commas or connector representing ranges, for example: 80,8000-8080
--percent string loss percent, [0, 100] (required)
--remote-port string Ports for remote service. Support for configuring multiple ports, separated by commas or connector representing ranges, for example: 80,8000-8080
--timeout string set timeout for experiment
我们实际的一个demo:
# eth0发往远端9092端口的数据包将持续120s丢包5%
blade create network loss --percent 5 --interface eth0 --remote 9092 --timeout 120
执行完会有一个状态返回值:
{"code":200,"success":true,"result":"5cbde40d2594f891"}
通过status
参数可以查询到实际的状态
blade status 5cbde40d2594f891
四、实现分析
ChaosBlade功能强大,并且提供了便捷的使用接口和管理工具。
作为一个技术人不但要用好工具,更要了解工具的运行原理!
ChaosBlade基础资源相关的实现都在chaosblade-exec-os这个模块。
我们先看看程序入口:
https://github.com/chaosblade-io/chaosblade-exec-os/blob/master/exec/network_loss.go
此处主要还是一些业务逻辑,没有核心实现。
https://github.com/chaosblade-io/chaosblade-exec-os/blob/master/exec/bin/tcnetwork/tcnetwork.go
不难看出ChaosBlade在网络故障模拟底层技术仍然是TC和netem这2大杀器。