Neutron DVR两个问题的思考

2017-07-14  本文已影响136人  分享放大价值

两个问题

这一段时间研究Neutron DVR,即分布式路由 (Distributed Virtual Router)。当把南北向和东西向流程打通后,突然产生了两个问题,让我思索了很久,终于得到了比较令自己信服的答案,特此记录,分享给一同搞OpenStack的朋友们。如果有朋友觉得有错误,欢迎指出,一起探讨!

1. 为什么要引入与计算节点绑定的MAC

1.1 什么是与计算节点绑定的MAC

首先说一下这个与计算节点绑定的MAC。我们知道,DVR的主要思想是将路由功能下发给所有的计算节点。从Linux实现的角度,就是每个计算节点都有一个namespace用来实现路由功能,而所有的计算节点的namespace中的虚拟网口都是一模一样的。DVR认为,这些namespace中的虚拟网口qr对其他计算节点应该是不可见的,因此,从Overlay发到其他计算节点的数据包中,如果源MAC是qr的,都会被替换成该计算节点的唯一MAC;如果目的MAC是qr的,都会被DROP。

与计算节点绑定的MAC在启用DVR之后会自动创建,并写入Neutron DB。通过neutron的配置文件可以指定这个唯一MAC的前缀。

1.2 Traffic Flow

L2 agent选择neutron-openvswitch-agent时,主要是由br-tunbr-int来确保该功能正常运作的。以跨网段的东西向流量为例,拓扑图如下:

拓扑图.jpg
从Instance 1发往Instance2的traffic flow:
1.3 是否有必要修改qr的MAC

为什么计算节点的namespace中的网口qr不能让别的计算节点看到?这里假设图中“1”位置处并没有修改源MAC,我们再走一遍traffic flow:

也就是说,此时图中1、2两个位置都没有进行数据包源MAC的修改,此时数据包还是可以到达Instance 2的。但,Instance 2再往Instance 1发的报文就会出问题,此时的traffic flow会是这样的:

假设Instance 2的arp表记住了qr-2的MAC,不需要再发送arp请求

问题由此诞生。先不说br-tun的流表规则会把目的MAC是qr的流DROP,假设数据包可以到达计算节点1做路由,但这样的traffic flow显然已经丧失了DVR设计的初衷。

因此,与计算节点绑定的MAC是必须的。

2. 为什么跨网段的东西向流量必须使用静态arp

2.1 Traffic Flow

L2 agent选择neutron-openvswitch-agent时,主要是由namespace内部配置静态arp表来响应Instance 1的arp请求报文。以跨网段的东西向流量为例,拓扑图如下:

拓扑图.jpg
从Instance 1发往Instance 2的traffic flow:
2.2 为什么一定要使用静态arp

为什么不能向legacy_router模式或者同网段一样发送arp请求?通过手动将namespace中的静态arp删掉发现无法获取到Instance 2的MAC,原因是在图中2的位置,arp请求报文会命中br-int规则:源MAC是计算节点1的唯一MAC但并不是发往Instance 2,该规则的动作是:DROP,即图中“2”的位置是不会有arp请求报文发到Instance 2的。

静态arp和所有计算节点br-int的流表规则都说明一件事:跨网段东西向流量必须使用静态arp。对比之下,同网段东西向流量可以使用arp请求来获取对端的MAC,总觉得匪夷所思。

假设放开静态arp和br-int流表的限制,让arp请求报文到达Instance 2,看看会有什么问题:

问题由此诞生。目的MAC为qr的数据包只能在计算节点内部,不能发送到其他计算节点,否则还是会引起br-int的混乱。所以,就算跨网段的东西向流量允许发送arp请求,发送arp请求的namespace也永远收不到arp回复报文。

因此,跨网段的东西向流量必须使用静态arp。


后面有时间会补充ovs流表作为证据

上一篇 下一篇

猜你喜欢

热点阅读