混沌工程 ChaosBlade 网络故障模拟 - 实战
引言
在之前的文章中,我们详细介绍了 ChaosBlade 中 CPU 和 磁盘 故障的实现原理。本文将重点介绍模拟网络故障的实际操作,其中包括网络丢包,乱序,延迟的模拟以及域名解析失败模拟等等,在下一篇文章中会具体讲解网络故障模拟的实现原理。
目前 ChaosBlade 已支持的基础资源类故障场景如下:
介绍
网络故障在现实生活中是比较常见的一种故障,当出现网络故障时会导致应用出现多种问题,这些问题可能影响用户体验、数据完整性和系统性能,例如:
这些问题不仅影响用户体验,还可能对业务运营造成实质性损害。因此,确保网络稳定性和制定应急响应方案是应用开发和维护中的重要环节。
网络故障模拟是现代应用开发和运维中的一个关键实践,其重要性体现在多个方面:
综上所述,网络故障模拟不仅有助于提升应用的可靠性和用户体验,还能确保数据安全、提高系统弹性、增强团队应急响应能力,以及支持业务连续性和灾备计划的实施。因此,在应用开发和运维过程中,定期进行网络故障模拟测试是非常重要的。
下面将介绍 ChaosBlade 项目中模拟网络故障的使用方式和底层实现,项目地址: github.com/chaosblade-…
ChaosBlade 网络故障模拟
功能介绍
目前 ChaosBlade 支持的网络故障场景,包括
安装与使用
首先,您可以从 ChaosBlade GitHub 仓库 下载 ChaosBlade Tool 工具包,并将其解压到目标机器上,然后执行相应的命令来模拟网络故障。
网络延迟故障
以网络延迟故障举例,数据包故障基本都类似,可以指定网卡、本地端口、远程端口、目标 IP 延迟。需要特别注意,如果不指定端口、ip 参数,而是整个网卡延迟,切记要添加 --timeout 参数或者 --exclude-port 参数,前者是指定运行时间,自动停止销毁实验,后者是指定排除掉的延迟端口,两者都是防止因延迟时间设置太长,造成机器无法连接的情况,如果真实发生此问题,重启机器即可恢复。
本地端口和远程端口之间是或的关系,即这两个端口都会发生延迟,只要指定了本地端口或者远程端口,无需指定需要排除的端口。端口与 IP 之间是与的关系,即指定的 IP:PORT 发生延迟。
参数
--destination-ip string 目标 IP. 支持通过子网掩码来指定一个网段的 IP 地址, 例如 192.168.1.0/24. 则 192.168.1.0~192.168.1.255 都生效。你也可以指定固定的 IP,如 192.168.1.1 或者 192.168.1.1/32,也可以通过都号分隔多个参数,例如 192.168.1.1,192.168.2.1。
--exclude-port string 排除掉的端口,默认会忽略掉通信的对端端口,目的是保留通信可用。可以指定多个,使用逗号分隔或者连接符表示范围,例如 22,8000 或者 8000-8010。 这个参数不能与 --local-port 或者 --remote-port 参数一起使用
--exclude-ip string 排除受影响的 IP,支持通过子网掩码来指定一个网段的 IP 地址, 例如 192.168.1.0/24. 则 192.168.1.0~192.168.1.255 都生效。你也可以指定固定的 IP,如 192.168.1.1 或者 192.168.1.1/32,也可以通过都号分隔多个参数,例如 192.168.1.1,192.168.2.1。
--interface string 网卡设备,例如 eth0 (必要参数)
--local-port string 本地端口,一般是本机暴露服务的端口。可以指定多个,使用逗号分隔或者连接符表示范围,例如 80,8000-8080
--offset string 延迟时间上下浮动的值, 单位是毫秒
--remote-port string 远程端口,一般是要访问的外部暴露服务的端口。可以指定多个,使用逗号分隔或者连接符表示范围,例如 80,8000-8080
--time string 延迟时间,单位是毫秒 (必要参数)
--force 强制覆盖已有的 tc 规则,请务必在明确之前的规则可覆盖的情况下使用
--ignore-peer-port 针对添加 --exclude-port 参数,报 ss 命令找不到的情况下使用,忽略排除端口
--timeout string 设定运行时长,单位是秒,通用参数
案例
# 访问本机 8080 和 8081 端口延迟 3 秒,延迟时间上下浮动 1 秒
blade create network delay --time 3000 --offset 1000 --interface eth0 --local-port 8080,8081
{"code":200,"success":true,"result":"9b4aa9fabe073624"}
# 可以在另一台相同网络内的机器通过 telnet 命令验证,即 telnet xxx.xxx.xxx.xxx 8080
# 销毁实验
blade destroy 9b4aa9fabe073624
# 本机访问外部 14.215.177.39 机器(ping www.baidu.com 获取到的 IP)80 端口延迟 3 秒
blade create network delay --time 3000 --interface eth0 --remote-port 80 --destination-ip 14.215.177.39
# 可在本机通过 telnet 14.215.177.39 80 命令验证
# 对整个网卡 eth0 做 5 秒延迟,排除 22 和 8000 到 8080 端口
blade create network delay --time 5000 --interface eth0 --exclude-port 22,8000-8080
# 会发现 22 端口和 8000 到 8080 端口不受影响,可在另一台相同网络内的机器通过分别 telnet xxx.xxx.xxx.xxx 8080 和 telnet xxx.xxx.xxx.xxx 8081 进行测试
DNS 篡改故障
此实验会修改本地的 hosts,篡改域名地址映射。
网络丢包场景主要验证域名解析异常的情况下,系统的自我容错能力。
参数
--domain string 域名 (必要参数)
--ip string 映射的 ip (必要参数)
--timeout string 设定运行时长,单位是秒,通用参数
案例
# www.baidu.com 域名不可访问
blade create network dns --domain www.baidu.com --ip 10.0.0.0
{"code":200,"success":true,"result":"9e7a168079c68fad"}
# 使用 ping www.baidu.com 来验证,会发现访问不通。
端口占用故障
本地端口占用,验证端口已被占用的情况下,使用此端口的业务容错能力
参数
--port string 指定被占用的端口,(必填项)
--force 强制占用此端口,会将已使用此端口的进程杀掉
--timeout string 设定运行时长,单位是秒,通用参数
案例
# 指定 8080 端口占用
blade c network occupy --port 8080 --force
# 命令执行前
netstat -tanp | grep 8080
tcp 0 0 0.0.0.0:8080 0.0.0.0:* LISTEN 19562/java
# 命令执行后
netstat -tanp | grep 8080
tcp6 0 0 :::8080 :::* LISTEN 20041/chaos_occupyn
网络屏蔽故障
网络屏蔽实验场景,同网络丢包 100%。两者的区别是底层实现机制不一样,网络屏蔽只支持端口,不支持整个网卡,具有局限性,建议使用网络丢包 100% 来替代此命令。
参数
--source-ip string 数据报文的源IP地址
--destination-ip string 数据报文的目的IP地址
--source-port string 数据报文的源端口
--destination-port string 数据报文的目的端口
--string-pattern string 报文中包含的字符串
--network-traffic 网络流量方向,支持in,out
案例
# 阻止来自源ip 10.10.10.10的连接
blade create network drop --source-ip 10.10.10.10 --network-traffic in
# 阻止到目的ip 10.10.10.10的传入连接
blade create network drop --destination-ip 10.10.10.10 --network-traffic in
# 阻止来自端口80的传入连接
blade create network drop --source-port 80 --network-traffic in
# 在端口80上阻止到特定域的传出连接
blade create network drop --destination-port 80 --string-pattern baidu.com --network-traffic out
总结
通过本文,我们详细介绍了在 ChaosBlade 中模拟各种网络故障的实际操作,包括网络丢包、乱序、延迟以及域名解析失败等场景。网络故障在现实应用中时有发生,可能导致用户体验下降、数据不完整和系统性能问题,因此,提前模拟和测试这些故障场景显得尤为重要。
网络故障模拟不仅能帮助提升应用的可靠性和用户体验,还能确保数据安全、提高系统弹性、增强团队的应急响应能力,并支持业务连续性和灾备计划的实施。ChaosBlade 作为一款强大的混沌工程工具,为我们提供了灵活而全面的网络故障模拟能力,帮助开发和运维团队提前发现和解决潜在问题,确保系统在面对真实故障时能够迅速恢复。
在实际操作中,通过正确配置 ChaosBlade 的各项参数,我们可以精细化地模拟特定网络故障场景,并及时评估和改进系统的容错能力和恢复能力。希望本文的介绍能帮助读者更好地理解和应用 ChaosBlade 进行网络故障模拟,为构建更稳定和可靠的应用系统提供有力支持。
转载自:https://juejin.cn/post/7371340620345294886