k8s LB local 模式

57 阅读3分钟

❯ 我实际测试 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 访问服务。

总结:

  • 集群内每个节点都有 ipvs0 网卡都有这个 eip,所以走本地响应
  • 每个节点都有 LB 的 ipvs 规则
  • 但是只有 pod 所在的本地节点才有 pod, 才能通 endpoint

LB 默认(cluster)模式

image.png

LB 默认(local)模式

image.png

我的环境好像有 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 逻辑。

image.png

特性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)。