专栏
天翼云开发者社区

混沌工具ChaosBlade使用经验 -(基础资源和云原生部分)

2023-07-26 18:17:53 203阅读

1. 工具介绍

ChaosBlade是阿里一款简单易用,专注于系统注入混沌实验的开源工具(下载地址),支持的场景如下图所示:

2. 使用经验总结

    本章节主要介绍日常混沌测试工作总结,主要包含基础资源和云原生层面的混沌实验触发和验证方式

2.1 基础资源混沌实验触发

模拟Disk IO冲高
<实验命令>
./blade create disk burn --write --read --size 10 --timeout <设置实验超时时间>

<验证>
使用top命令查看WA指数变化

模拟Disk满载
./blade create disk fill --path <磁盘路径,不填默认为/> --percent 50 --timeout 60

<验证>
使用df -lh查看磁盘空间变化

模拟CPU满载
<实验命令>
./blade create cpu fullload #CPU满载
./blade create cpu load --cpu-percent 50 --timeout 200

<验证>
使用top查看CPU idle指数

模拟内存冲高
<实验命令>
# 占用 50% 的内存,燃烧速率为100M/s,避免chaosblade实验进程被杀掉,实验持续200s
blade create mem load --mode ram --mem-percent 50 --rate 100 --avoid-being-killed --timeout 200
# 保留200M内存, 燃烧速率为1000M/s
blade create mem load --mode ram --reserve 200 --rate 1000

<验证>
使用free -g命令查看内存情况

模拟网络延迟
<实验命令>
# 访问本机 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

<实验命令>
# 本机访问外部 xxx.xxx.xxx.xxx 机器(ping www.baidu.com 获取到的 IP)80 端口延迟 3 秒
blade create network delay --time 3000 --interface eth0 --remote-port 80 --destination-ip xxx.xxx.xxx.xxx

<验证>
# 可在本机通过 telnet xxx.xxx.xxx.xxx 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域名

<实验命令>
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 来验证,会发现访问不通。

模拟网络丢包

<实验命令>
# 访问本机 8080 和 8081 端口丢包率 70%
blade create network loss --percent 70 --interface eth0 --local-port 8080,8081 {"code":200,"success":true,"result":"b1cea124e2383848"}

<验证>
# 可以在另一台相同网络内的机器通过 curl 命令验证,即 curl xxx.xxx.xxx.xxx:8080,不使用 telnet 的原因是 telnet 内部有重试机制,影响实验验证。如果将 percent 的值设置为 100,可以使用 telnet 验证。


<实验命令>
# 本机访问外部 xxx.xxx.xxx.xxx 机器(ping www.baidu.com 获取到的 IP)80 端口丢包率 100%
blade create network loss --percent 100 --interface eth0 --remote-port 80 --destination-ip xxx.xxx.xxx.xxx

<验证>
# 可在本机通过 curl xxx.xxx.xxx.xxx 命令验证,会发现访问不通,执行 curl <其他有效IP> 是通的。

<实验命令>
# 对整个网卡 eth0 做 60% 的丢包,排除 22 和 8000到8080 端口
blade create network loss --percent 60 --interface eth0 --exclude-port 22,8000-8080

<验证>
# 会发现 22 端口和 8000 到 8080 端口不受影响,可在另一台相同网络内的机器通过分别执行多次 curl xxx.xxx.xxx.xxx:8080 和 telnet xxx.xxx.xxx.xxx:8081 进行测试

<实验命令>
# 实现整个网卡不可访问,不可访问时间 20 秒。执行完成下面命令后,当前的网络会中断掉,20 秒后恢复
blade create network loss --percent 100 --interface eth0 --timeout 20(一定要设置超时时间自动销毁混沌实验,否则需要重启机器才能恢复网络)

<验证>
eth0的网络会中断,无法通过该网卡访问

模拟网络包损坏

<实验命令>
# 访问指定的 ip 请求包损坏,百分比 80%
blade create network corrupt --percent 80 --destination-ip xxx.xxx.xxx.xxx --interface eth0

