Neutron OVS-DVR
一、DVR概述
为了提高neutron网络服务的鲁棒性与性能,OpenStack从Juno版开始正式加入的DVR(Distributed Virtual Router)服务,它将原本集中在网络节点的部分服务分散到了计算节点上。
在该模式下,同租户的跨网段路由在计算节点之间直接完成,无需网络节点的参与,SNAT服务仍由网络节点集中化的处理,Floating服务则可以选择在计算节点分布式地处理,也可以选择在网络节点集中式地处理。
二、有DVR与没有DVR的区别
1. 如图,没有DVR时,东西向流量和南北向流量都集中到了网络节点,导致网络节点负载过大,成为瓶颈。
2. 如图,有DVR时,对于东西向流量,流量会直接在计算节点之间传递;对于南北向流量,如果有FIP,流量会直接走计算节点;如果没有FIP,则会通过网络节点连接外部网络。
三、典型场景
涉及到L3路由服务的网络访问至少是需要跨网段之间的访问,这又分为是否是同一节点、是否涉及到外网,即东西向与南北向之间的流量。
1. 东西向流量
(1)同一计算节点
路由器直接在br-int上转发,不经过br-ex。
(2)不同节点
如图,租户T1的两个不同子网下的两台虚机VM1和VM4分别落在Compute1与Compute2上。VM1要访问VM4,过程如下:
①首先通过br-int->IR1->ARP得到默认网关的mac,并将Dest MAC修改为默认网关的mac地址;
②通过IR1得到目的地址以及目的网关的mac地址,并修改SRC MAC(目的网关mac)与DEST MAC(目的mac);
③通过br-int->br-tun得到与Compute2绑定的全局唯一的MAC地址,并修改SRC MAC为此mac地址;
④通过br-tun到达Compute2的br-int得到目的网关的mac地址,并修改SRC MAC为此mac地址,最终到达VM4
2. 南北向流量
(1)有FIP
如图所示, Compute1上租户T1的VM2和Compute2上租户T1的VM4,都绑定了FIP,那么它们都可以通过所在的计算节点访问外部网络。VM2访问外网的过程 如下:
①首先通过br-int->IR2->ARP得到默认网关的mac,并将Dest MAC修改为默认网关的mac地址;
②通过IR2中的rfp-XXX发送给FIP namespace的fpr-XXX,rfp-XXX与fpr-XXX是一对veth pair;
③通过FIP namespace查询路由,即通往外部网络的默认路由;
④最终通过fg-XXX发送到br-ex。
计算节点需要额外启用 l3-agent(dvr 模式),以及 metadata-agent。其实跟传统情况下的网络节点十分类似,不同的是单独有一个qfloat-XXX 路由器(如图中 的Floating IP,也在一个独立命名空间中)来负责处理带有 floating IP 的南北向流量,每个路由器有自己的命名空间,进行跨子网的转发。
(2)没有FIP
如图,租户T2想要通过外部网络来访问内部子网的VM1时,需要通过默认的SNAT网关来访问内部子网的虚机,即网络节点上的T2-SNAT。
相反,若租户T2内部子网的虚机VM1想要访问外部网络,则仍需经过网络节点上的T2-SNAT路由器。
四、总结
1. 所有节点的L3层通信,在流量出节点之前都会把源MAC替换成各节点都全局唯一的DVR host MAC。
2. 从实质上讲,neutron的DVR模式并没有使用任何颠覆性的技术手段,可以说也就是把原有的VRouter给Distribute了。
3. 网络节点只是在L3层服务配置了dvr_snat模式以及在命名空间上多了一个snat-XXX的专门处理来自计算节点的无FIP的南北向流量。
参考资料:https://docs.google.com/presentation/d/1ktCLAdglpKdsC--fQ2F_c2d3X1u-lyRGGUzRu9ITuWo/edit#slide=id.g2b6a14e30_036