已采纳
回答正文
回复
讨论正文
该问题的正文与回答。
15 年网络工程,目前保一个 K8s 1.26 集群(约 90 节点、Calico VXLAN iptables 模式、双口 25G、内核 5.10)。业务侧反复出现「P99 从 80ms 跳到 400~800ms,持续 5~20s 后自愈」的尖峰,但现有监控(Prometheus + node_exporter + SkyWalking)在尖峰期间只能看到:
rx_dropped / tx_dropped 几乎不动(< 0.01%)事后复盘怀疑是「节点侧 softirq 排队 + iptables 规则匹配 CPU 争抢」导致 TCP ACK 延迟,但当时没有任何一个指标能提前 30s 发出预警——retrans 是结果,不是原因;ICMP 走内核协议栈但不经过 iptables FORWARD 链,所以完全看不到问题。
mpstat 显示目标节点 %soft 从 2% 跳到 12~18%tc -s qdisc show dev eth0 的 sent 和 dropped 在尖峰期间无显著变化Thread.dump 显示大量线程 WAITING on socket readtcp_v4_rcv 抓 per-flow RTT:能抓到 RTT 尖峰,但需要逐节点部署,运维成本高;而且 eBPF 探针本身在 softirq 高负载时会不会丢事件?没验证过。ss -ti 定时采样:5s 间隔,粒度太粗,尖峰 5s 就过去了一半。node_softirq_processed_total:有信号,但聚合到节点级,看不到是哪个 Pod 的流量受影响。我想在每个节点上跑一个轻量级的「网络金丝雀」Pod,专门做跨节点 TCP 层探测(不是 ICMP),目标是:
nc 端口探测 / 自定义 TCP connect+read 循环 / curl 到固定端点?)包大小怎么定才能触发 iptables 匹配路径但不大到触发 PMTU 问题?%soft 尖峰之间,时间差通常是多少?能不能用金丝雀做「提前量」,用 %soft 做「确认」?tc filter 做 per-flow 延迟统计,或者用 cgroup v2 的 net_cls 做 per-Pod 网络延迟隔离观测?