-1

我正在尝试在具有未编号接口和网络名称空间的 linux 主机上验证 ECMP 功能。

下面的例子可以用来演示:

# add address to loopback for unnumbered veth interfaces  
ip addr add 198.51.100.0/32 dev lo

# namespace 1 
ip netns add ns1
ip link add veth100 type veth peer name veth101
ip link set veth100 up
ip link set veth101 netns ns1
ip netns exec ns1 ip link set veth101 name eth0
ip netns exec ns1 ip addr add 192.0.2.1/32 dev eth0
ip netns exec ns1 ip link set eth0 up
ip netns exec ns1 ip route add 198.51.100.0/32 dev eth0
ip netns exec ns1 ip route add 0.0.0.0/0 via 198.51.100.0
ip route add 192.0.2.1/32 dev veth100

# namespace 2 
ip netns add ns2
ip link add veth200 type veth peer name veth201
ip link set veth200 up
ip link set veth201 netns ns2
ip netns exec ns2 ip link set veth201 name eth0
ip netns exec ns2 ip addr add 192.0.2.2/32 dev eth0
ip netns exec ns2 ip link set eth0 up
ip netns exec ns2 ip route add 198.51.100.0/32 dev eth0
ip netns exec ns2 ip route add 203.0.113.0/32 dev eth0
ip netns exec ns2 ip route add 0.0.0.0/0 via 198.51.100.0
ip route add 192.0.2.2/32 dev veth200

# anycast / ecmp setup  
ip netns exec ns1 ip addr add 203.0.113.0/32 dev lo
ip netns exec ns1 ip link set dev lo up 
ip netns exec ns2 ip addr add 203.0.113.0/32 dev lo
ip netns exec ns2 ip link set dev lo up 

ip route append 203.0.113.0/32 nexthop via 192.0.2.1 weight 100 
ip route append 203.0.113.0/32 nexthop via 192.0.2.2 weight 100

我可以看到我的路由表中有两条路由:

$ ip route show
 ... 
203.0.113.0 via 192.0.2.1 dev veth100 onlink
203.0.113.0 via 192.0.2.2 dev veth200 onlink
 ... 

Ping 到 203.0.113.0 工作(如预期):

$ ping 203.0.113.0 -c 2
PING 203.0.113.0 (203.0.113.0) 56(84) bytes of data.
64 bytes from 203.0.113.0: icmp_seq=1 ttl=64 time=0.096 ms
64 bytes from 203.0.113.0: icmp_seq=2 ttl=64 time=0.079 ms

--- 203.0.113.0 ping statistics ---
2 packets transmitted, 2 received, 0% packet loss, time 1024ms
rtt min/avg/max/mdev = 0.079/0.087/0.096/0.008 ms

我可以设置 veth100 或 veth200 并实现故障转移。但是,负载似乎不会同时在 veth100veth200 之间共享。我通过同时 tcpdump'ing veth100 和 veth200 验证了这一点。

进行实验,我尝试以这种方式添加 ecmp 路由:

ip route add 203.0.113.0/32 nexthop via 192.0.2.2 weight 10 nexthop via 192.0.2.1 weight 10 

该路线似乎以不同的方式安装。我不确定实际上有什么区别,但看起来不一样。

$ ip route show
 ... 
203.0.113.0
  nexthop via 192.0.2.2 dev veth200 weight 10
  nexthop via 192.0.2.1 dev veth100 weight 10
 ... 

但是,这仍然存在与上述相同的问题。

我不确定接下来要采取什么步骤。我究竟做错了什么?在这种情况下,有什么方法可以实现 ECMP 负载分担?

4

1 回答 1

0

如果您仅使用 ICMP ping 进行测试,则该行为是预期的。ECMP 的 5 元组哈希(sourceIP+sourcePort+destIP+destPort+protocol)不能与 ICMP 一起使用,因为它不使用端口号,因此您将始终访问同一主机。

尝试使用多个 UDP 和 TCP,您应该会看到负载平衡效果,因为至少源端口应该是临时的(与目标知名服务端口不同)。

顺便说一句 - 感谢您详细说明您采取的步骤,因为我目前正在尝试相同的概念,以便用简单的负载平衡、路由、仅 IPv6 替换 K8S 网络混乱。

于 2020-12-31T00:38:01.317 回答