MetalLB 通过没有任何 IP 的接口的外部 IP - 无法添加具有特定网关的路由

MetalLB 通过没有任何 IP 的接口的外部 IP - 无法添加具有特定网关的路由

我有一个物理连接到交换机的专用服务器集群,我的住房提供商将同一 /24 子网中的多个公共 IPv4 地址路由到该交换机(不过,我只允许使用该子网外的大约 14 个公共 IPv4)。

我的目标是在 kubernetes 集群上设置 MetalLB,使其能够跨多个工作节点处理来自某个特定 IP(例如 207.120.238.23(不是真正的我的 IP),其中网关为 207.120.238.1)的公共 IP 流量。因此,将会有许多虚拟机,每个虚拟机都有 WAN NIC,并且它们都将为单个公共 IP 进行负载平衡流量。

我的 k8s 集群虚拟机有多个网络接口,首先 enX0 用于 LAN 通信,然后有一个 WAN 接口 (enX2),映射到 ISP 互联网上行链路所连接的每个虚拟机管理程序的物理接口。

我想这样做的原因是为了节省昂贵的公共 IPv4 地址,我想避免必须为每个 k8s 工作节点分配静态公共 IPv4 地址,而只是让它们为负载均衡的 MetalLB 流量提供服务对于那个 IPv4。

为了实现这一点,我故意没有为 enX2 分配任何 IP,只是将其调出,这是我的 /etc/network/interfaces 片段

auto enX2
iface enX2 inet manual
  up ip link set dev $IFACE up
  down ip link set dev $IFACE down

然后我配置 MetalLB 来处理该 207.120.238.23 的传入流量

现在它可以工作,但仅适用于传入流量。当我尝试从互联网连接到 MetalLB 处理流量的端口 80 或 443 时,数据包到达公共网络接口,并且具有此公共 WAN 接口的 k8s-workers 上的扬声器守护程序之一会处理它。

但它无法发回响应- 因为它真的不知道如何。它尝试使用主默认网关发回数据包,该网关使用 LAN 接口 enX0 和完全不同的传出公共 IPv4。

我想 - 很简单,让我们使用源路由并设置一个自定义规则,即使用自定义路由表处理发送到 207.120.238.23 的所有数据包,该路由表将告诉它使用通过 207.120.238.1 enX2 的默认路由。

但这也不起作用 - 如果接口上没有 IP,内核似乎不允许创建路由:

# ip route add default via 207.120.238.1 dev enX2 table wan-route
Error: Nexthop has invalid gateway.

有什么解决办法吗?能做到吗?如果我向同一子网内的每个 k8s 工作节点添加一个静态公共 IPv4,它会起作用,但这样做成本高昂,而且除了让内核确信确实可以使用此类路由之外,所有这些 IPv4 没有任何用处。

更新:使用“onlink”似乎有效,现在我成功在包含正确网关的路由表 wan-route 上创建了默认路由,但使用 tcpdump 我仍然可以看到数据包到达 enX2,但回复是通过 enX0 发送的。

这是我设定的规则:

# ip rule
0:  from all lookup local
32763:  from all fwmark 0x1 lookup wan-route
32764:  from 207.120.238.23 lookup wan-route
32765:  from 207.120.238.23/24 lookup wan-route
32766:  from all lookup main
32767:  from all lookup default

我还使用创建了防火墙标记

iptables -t mangle -A PREROUTING -i enX2 -j MARK --set-mark 1

确保使用 enX2 发送对来自 enX2 的数据包的回复,但它们都不起作用,仍然通过 enX0 发送回复

答案1

我在我的集​​群上做了同样的事情,我必须net.ipv4.conf.eth220.rp_filter=0在 中设置这些接口sysctl,并且netplan必须在 中 指定返回路由的地址:

     eth220:
        match:
            macaddress: 52:54:00:5d:29:01
        routes:
        -   on-link: false
            scope: link
            to: 172.20.0.0/16
        set-name: eth220

相关内容