多播未正确转发

网络工程 路由 故障排除 多播 UDP
2022-02-14 23:47:53

我对 Kubernetes 的 UDP-Multicast 有疑问:

我必须让 Kubernetes-Nodes 每个都运行一个 pod:

Kubernetes-Node-1:
- eth0:192.168.0.2/24
- docker0:10.1.1.1/24
Kubernetes-Node-1 上的 Pod1:
- eth0:10.1.1.2/24

Kubernetes-Node-2:
- eth0: 192.168.0.3/24
- docker0: 10.1.3.1/24

Kubernetes-Node-2 上的 Pod2:
- eth0:10.1.3.2/24

所以我们有以下拓扑:
Pod1---Kubernetes-Node-1---Kubernetes-Node-2---Pod2

我希望 Pod1 和 Pod2 可以相互发送多播包(在 228.8.8.8:45588 上),用于集群发现。

所以我在 Kubernetes-Node-1 和 Kubernetes-Node-2 上使用 smcroute 配置了 2 条路由:

从 eth0 组 228.8.8.8 到 docker0 的 mroute 从 docker0 组 228.8.8.8 到 eth0 的 mroute

如果我直接在 kubernetes-node-1 (mcsender -t32 -ieth0 228.8.8.8:45588) 的 eth0 上创建多播包,包会到达 kubernetes-node-2 上的 eth0,然后通过 mroute 到达 Kubernetes-node 上的 docker0 -2 然后到 Pod2 上的 eth0。

在 Pod1 上创建包时会出现问题:Pod1 创建包,这可以通过 docker0 上的 kubernetes-node-1 上的 tcpdump 看到,并且因为 mroute 也在 eth0 上。不幸的是,在 kubernetes-node2 上看不到这些包 - 不在 eth0 上,也不在 docker0 上......

有没有人知道问题可能是什么?

在 Kubernetes-Node-1 上:

ip mroute
    (10.1.1.2, 228.8.8.8)          Iif: docker0    Oifs: eth0



netstat -nrv
        Kernel IP routing table
        Destination     Gateway         Genmask         Flags   MSS Window  irtt Iface
        0.0.0.0         192.168.0.1    0.0.0.0         UG        0 0          0 eth0
        192.168.0.0    0.0.0.0         255.255.255.0   U         0 0          0 eth0
        10.1.1.0      0.0.0.0         255.255.0.0     U         0 0          0 docker0
        4.5.5.1         10.1.1.1      255.255.255.255 UGH   0      0        0 docker0

最后可能会有更多运行 Pod 的 Kubernetes 节点,它们应该通过多播进行通信。

谢谢你的帮助 :)

2个回答

可能有几个问题:

  1. 我不确定您的拓扑结构,但我猜测它是:

    Pod1 ---- Kubernetes-Node-1 ---- Kubernetes-Node-2 ---- Pod2

  2. 这对我来说就像一个多播循环:

    从 eth0 组 228.8.8.8 到 docker0 的 mroute 从 docker0 组 228.8.8.8 到 eth0 的 mroute

  3. 检查您向多播源的单播路由表是否正确。Kubernetes-Node-2 是否有针对 Pod1 地址的单播路由?

如果您接受建议,我认为运行 OSPF+PIM+IGMP 通常比静态多播路由更实用。

进行 LAN 间路由的路由器/网关需要具有 PIM-DM(“密集模式”,它假定同一组播组中会有大量用户,而“集群发现”似乎适合这里)。在 Linux 内核中,您会注意到这些选项没有出现。这是因为协议本身由路由应用程序处理,例如 Zebra、mrouted 或 pimd。但是,您仍然必须清楚要使用哪个,才能在内核中选择正确的选项。

重新端点:您必须调整收音机才能听到以特定频率传输的节目,就像您必须“调整”内核以接收发送到特定多播组的数据包一样。当您这样做时,表示主机已在您指定的接口中加入该组。

您可以使用ip maddr add命令执行此操作。

句法

ip maddr [ add | del ] MULTIADDR dev STRING

描述

它附加/分离静态链路层多播地址以在接口上侦听。请注意,静态加入协议组播组是不可能的。该命令只管理链路层地址。

address LLADDRESS (default)
    the link layer multicast address. 
dev NAME
    the device to join/leave this multicast address.

例子

有线连接示例:

ip maddr add ff02::fb dev eth0

无线连接示例:

ip maddr add 224.0.0.251 dev wlan0

source [ Linux 内置或开源程序加入多播组?]