Neutron的模型定义,关于物理网络(provider:physical_network),有三个地方都有所涉及,如下表所示。
应该说,这三处描述仍然不能很好地表达这个物理网络的准确含义。物理网络具体意味着什么呢?
一 物理网络的实际意义
首先,根据运营商网络的使用场景以及表中的三个描述,我们可以得出物理网络的一种理解。如下图所示:
图中,物理网络就是运营商需要匹配的那个网络。综合表中的三个描述,这样的理解似乎没有什么问题。但是,Neutron在创建运营商网络时,特别提到:VLAN和Flat类型的网络,需要参数provider:physical_network,而VXLAN类型的网络则不需要这个参数。
这非常令人困惑!从上图中我们看到,那个所谓的物理网络(名称是“市场部网络”),不过是帮助“人”阅读和理解的,对于实际的网络连接来说,并没有实质的作用。只要VM发送的报文,从br-xx1出去以后,打上VLAN ID=100的标签,到达那个物理网络后,VM与物理网络中的计算机就能互通。这与传入provider:physical_network参数与否有什么关系呢?
这需要从Neutron的实现模型说起,如下图:
我们知道,对于非隧道型网络(VLAN或Flat),br-int外接的网桥一般称为br-ethx。Br-ethx有几个特点。
1 一般来说,一个br-ethx与一个物理网口(Host的物理网口)相对接。
2 br-ethx是提前创建好的,在Neutron启动之前就已经创建好了,而且与物理网口的对接也已经建立好了(物理网口挂接在br-ethx上)。
运营商网络的VM与物理网络的计算机互通图如下:
图中VM属于一个运营商网络(记为PN1)。虽然这个运营商网络,我们已经正确创建了它的网路类型(VLAN)和网络ID(100),但是,VM发出的报文,必须要经过物理网口NIC1才能到达物理网络中的计算机。我们该如何告诉Neutron,VM发出的报文经过br-int以后,必须要转发到br-eth1,然后经过NIC1出去,才能达到正确的目的地呢?
这个时候,字段provider:physical_network就派上用场了。用户创建网络时,传入这个字段(比如“市场部网络”),Neutron就能做出正确的转发。
所以,对于非隧道网络而言,物理网络有两层含义,如下图所示:
这两层含义是:
1 对于运营商网络,物理网络就是运营商网络所要匹配的外部网络名称;
2 物理是运营商网络还是租户网络,物理网络都意味着br-ethx的选择(背后是主机网卡的选择)。
对于隧道网络,我们一般称br-int外接的网桥为br-tun。
Neutron不需要选择网卡。这要从隧道型网络的报文说起,如下图所示:
从图中我们看到,隧道型网络离开主机的报文,里面是有一层隧道Header的,这个隧道Header包括源IP和目的IP。只要有了目的IP,主机的IP协议栈就会找到合适的网卡将报文发送出去。也就是说,Neutron只需要能够做到使br-tun正确地封装报文隧道Header即可,不必操作报文从哪个网卡出去。
在此,我们对物理网络实际的意义,做个总结,如下表:
物理网络对于非隧道型网络创建时选择哪个br-ethx有着直接意义。
二 Neutron选择br-ethx的方案
在Neutron启动之前,需要提前将br-ethx创建好,并且要将相应的物理网口也对接在br-ethx上。这些都是属于规划设计的工作,同时需要规划设计的还包括br-ethx与物理网络之间的对应关系,并写在Neutron的配置文件中以告知Neutron。我们假设br-ethx的实现方法是OVS(Open vSwitch),那么这个配置文件就是etc/neutron/plugins/ml2/openvswitch_agent.ini。其内容如下:
#etc/neutron/plugins/ml2/openvswitch_agent.ini
bridge_mappings=physnet1:br-ethx1,physnet2:br-ethx2
这个内容表明,要想连接physnet1,就得先连接br-ethx1.要想physnet2,就得先连接br-ethx2.
有了这些提前好的规划设计,但Neutron启动以后,管理员创建运营商网络时会传入字段provider:physical_network。Neutron接到这个字段以后,再与配置文件一映射,就知道选择哪个br-ethx了。比如传入physnet1,Neutron就知道选择br-ethx1。
但是,创建租户网络时并不传入这个字段。怎么办?这就需要另外一个配置文件etc/neutron/plugins/ml2/ml2_conf.ini。我们假设网络类型是VLAN,配置文件的内容举例如下:
#etc/neutron/plugins/ml2/ml2_conf.ini
[ml2_type_vlan]
network_vlan_ranges=physnet1:1000:2999,physnet2:3000:4000
这个配置信息表明有两个物理网络,其中physnet1的VLAN范围是1000~2999,physnet2的VLAN范围是3000~4000。创建租户网络时并没有传入网络ID,neutorn需要通过配置信息来决定网络ID是什么。对于VLAN来说,配置信息就是类似上面举例的内容。根据这个配置信息,Neutron再根据它的策略决定网络ID的同时,同样获取到了物理网络的名称。Neutron就是通过这种间接的方法得到物理网络的名称,进而决定选择哪儿br-ethx。