<验证>
ping xxx.xxx.xxx.xxx
64 bytes from xxx.xxx.xxx.xxx: icmp_seq=100 ttl=50 time=9.75 ms
64 bytes from xxx.xxx.xxx.xxx: icmp_seq=101 ttl=50 time=9.94 ms
64 bytes from xxx.xxx.xxx.xxx: icmp_seq=102 ttl=50 time=9.76 ms
64 bytes from xxx.xxx.xxx.xxx: icmp_seq=107 ttl=50 time=9.80 ms
64 bytes from xxx.xxx.xxx.xxx: icmp_seq=109 ttl=50 time=9.71 ms
64 bytes from xxx.xxx.xxx.xxx: icmp_seq=111 ttl=50 time=10.2 ms
64 bytes from xxx.xxx.xxx.xxx: icmp_seq=118 ttl=50 time=9.72 ms
64 bytes from xxx.xxx.xxx.xxx: icmp_seq=119 ttl=50 time=9.94 ms
64 bytes from xxx.xxx.xxx.xxx: icmp_seq=120 ttl=50 time=10.0 ms
64 bytes from xxx.xxx.xxx.xxx: icmp_seq=121 ttl=50 time=9.86 ms
64 bytes from xxx.xxx.xxx.xxx: icmp_seq=122 ttl=50 time=9.76 ms
可以看出执行命令后 icmp_seq=102 开始出现包丢失的情况,执行恢复命令后,从 icmp_seq=118 开始正常

模拟网络包重排

<实验命令>
# 访问指定的 ip 请求包乱序
blade c network reorder --correlation 80 --percent 50 --gap 2 --time 500 --interface eth0 --destination-ip 192.168.0.1

<验证>
ping 192.168.0.1 -A

PING 192.168.0.1 (192.168.0.1) 56(84) bytes of data.
64 bytes from 192.168.0.1: icmp_seq=1 ttl=50 time=510 ms
64 bytes from 192.168.0.1: icmp_seq=2 ttl=50 time=9.66 ms
64 bytes from 192.168.0.1: icmp_seq=4 ttl=50 time=9.70 ms
64 bytes from 192.168.0.1: icmp_seq=3 ttl=50 time=509 ms
64 bytes from 192.168.0.1: icmp_seq=6 ttl=50 time=10.0 ms
64 bytes from 192.168.0.1: icmp_seq=5 ttl=50 time=509 ms
64 bytes from 192.168.0.1: icmp_seq=8 ttl=50 time=9.71 ms
64 bytes from 192.168.0.1: icmp_seq=7 ttl=50 time=509 ms
64 bytes from 192.168.0.1: icmp_seq=10 ttl=50 time=9.72 ms
64 bytes from 192.168.0.1: icmp_seq=9 ttl=50 time=509 ms

可以看出执行命令后开始出现包乱序的情况,执行恢复命令后,开始正常

模拟网络包重复

<实验命令>
# 访问指定的 ip 请求包损坏,百分比 80%

blade create network corrupt --percent 80 --destination-ip 192.168.0.1 --interface eth0

<验证>
ping 192.168.0.1

64 bytes from 192.168.0.1: icmp_seq=64 ttl=50 time=9.94 ms
64 bytes from 192.168.0.1: icmp_seq=65 ttl=50 time=9.73 ms
64 bytes from 192.168.0.1: icmp_seq=65 ttl=50 time=9.74 ms (DUP!)
64 bytes from 192.168.0.1: icmp_seq=66 ttl=50 time=9.77 ms
64 bytes from 192.168.0.1: icmp_seq=66 ttl=50 time=9.80 ms (DUP!)
64 bytes from 192.168.0.1: icmp_seq=67 ttl=50 time=9.70 ms
64 bytes from 192.168.0.1: icmp_seq=67 ttl=50 time=9.71 ms (DUP!)
64 bytes from 192.168.0.1: icmp_seq=68 ttl=50 time=11.0 ms
64 bytes from 192.168.0.1: icmp_seq=68 ttl=50 time=11.1 ms (DUP!)
64 bytes from 192.168.0.1: icmp_seq=69 ttl=50 time=9.78 ms
64 bytes from 192.168.0.1: icmp_seq=69 ttl=50 time=9.78 ms (DUP!)
64 bytes from 192.168.0.1: icmp_seq=70 ttl=50 time=9.70 ms
64 bytes from 192.168.0.1: icmp_seq=70 ttl=50 time=9.70 ms (DUP!)

