Netpath
学习路径44 / 49 · K8s 网络看全程 →
闯关预计 30 分钟

闯关:Pod 之间不通

同一个 Service 有些副本能访问、有些不行。在模拟终端里一层层剥开。

学完这节你能做到

  • 按 Pod → 节点 → CNI → Service → 策略的顺序收敛问题
  • 区分 DNS 失败、策略拦截、路由缺失三类症状
  • 定位到具体节点或具体规则,而不是停在"网络不通"

建议先学

跳过这几节会看不懂本节的部分推导

接手

业务群里在吵:

前端调后端 api 三次里有两次超时,重试能成功。今天上午还是好的,我们没发版。

已知信息:

  • frontend 有 1 个副本,跑在 k8s-work-101
  • api 有 3 个副本,分别在 k8s-work-101、102、103
  • 集群用 Cilium,VXLAN overlay 模式
  • 运维说今天上午安全团队批量下发过一批主机加固规则
✓怎么玩

按 L1 的排障顺序来:DNS → Endpoint → 连通性 → 隧道 → 策略。 输入 goals 看目标,hint 要提示。四个目标全达成即过关。

"三次里两次失败"这个比例本身就是线索 —— 先想想它意味着什么。

root@k8s-work-101目标 0/5
  1. 1.确认 Endpoint 里有几个就绪的后端
  2. 2.分别直连三个 Pod IP,确认失败是否与节点相关
  3. 3.排除 NetworkPolicy:看数据平面有没有策略拒绝事件
  4. 4.确认封装后的隧道流量到底走到哪一步
  5. 5.找出根因:谁把隧道流量丢了
frontend 调 api 三次里有两次超时,未发版。
api 有 3 个副本分布在 101 / 102 / 103 三台节点上。
[root@k8s-work-101 ~]#
help 查看用法 · goals 看目标 · hint 要提示 · ↑↓ 翻历史

结论应该长什么样

证据排除 / 确认了什么
nslookup api 正常排除 DNS
Endpoint 里有 3 个后端排除就绪探针与应用侧
直连三个 Pod IP:同节点通、跨节点全超时"间歇性"是假象,真相是跨节点不通
cilium-dbg monitor --type drop 无事件排除 NetworkPolicy(包没走到策略判定)
Cilium Pod 健康、路由存在、MTU 1450 正确排除 CNI 自身与 MTU 配置
抓包:本机在发 UDP 8472,无任何回包确认封装流量出得去、回不来
iptables -nvL INPUT 有 DROP udp,计数在涨根因:主机加固规则丢弃了 VXLAN 隧道流量

根因:安全团队批量下发的加固规则里有一条"丢弃所有 UDP", 而 Cilium 的 VXLAN overlay 走 UDP 8472。三台节点都被下发了这条规则, 于是所有跨节点的 Pod 流量在对端 INPUT 链上被丢弃。同节点通信不出物理网卡,所以不受影响。

修法:在 DROP 之前放通隧道端口。

# 立刻恢复(临时)
iptables -I INPUT 1 -p udp --dport 8472 -s 10.0.12.0/24 -j ACCEPT \
  -m comment --comment "cilium vxlan"

# 验证:跨节点应该立刻通
kubectl exec frontend-7d9c4b8f6-x2klm -- curl -m 3 -sS 10.244.2.9:8080/health

# 持久化交给加固规则的下发渠道,别只改运行时
!主机加固与 CNI 的端口清单

这类事故的根本预防是把 CNI 需要的端口写进加固规则的白名单。常见的几个:

端口用途
UDP 8472VXLAN(Cilium / Flannel 默认)
UDP 6081Geneve
UDP 4789VXLAN(部分实现用标准端口)
TCP 4240Cilium 健康检查
UDP 51871Cilium WireGuard 加密
IP 协议 4IP-in-IP(Calico 的一种模式)

改主机防火墙前先问一句"CNI 用什么封装"。原生路由模式没有隧道端口, 但需要放通 Pod CIDR 的转发——同样不能一刀切。

×「间歇性」几乎总是「某个维度上的确定性」

这一关最重要的方法论:遇到"三次里两次失败",先把它变成确定性问题。

做法是绕开负载均衡、逐个直连后端。这次的比例是 1/3 成功、3 个后端 1 个同节点—— 一算就对上了。同类比例的含义:

成功比例通常意味着
1/N(N = 后端数)只有一个后端可用,且往往与节点相关
约一半双活的一侧有问题(两台 LB、两个可用区、双上行链路)
完全随机、比例不固定conntrack 表满、连接数上限这类资源型问题

先看比例、再算它等于什么,比反复重试快得多。

检查点

Checkpoint单选

Service 有 3 个后端,访问成功率稳定在三分之一。第一步该做什么?

Checkpoint单选

cilium-dbg monitor --type drop 一条事件都没有,但跨节点确实不通。说明什么?

Checkpoint单选

改主机防火墙规则前,为什么必须先确认 CNI 的封装方式?

这一关的落点

  • 排障顺序:DNS → Endpoint → 逐个直连 → 数据平面 drop → 隧道抓包 → 主机防火墙
  • "间歇性"几乎总是某个维度上的确定性:先看成功比例,再算它等于什么
  • 1/N 成功率 = 只有一个后端可用;约一半 = 双活的一侧坏了;完全随机 = 资源型问题
  • 绕开 Service 直连 Pod IP,是把间歇性变确定性最快的一招
  • drop 事件为空是排除性证据:包没走到策略判定,要往更早的位置查
  • overlay 的跨节点流量在物理网卡上是 UDP 8472(Geneve 是 6081),抓它能定位到"发出去了但没回来"
  • 主机加固规则必须给 CNI 端口留白名单,改防火墙前先问清封装方式
  • 同节点通、跨节点不通 = 问题一定在物理网络这一段(隧道、防火墙、路由),不在 Pod 里

延伸资料