Netpath
学习路径49 / 49 · K8s 网络看全程 →
原理入门预计 25 分钟

网络值班手册:SOP 与容量复盘

把前面所有知识固化成别人也能照着执行的流程,这才是工程师的产出物。

学完这节你能做到

  • 写出一份别人能照着执行的网络故障处置 SOP
  • 主持一次不追责的网络故障复盘
  • 建立变更前的检查清单与回滚方案

前面 49 节的落点在这里

前面所有内容教的是你怎么查网络问题。这一节讲怎么把它变成团队的能力。

区别很实际:你会查,意味着你半夜必须被叫起来。 写成别人能执行的流程,才算真正解决了问题。

工程师的最终产出物不是"我修好了",而是下一个人也能修好。

SOP 长什么样

一份能用的 SOP 有三个特征:能照着敲、有判断分支、有升级出口。

以「重传率告警」为例:

告警:TCP 重传率 > 1% 持续 5 分钟,节点 node-17

① 确认范围(2 分钟)
   - 只有这个节点,还是同机架/同交换机都有?
     看板:按节点的重传率热图
   - 只有这个节点 → 走 ② 单机路径
   - 一片节点     → 走 ③ 网络路径,并升级到网络组

② 单机路径
   ethtool -S <dev> | grep -E 'missed|no_buffer|crc'
   nstat -az | grep -iE 'retrans|timeout|overflow'
   → rx_missed 增长      = CPU 侧跟不上,查队列数与亲和性
   → rx_crc_errors 增长  = 物理层,报修光模块/线缆
   → ListenOverflows     = 应用消费不过来,找业务方

③ 网络路径
   - 同交换机的多个节点都有 → 交换机上行拥塞或链路故障
   - 升级给网络组,附上:受影响节点列表、开始时间、重传率曲线截图

④ 升级条件(满足任一)
   - 30 分钟内无定位
   - 涉及硬件报修
   - 影响面扩大到多个机架
✓SOP 的价值在「分支」,不在「命令列表」

很多人写的 SOP 是一串命令。这不够——值班的人不知道看到什么该怎么走。

真正有用的部分是那些 → 箭头:看到 A 就做 B。 把你脑子里的判断过程写出来,SOP 才能替代你。

一个检验方法:让一个没查过这类问题的同事照着走一遍。 他卡住的每个地方,就是 SOP 缺的判断分支。

分层排障:先便宜的,后贵的

工具是有成本的,按成本从低到高用:

层级手段成本什么时候用
1看板几乎为零永远先看,一眼定范围
2计数器(ethtool -S、nstat)低定层
3路径工具(mtr、ss、ip)低定位具体跳数/连接
4抓包中(有性能影响)前三层定不了性质时
5eBPF 追踪较高(要会写)内核内部行为
6复现实验高(要资源)性能类问题的最终手段

最常见的错误是直接跳到第 4 层。 故障时第一反应抓包, 结果抓了 10GB 包,问题其实在看板上一眼就能看出是某台交换机上行满了。

顺序反过来的代价:抓包本身也可能加重故障(L4 观测那节 提过要给 tcpdump 加资源上限)。

变更管理:网络故障的一半来自变更

!故障的第一个问题永远是「刚才改了什么」

统计上,绝大多数"突发"网络故障都能追到一次变更: 策略改动、路由调整、固件升级、MTU 修改、扩容加节点。

所以排障的第 0 步不是敲命令,而是问变更:

# 有变更记录系统就查系统;没有就先查这些
kubectl get events -A --sort-by=.lastTimestamp | tail -30
journalctl --since '2 hours ago' | grep -iE 'link|bond|network'
git log --since='1 day ago' --oneline   # 网络配置仓库

这一步平均能省掉一半的排障时间。

变更清单要覆盖三件事:

阶段必须有
变更前影响面评估、回滚方案、当前状态快照
变更中分批(先一台)、每批后验证、双人在场
变更后观察窗口、关键指标对比、变更记录归档

「当前状态快照」很容易被跳过,但它是回滚的前提:

# 改之前先存一份,回滚时才有依据
ip addr show > /tmp/before-ip.txt
ip route show table all > /tmp/before-route.txt
iptables-save > /tmp/before-iptables.txt
ethtool -S bond0 > /tmp/before-counters.txt
×「回滚方案」不能写成「改回去」

最常见的假回滚方案就是这四个字。它在两种情况下会失效:

  • 改了才发现不可逆:固件降级不一定支持、conntrack 表清空后连接已断
  • 回滚本身有影响:改回 MTU 会让已建立的连接再次中断

所以回滚方案要写具体:执行什么命令、需要多久、会不会再断一次业务。 如果答案是"不确定",那就不该在业务高峰做这次变更。