可以看出执行命令后开始出现包重复的情况,执行恢复命令后,开始正常

模拟网络本地端口占用

<实验命令>
# 指定 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


# 常见问题
Q: {"code":604,"success":false,"error":"Error: listen tcp :8080: bind: address already in use exit status 1"}
A:指定的端口已被占用,可以添加 --force 参数,强制杀掉使用此端口的进程

2.2 云原生混沌实验触发

pod CPU加载

<实验命令>
./blade create k8s pod-cpu load --names <pod名字> --kubeconfig ~/.kube/config --namespace default --cpu-percent 60
./blade create k8s pod-cpu load --labels  'pod的label' --kubeconfig ~/.kube/config --namespace default --cpu-percent 60

<验证>
使用kubectl top pod -n default查看

pod 内存加载

<实验命令>
./blade create k8s pod-mem load --labels  'app=event-detect-1000' --kubeconfig ~/.kube/config --namespace default --mode ram --mem-percent 50

<验证>
使用kubectl top pod -n default查看

【pod不可用】

<实验命令>
./blade create k8s pod-pod fail --labels  'app=event-detect-1000' --kubeconfig ~/.kube/config --namespace default

<验证>
使用kubectl get pod -n default查看pod的状态会变成ImagePullBackOff

【container 基础资源故障】

<实验命令>
# container的CPU满载
./blade create k8s container-cpu fullload --labels  'app=event-detect-1000' --kubeconfig ~/.kube/config --namespace default --container-names event-detect-1000 --timeout 30
# container的磁盘/home目录占用80%
./blade create k8s container-disk fill --labels  'app=event-detect-1000' --kubeconfig ~/.kube/config --namespace default --container-names event-detect-1000 --path /home --percent 80 --timeout 30

<验证>
kubectl exec命令进入到container内查看

2.3 销毁实验

<命令>
blade destroy <实验result id>

  • 0
  • 0
  • 0
0 评论
0/1000
评论(0) 发表评论
h****n

h****n

2 篇文章 0 粉丝
关注

混沌工具ChaosBlade使用经验 -(基础资源和云原生部分)

2023-07-26 18:17:53 203阅读

1. 工具介绍

ChaosBlade是阿里一款简单易用,专注于系统注入混沌实验的开源工具(下载地址),支持的场景如下图所示:

2. 使用经验总结

    本章节主要介绍日常混沌测试工作总结,主要包含基础资源和云原生层面的混沌实验触发和验证方式

2.1 基础资源混沌实验触发

模拟Disk IO冲高
<实验命令>
./blade create disk burn --write --read --size 10 --timeout <设置实验超时时间>

<验证>
使用top命令查看WA指数变化

模拟Disk满载
./blade create disk fill --path <磁盘路径,不填默认为/> --percent 50 --timeout 60

<验证>
使用df -lh查看磁盘空间变化

模拟CPU满载
<实验命令>
./blade create cpu fullload #CPU满载
./blade create cpu load --cpu-percent 50 --timeout 200

<验证>
使用top查看CPU idle指数

模拟内存冲高
<实验命令>
# 占用 50% 的内存,燃烧速率为100M/s,避免chaosblade实验进程被杀掉,实验持续200s
blade create mem load --mode ram --mem-percent 50 --rate 100 --avoid-being-killed --timeout 200
# 保留200M内存, 燃烧速率为1000M/s
blade create mem load --mode ram --reserve 200 --rate 1000

<验证>
使用free -g命令查看内存情况

模拟网络延迟
<实验命令>
# 访问本机 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

<实验命令>
# 本机访问外部 xxx.xxx.xxx.xxx 机器(ping www.baidu.com 获取到的 IP)80 端口延迟 3 秒
blade create network delay --time 3000 --interface eth0 --remote-port 80 --destination-ip xxx.xxx.xxx.xxx

<验证>
# 可在本机通过 telnet xxx.xxx.xxx.xxx 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域名

<实验命令>
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 来验证,会发现访问不通。

模拟网络丢包

<实验命令>
# 访问本机 8080 和 8081 端口丢包率 70%
blade create network loss --percent 70 --interface eth0 --local-port 8080,8081 {"code":200,"success":true,"result":"b1cea124e2383848"}

