❯ 我实际测试 Local 模式,只有 eip 本地能通,其他都通不了。为什么?
● 这是 kube-proxy IPVS 模式 + externalTrafficPolicy: Local 的已知行为,不是 MetalLB 的问题。
原因
你的集群用 IPVS 模式,之前确认了所有节点的 kube-ipvs0 上都有 EIP:
xs4772: inet 10.34.251.210/32 scope global kube-ipvs0 xs4773: inet 10.34.251.210/32 scope global kube-ipvs0 xs4774: inet 10.34.251.210/32 scope global kube-ipvs0
当非 Pod 节点(比如 xs4774)curl EIP 时:
- 内核看到 10.34.251.210 在 kube-ipvs0 上 → 认为是本地 IP
- 流量不走网络,直接交给本地 IPVS 处理
- IPVS 查 externalTrafficPolicy: Local → 只找本节点的 endpoint
- Pod 不在 xs4774 → 没有 endpoint → 连接拒绝
流量根本没出节点,被本地 IPVS 截获了。
谁不受影响
┌────────────────┬──────────┬────────────────────────────────────────────┐
│ 来源 │ 是否正常 │ 原因 │
├────────────────┼──────────┼────────────────────────────────────────────┤
│ Pod 所在节点 │ 通 │ IPVS 找到本地 endpoint │
├────────────────┼──────────┼────────────────────────────────────────────┤
│ 集群外部客户端 │ 通 │ 流量走网络 → ARP → owner 节点 → 本地有 Pod │
├────────────────┼──────────┼────────────────────────────────────────────┤
│ 其他集群节点 │ 不通 │ IPVS 截获,本地无 endpoint │
└────────────────┴──────────┴────────────────────────────────────────────┘
关键点:externalTrafficPolicy: Local 本身就是为外部流量设计的,集群内跨节点访问 EIP 不通是预期行为。集群内部应该用 ClusterIP 访问服务。