深色模式
网络延迟丢包注入
摘要:弱网和依赖延迟最能暴露"超时没配、重试风暴、无降级"三类问题。本文用 tc-netem 在主机层注入,用 NetworkChaos 在 K8s 层注入,并给出观察与验证方法。
适用环境
bash
# tc 属于 iproute2
command -v tc && tc qdisc show | head
ip link show | awk -F': ' '{print $2}' | head
kubectl -n chaos-mesh get pod | head -31
2
3
4
2
3
4
操作步骤
第 1 步:记录基线延迟
bash
# 基线:正常 RTT 与错误率
ping -c 5 -q <目标地址> | tail -1
curl -sS -o /dev/null -w 'connect=%{time_connect}s total=%{time_total}s\n' http://<服务地址>/health1
2
3
2
3
第 2 步:用 tc-netem 注入延迟与丢包
bash
# 在 eth0 上增加 200ms ± 50ms 延迟
sudo tc qdisc add dev eth0 root netem delay 200ms 50ms
# 追加 5% 丢包(修改已有规则用 change)
sudo tc qdisc change dev eth0 root netem delay 200ms 50ms loss 5%1
2
3
4
5
2
3
4
5
DANGER
tc qdisc add 作用于整块网卡,会影响该机上所有流量。仅在专用测试机执行,并立即执行第 5 步清理;生产机上误执行等于一次真实网络故障。
第 3 步:K8s 中用 NetworkChaos 精确注入
yaml
apiVersion: chaos-mesh.org/v1alpha1
kind: NetworkChaos
metadata:
name: delay-demo
namespace: test
spec:
action: delay
mode: one
selector:
namespaces: [test]
labelSelectors: { app: demo }
delay:
latency: '200ms'
jitter: '50ms'
correlation: '50'
duration: '120s'1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
bash
kubectl -n test apply -f delay-demo.yaml
# 丢包与分区只需换 action:loss / partition1
2
2
第 4 步:观察依赖方反应
bash
# 上游是否超时熔断,而非无限等待
kubectl -n test logs deploy/demo --tail=50 | grep -iE 'timeout|deadline|circuit'
# 是否出现重试风暴(QPS 异常放大)
curl -sS --data-urlencode 'query=sum(rate(http_requests_total{job="demo"}[1m]))' \
http://127.0.0.1:9090/api/v1/query | jq -r '.data.result[].value[1]'1
2
3
4
5
6
2
3
4
5
6
第 5 步:清理
bash
sudo tc qdisc del dev eth0 root
tc qdisc show dev eth0
kubectl -n test delete -f delay-demo.yaml1
2
3
2
3
验证
bash
# 1. 延迟确实生效
ping -c 5 -q <目标地址> | grep avg
# 2. 上游在超时时间内返回,而不是挂住
curl -sS -o /dev/null -w 'code=%{http_code} total=%{time_total}s\n' http://<服务地址>/health
# 3. 清理后 RTT 回到基线
tc qdisc show dev eth01
2
3
4
5
6
7
8
2
3
4
5
6
7
8
常见坑
tc 规则忘记删除
规则重启前一直生效,会被误判为网络故障。实验脚本里用 trap 保证退出时自动清理。
只注入延迟不看重试
延迟 200ms 时上游重试 3 次,流量会放大三倍,可能打垮下游。必须同时观察 QPS 曲线。
对控制面/存储网络注入故障
对 etcd、apiserver 或存储网注入丢包会造成集群级不可用。实验目标严格限定在业务 Pod。