默认情况下,网段1的电脑无法直接访问网段2中的 MetalLB VIP。

这并非因为 MetalLB 有缺陷,而是由其核心工作原理——ARP(地址解析协议)——的固有特性决定的。

核心原因:ARP 协议的”子网本地”特性

  1. 工作原理:MetalLB 的 L2 模式(二层模式)通过响应 ARP 请求来宣告其 VIP。当一个客户端(比如你的电脑)想要访问 VIP 时,首先会发送一个 ARP 广播,询问”谁拥有这个 IP 地址?”。
  2. 广播域限制ARP 广播包默认无法跨越网段(即子网)。路由器不会将广播包从一个网段转发到另一个网段。
  3. 结论:网段1的电脑发出的 ARP 请求,无法到达网段2中的 MetalLB 服务。没有 ARP 响应,电脑就无法知道 VIP 对应的 MAC 地址,从而无法建立通信。

MetalLB 的官方文档也明确指出,在 L2 模式下,客户端必须与 VIP 位于同一个子网中,MetalLB 才能正常工作。

解决方案

如果确实需要跨网段访问,可以考虑以下几种方案:

  • 方案一:使用 BGP 模式(推荐) MetalLB 的 BGP 模式是解决跨网段访问的标准方法。在该模式下,MetalLB 会通过 BGP(边界网关协议)将 VIP 路由通告给网络中的路由器。路由器知道如何将来自不同网段的流量路由到正确的目的地。这是为大规模、跨网段环境设计的原生解决方案。

  • 方案二:调整网络架构 将访问客户端(网段1的电脑)和 Kubernetes 集群(网段2)迁移到同一个二层网络(同一子网) 中。这是最简单的方案,直接满足了 MetalLB L2 模式的工作前提。

  • 方案三:配置上层路由器(不推荐) 可以在网段1和网段2之间的路由器上,为 MetalLB 的 VIP 手动添加静态路由,指明通往该 VIP 的下一跳是某个特定的 Kubernetes 节点。这种方法配置复杂、维护困难,且会失去 MetalLB 的故障自动转移能力。

  • 方案四:使用 Ingress Controller 如果目的是暴露 HTTP/HTTPS 服务,可以考虑使用 Ingress Controller(如 Nginx Ingress)。它通常作为 NodePort 服务或使用 LoadBalancer(如果可用)暴露,然后通过 DNS 将域名解析到节点 IP,由 Ingress 根据域名或路径进行路由。

总结

模式跨网段访问支持原理
L2 模式不支持依赖 ARP 广播,无法跨子网
BGP 模式支持依赖 BGP 路由协议,由路由器负责跨网段路由

总而言之,想要实现跨网段访问,最根本的办法是使用 MetalLB 的 BGP 模式,或者重新规划网络,让客户端与 VIP 处于同一子网。