传统虚拟机间跨三层通信都需要由网络节点做集中式三层路由,这就会存在几个问题:
单点故障
网络节点出现故障,虚拟机间跨三层通信将无法进行。
性能瓶颈
跨三层通信流量都送给网络节点来处理,当网络规模越来越大时,网络节点的负载就会越来越大,最终会出现性能瓶颈。
发小流量
发小流量指的是处于同一个计算节点,不同网络的虚拟机,二者之间的三层流量依然要先经过网络节点做路由转发,这个数据路径明显拉长了,带来的就是更多的网络时延问题。
面对上述的三个问题,Openstack开源社区提出了DVR(分布式虚拟路由器)的模型。在DVR模型中,每个节点上都部署一个L3 Agent,在本节点上就可以完成跨三层转发,而无需再转发到网络节点。
1. 配置
控制节点
修改配置文件:/etc/neutron/neutron.conf
[DEFAULT]
router_distributed = True
然后重启如下服务:
service neutron-server restart
网络节点
修改配置文件:/etc/neutron/plugins/ml2/openvswitch_agent.ini
[agent]
enable_distributed_routing = True
修改配置文件:/etc/neutron/l3_agent.ini
[DEFAULT]
agent_mode = dvr_snat
然后重启如下服务:
service neutron-openvswitch-agent restart
service neutron-l3-agent restart
计算节点
首先需要安装l3-agent。
修改配置文件:/etc/neutron/plugins/ml2/openvswitch_agent.ini
[agent]
enable_distributed_routing = True
修改配置文件:/etc/neutron/l3_agent.ini
[DEFAULT]
interface_driver = openvswitch
agent_mode = dvr
然后重启如下服务:
service neutron-openvswitch-agent restart
service neutron-l3-agent restart
配置完后,就可用创建租户网络了。然后创建一个router,把网络子网连接到路由器上,这时在网络节点上可以看到路由器的命名空间,但是在计算节点上还看不见路由器的命名空间,要在该计算节点上启动一个虚拟机才能看见路由器的命名空间。此时网络节点上还看不见snat和fip命名空间,这个需要创建一个外部物理网络,并把外部网络连接到路由器上,这个时候就可以看见这两个命名空间了。
在DVR场景中,有三个网络实体,如下所示:
router namespace
负责执行东西向三层转发。
fip namespace
负责执行南北向流量(虚拟机分配有floating ip)
snat namespace
负责执行南北向流量(虚拟机没有分配floating ip)