<验证>
# 可以在另一台相同网络内的机器通过 curl 命令验证,即 curl xxx.xxx.xxx.xxx:8080,不使用 telnet 的原因是 telnet 内部有重试机制,影响实验验证。如果将 percent 的值设置为 100,可以使用 telnet 验证。


<实验命令>
# 本机访问外部 xxx.xxx.xxx.xxx 机器(ping www.baidu.com 获取到的 IP)80 端口丢包率 100%
blade create network loss --percent 100 --interface eth0 --remote-port 80 --destination-ip xxx.xxx.xxx.xxx

<验证>
# 可在本机通过 curl xxx.xxx.xxx.xxx 命令验证,会发现访问不通,执行 curl <其他有效IP> 是通的。

<实验命令>
# 对整个网卡 eth0 做 60% 的丢包,排除 22 和 8000到8080 端口
blade create network loss --percent 60 --interface eth0 --exclude-port 22,8000-8080

<验证>
# 会发现 22 端口和 8000 到 8080 端口不受影响,可在另一台相同网络内的机器通过分别执行多次 curl xxx.xxx.xxx.xxx:8080 和 telnet xxx.xxx.xxx.xxx:8081 进行测试

<实验命令>
# 实现整个网卡不可访问,不可访问时间 20 秒。执行完成下面命令后,当前的网络会中断掉,20 秒后恢复
blade create network loss --percent 100 --interface eth0 --timeout 20(一定要设置超时时间自动销毁混沌实验,否则需要重启机器才能恢复网络)

<验证>
eth0的网络会中断,无法通过该网卡访问

模拟网络包损坏

<实验命令>
# 访问指定的 ip 请求包损坏,百分比 80%
blade create network corrupt --percent 80 --destination-ip xxx.xxx.xxx.xxx --interface eth0

<验证>
ping xxx.xxx.xxx.xxx
64 bytes from xxx.xxx.xxx.xxx: icmp_seq=100 ttl=50 time=9.75 ms
64 bytes from xxx.xxx.xxx.xxx: icmp_seq=101 ttl=50 time=9.94 ms
64 bytes from xxx.xxx.xxx.xxx: icmp_seq=102 ttl=50 time=9.76 ms
64 bytes from xxx.xxx.xxx.xxx: icmp_seq=107 ttl=50 time=9.80 ms
64 bytes from xxx.xxx.xxx.xxx: icmp_seq=109 ttl=50 time=9.71 ms
64 bytes from xxx.xxx.xxx.xxx: icmp_seq=111 ttl=50 time=10.2 ms
64 bytes from xxx.xxx.xxx.xxx: icmp_seq=118 ttl=50 time=9.72 ms
64 bytes from xxx.xxx.xxx.xxx: icmp_seq=119 ttl=50 time=9.94 ms
64 bytes from xxx.xxx.xxx.xxx: icmp_seq=120 ttl=50 time=10.0 ms
64 bytes from xxx.xxx.xxx.xxx: icmp_seq=121 ttl=50 time=9.86 ms
64 bytes from xxx.xxx.xxx.xxx: icmp_seq=122 ttl=50 time=9.76 ms
可以看出执行命令后 icmp_seq=102 开始出现包丢失的情况,执行恢复命令后,从 icmp_seq=118 开始正常

模拟网络包重排

<实验命令>
# 访问指定的 ip 请求包乱序
blade c network reorder --correlation 80 --percent 50 --gap 2 --time 500 --interface eth0 --destination-ip 192.168.0.1

<验证>
ping 192.168.0.1 -A

PING 192.168.0.1 (192.168.0.1) 56(84) bytes of data.
64 bytes from 192.168.0.1: icmp_seq=1 ttl=50 time=510 ms
64 bytes from 192.168.0.1: icmp_seq=2 ttl=50 time=9.66 ms
64 bytes from 192.168.0.1: icmp_seq=4 ttl=50 time=9.70 ms
64 bytes from 192.168.0.1: icmp_seq=3 ttl=50 time=509 ms
64 bytes from 192.168.0.1: icmp_seq=6 ttl=50 time=10.0 ms
64 bytes from 192.168.0.1: icmp_seq=5 ttl=50 time=509 ms
64 bytes from 192.168.0.1: icmp_seq=8 ttl=50 time=9.71 ms
64 bytes from 192.168.0.1: icmp_seq=7 ttl=50 time=509 ms
64 bytes from 192.168.0.1: icmp_seq=10 ttl=50 time=9.72 ms
64 bytes from 192.168.0.1: icmp_seq=9 ttl=50 time=509 ms

