k8s LB local 模式

3 阅读1分钟

❯ 我实际测试 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 时:

  1. 内核看到 10.34.251.210 在 kube-ipvs0 上 → 认为是本地 IP
  2. 流量不走网络,直接交给本地 IPVS 处理
  3. IPVS 查 externalTrafficPolicy: Local → 只找本节点的 endpoint
  4. Pod 不在 xs4774 → 没有 endpoint → 连接拒绝

流量根本没出节点,被本地 IPVS 截获了。

谁不受影响


┌────────────────┬──────────┬────────────────────────────────────────────┐
│      来源      │ 是否正常 │                    原因                    │
├────────────────┼──────────┼────────────────────────────────────────────┤
│ Pod 所在节点   │ 通       │ IPVS 找到本地 endpoint                     │
├────────────────┼──────────┼────────────────────────────────────────────┤
│ 集群外部客户端 │ 通       │ 流量走网络 → ARP → owner 节点 → 本地有 Pod │
├────────────────┼──────────┼────────────────────────────────────────────┤
│ 其他集群节点   │ 不通     │ IPVS 截获,本地无 endpoint                 │
└────────────────┴──────────┴────────────────────────────────────────────┘

关键点:externalTrafficPolicy: Local 本身就是为外部流量设计的,集群内跨节点访问 EIP 不通是预期行为。集群内部应该用 ClusterIP 访问服务。