❯ 我实际测试 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 访问服务。
总结:
- 集群内每个节点都有 ipvs0 网卡都有这个 eip,所以走本地响应
- 每个节点都有 LB 的 ipvs 规则
- 但是只有 pod 所在的本地节点才有 pod, 才能通 endpoint
LB 默认(cluster)模式
LB 默认(local)模式
我的环境好像有 bug,即使使用 local 模式,还是会在所有节点的 ipvs 中都注册后端(AI 说不会):
但是主要的区别是在 ipvs 的 ipset:
A. 查阅 Ipset 标记 (最关键)
IPVS 模式下,真正的 Local 策略执行者往往是 Ipset。
Bash
# 查看包含该 VIP 的 ipset
ipset list | grep 10.34.251.210 -B 10
你会发现该 IP 被放入了类似 KUBE-LOAD-BALANCER-LOCAL 的集合中,而 不是 普通的 KUBE-LOAD-BALANCER。这会导致 Iptables 跳过 MASQUERADE 逻辑。
| 特性 | Cluster 模式 (默认) | Local 模式 |
|---|---|---|
| IPVS Real Servers | 包含集群内该 Service 的所有 Pod IP | 仅包含位于当前节点的 Pod IP |
| 转发行为 | 可能发生 DNAT + SNAT (跨节点时) | 仅本节点转发,保留客户端源 IP (无 SNAT) |
| 无 Pod 节点表现 | 依然转发流量至其他有 Pod 的节点 | IPVS 无后端,流量在内核态被静默丢弃或拒绝 |
| 典型标志 (Masq) | 始终有 Masq 标记 | 针对外部流量通常没有 Masq (为了保留源 IP) |
结论
-
Cluster 模式(默认) :
- IPVS 规则:每个节点上的 IPVS 虚拟服务器(Virtual Server)都关联了集群内 所有 后端 Pod 的 IP 作为 Real Server。
- 流量表现:支持跨节点转发,由于可能发生二次转发,必须通过 SNAT 隐藏客户端真实 IP 以确保回包路径正确。
-
Local 模式:
- IPVS 规则:每个节点上的 IPVS 虚拟服务器 仅关联本节点 上的后端 Pod IP 作为 Real Server。如果本节点没有该服务的 Pod,该 IPVS 规则的 Real Server 列表为空。
- 流量表现:强制不跨节点转发,直接发往本地 Pod。因此不需要 SNAT,能够 保留客户端源 IP,且减少了一跳(Hop)。