可以看出执行命令后开始出现包乱序的情况,执行恢复命令后,开始正常

模拟网络包重复

<实验命令>
# 访问指定的 ip 请求包损坏,百分比 80%

blade create network corrupt --percent 80 --destination-ip 192.168.0.1 --interface eth0

<验证>
ping 192.168.0.1

64 bytes from 192.168.0.1: icmp_seq=64 ttl=50 time=9.94 ms
64 bytes from 192.168.0.1: icmp_seq=65 ttl=50 time=9.73 ms
64 bytes from 192.168.0.1: icmp_seq=65 ttl=50 time=9.74 ms (DUP!)
64 bytes from 192.168.0.1: icmp_seq=66 ttl=50 time=9.77 ms
64 bytes from 192.168.0.1: icmp_seq=66 ttl=50 time=9.80 ms (DUP!)
64 bytes from 192.168.0.1: icmp_seq=67 ttl=50 time=9.70 ms
64 bytes from 192.168.0.1: icmp_seq=67 ttl=50 time=9.71 ms (DUP!)
64 bytes from 192.168.0.1: icmp_seq=68 ttl=50 time=11.0 ms
64 bytes from 192.168.0.1: icmp_seq=68 ttl=50 time=11.1 ms (DUP!)
64 bytes from 192.168.0.1: icmp_seq=69 ttl=50 time=9.78 ms
64 bytes from 192.168.0.1: icmp_seq=69 ttl=50 time=9.78 ms (DUP!)
64 bytes from 192.168.0.1: icmp_seq=70 ttl=50 time=9.70 ms
64 bytes from 192.168.0.1: icmp_seq=70 ttl=50 time=9.70 ms (DUP!)

可以看出执行命令后开始出现包重复的情况,执行恢复命令后,开始正常

模拟网络本地端口占用

<实验命令>
# 指定 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


# 常见问题
Q: {"code":604,"success":false,"error":"Error: listen tcp :8080: bind: address already in use exit status 1"}
A:指定的端口已被占用,可以添加 --force 参数,强制杀掉使用此端口的进程

2.2 云原生混沌实验触发

pod CPU加载

<实验命令>
./blade create k8s pod-cpu load --names <pod名字> --kubeconfig ~/.kube/config --namespace default --cpu-percent 60
./blade create k8s pod-cpu load --labels  'pod的label' --kubeconfig ~/.kube/config --namespace default --cpu-percent 60

<验证>
使用kubectl top pod -n default查看

pod 内存加载

<实验命令>
./blade create k8s pod-mem load --labels  'app=event-detect-1000' --kubeconfig ~/.kube/config --namespace default --mode ram --mem-percent 50

<验证>
使用kubectl top pod -n default查看

【pod不可用】

<实验命令>
./blade create k8s pod-pod fail --labels  'app=event-detect-1000' --kubeconfig ~/.kube/config --namespace default

<验证>
使用kubectl get pod -n default查看pod的状态会变成ImagePullBackOff

【container 基础资源故障】

<实验命令>
# container的CPU满载
./blade create k8s container-cpu fullload --labels  'app=event-detect-1000' --kubeconfig ~/.kube/config --namespace default --container-names event-detect-1000 --timeout 30
# container的磁盘/home目录占用80%
./blade create k8s container-disk fill --labels  'app=event-detect-1000' --kubeconfig ~/.kube/config --namespace default --container-names event-detect-1000 --path /home --percent 80 --timeout 30

<验证>
kubectl exec命令进入到container内查看

2.3 销毁实验

<命令>
blade destroy <实验result id>

文章来自专栏

混沌和组件测试

2 篇文章 1 订阅
0 评论
0/1000
评论(0) 发表评论
  • 0
    点赞
  • 0
    收藏
  • 0
    评论