复盘:不追责,但要有改进项

复盘的目的是让这类故障不再发生,不是找出谁的错。 一旦变成追责,下次就没人愿意如实说时间线了——而时间线是复盘最有价值的部分。

一份复盘包含四块:

① 时间线(客观事实,不带评价)
   14:02  变更:更新 NetworkPolicy
   14:07  监控:策略拒绝速率突增 8 倍
   14:19  用户报障(比监控晚 12 分钟 ← 这是个改进点)
   14:31  定位:新策略缺少 DNS 出向规则
   14:35  回滚,恢复

② 影响面
   持续 33 分钟,影响 X 个服务,Y% 请求失败

③ 根因(技术层面,往下追到能被修的那层)
   直接原因:策略未放通 53/udp
   深层原因:策略变更没有 CI 检查,也没有先在预发布验证

④ 改进项(必须有责任人与时间点)
   - 策略变更加 CI:校验 DNS 出向规则          @someone  两周内
   - 策略拒绝速率突增配告警(现在只有看板)     @someone  本周
   - 值班 SOP 加一条「先问变更」                @someone  本周
i改进项要能落地,别写「加强意识」

判断改进项好不好,看它能不能被验证完成:

写法问题
❌ 加强变更评审意识无法验证是否做到
❌ 提高监控覆盖率覆盖什么?多少算够?
✅ 策略变更 CI 增加 DNS 规则校验能验证:CI 里有没有这条
✅ 拒绝速率突增配告警,阈值 3×能验证:告警规则存在且测过

上面那条「用户报障比监控晚 12 分钟」也是典型改进点—— 监控发现得比用户晚,等于没有监控。

容量复盘:两种"用尽"要提前量

容量问题的特点是到了才发现,而那时来不及。 两种资源必须定期盘:

资源用尽的表现提前量怎么盘
交换机端口新机器上不了架至少一个采购周期(数月)按机架统计已用/总数
IP 地址Pod 起不来、ContainerCreating一个季度按网段统计分配率
conntrack 表新连接随机失败实时告警即可水位监控
上行带宽高峰丢包、重传上升一个季度峰值利用率趋势
# Pod 网段的分配率(简化算法:已分配 Pod 数 / 网段容量)
kubectl get pods -A -o wide --no-headers | awk '{print $7}' | grep -c '^10\.'

# 每个节点的 Pod 数上限与当前值
kubectl get nodes -o custom-columns=\
'NAME:.metadata.name,MAX:.status.allocatable.pods'
!地址用尽是「规划欠债」的账单

IP 规划那节 说过:Pod 网段的 nodeCIDRMaskSize 决定了每节点能起多少 Pod,而这个值改不了——改就要重建集群。

所以容量复盘要盯的不是"现在还剩多少",而是按当前增速什么时候用完:

当前分配率 62%,季度增长 11% → 约三个季度后触顶
→ 现在就该规划第二个网段/第二个集群,而不是等到 95%

端口同理:等到机柜插满才去采购,交货周期就成了业务瓶颈。

值班交接:三句话

交接不需要长文档,但这三项不能少:

项例子
未闭环的事node-17 光模块已报修,备件明天到,暂时摘流量
待观察的事昨天调了 bond1 的队列亲和性,重传率在降,继续看
今天的变更窗口20:00 交换机固件升级,网络组主导,我们只需盯监控

「未闭环」这一项最重要——它是唯一会被漏掉的信息。 告警和看板下一班能自己看到,只有"我知道但还没记录"的事会丢。

检查点

Checkpoint单选

一份 SOP 里最有价值的部分是什么?

Checkpoint单选

收到网络故障告警后,第 0 步应该做什么?

Checkpoint单选

容量复盘时,Pod 网段该盯哪个数字?

这节课的落点

  • 工程师的产出物不是"我修好了",而是下一个人也能修好
  • SOP 的价值在判断分支(看到 A 做 B)与升级出口,不在命令列表
  • 排障按成本从低到高:看板 → 计数器 → 路径工具 → 抓包 → eBPF → 复现
  • 第 0 步是问变更——大多数突发故障都能追到一次变更,这一步省一半时间
  • 变更三件套:影响面评估、回滚方案、状态快照;回滚方案不能写"改回去"
  • 复盘不追责,但必须有能被验证完成的改进项与责任人
  • 「监控发现得比用户晚」本身就是一个改进项
  • 容量复盘盯触顶时间而不是剩余量;端口要留采购周期,IP 网段掩码改不了
  • 交接必说未闭环的事——那是唯一会丢的信息
这是整条路径的最后一节 🎉