vlan network 是带 tag 的网络,是实际应用最广泛的网络类型。
 
 下图是 vlan100 网络的示例。
Neutron Vlan Network 学习-LMLPHP
 
1. 三个 instance 通过 TAP 设备连接到名为 brqXXXX 的linux bridge。 
2. 在物理网卡 eth1 上创建了 eth1.100 的 vlan interface,eth1.100 连接到 brqXXXX。
3. instance 通过 eth1.100 发送到 eth1 的数据包就会打上 vlan100 的 tag。
如果再创建一个 network vlan101,eth1 上会相应的创建 vlan interface eth1.101,并且连接的新的 lingux bridge brqYYYY。
 
每个 vlan network 有自己的 bridge,从而也就实现了基于 vlan 的隔离。
 
如下图:
Neutron Vlan Network 学习-LMLPHP
 
这里有一点要 特别提醒: 因为物理网卡 eth1 上面可以走多个 vlan 的数据,那么物理交换机上与 eth1 相连的的 port 要设置成 trunk 模式,而不是 access 模式。
 
 
配置vlan模式
 
首先在 /etc/neutron/plugins/ml2/ml2_conf.ini 中设置 vlan network 相关参数。
Neutron Vlan Network 学习-LMLPHP
指定普通用户创建的网络类型为 vlan。
 
然后指定 vlan 的范围:
Neutron Vlan Network 学习-LMLPHP
上面配置定义了 label 为default的 vlan network,vlan id 的范围是 3001 - 4000。 这个范围是针对普通用户在自己的租户里创建 network 的范围。 因为普通用户创建 network 时并不能指定 vlan id,Neutron 会按顺序自动从这个范围中取值。
对于 admin 则没有 vlan id 的限制,admin 可以创建 id 范围为 1-4094 的 vlan network。
 
接着需要指明 vlan network 与物理网卡的对应关系:
Neutron Vlan Network 学习-LMLPHP
如上所示: 在 [ml2_type_vlan] 中定义了 lable default,[linux_bridge] 中则指明 default 对应的物理网卡为 eth1。
这里 label 的作用与前面 flat network 中的 label 一样,只是一个标识,可以是任何字符串。
配置完成,重启 Neutron 服务后生效。
 
 
在dashboard创建vlan network
其中 Segmentation ID 即 VLAN ID
 
在控制节点上执行 brctl show,查看当前网络结构。
Neutron Vlan Network 学习-LMLPHP
 
Neutron 自动新建了三个设备:
1. vlan100 对应的网桥 brq3fcfdb98-9d。 
2. vlan interface eth1.100。 
3. dhcp 的 tap 设备 tap1180bbe8-06。
 
eth1.100 和 tap1180bbe8-06 已经连接到了 brq3fcfdb98-9d,VLAN 100 的二层网络就绪。
 
此时 vlan100 结构如图所示:
Neutron Vlan Network 学习-LMLPHP
 
 
 
创建虚拟机连接vlan network,测试连通性
 
cirros-vm1 被 schedule 到控制节点,对应的 tap 设备为 tap238437b8-50,并且连接到 bridge。
Neutron Vlan Network 学习-LMLPHP
 
当前 vlan100 的结构如下。
Neutron Vlan Network 学习-LMLPHP
 
 
cirros-vm2 被 schedule 到计算节点,对应的 tap 设备为 tapac94e0e8-2b,并且连接到 bridge。
Neutron Vlan Network 学习-LMLPHP
 
因为计算节点上没有 hdcp 服务,所以没有相应的 tap 设备。 另外,bridge 的名称与控制节点上一致,都是 brq3fcfdb98-9d,表明是同一个 network。
 
 
当前 vlan100 的结构如下:
Neutron Vlan Network 学习-LMLPHP
cirros-vm1(172.16.100.3) 与 cirros-vm2(172.16.100.4) 位于不同节点,通过 vlan100 相连,测试连通性,可以ping通
 
 
 
不同vlan间通信,需要通过三层路由转发才能通信
 
路由服务(Routing)提供跨 subnet 互联互通功能。
例如前面我们搭建了实验环境:
cirros-vm1      172.16.100.3        vlan100 
cirros-vm3      172.16.101.3        vlan101
这两个 instance 要通信必须借助 router。 可以是物理 router 或者虚拟 router。
 

物理 router

使用物理 router,如下图所示:
Neutron Vlan Network 学习-LMLPHP
接入的物理 router 有两个 interface ip: 
172.16.100.1 对应 vlan100 的网关。 
172.16.101.1 对应 vlan101 的网关。
 
当 cirros-vm1 要跟 cirros-vm3 通信时,数据包的流向是这样的: 
1. 因为 cirros-vm1 的默认网关指向 172.16.100.1,cirros-vm1 发送到 cirros-vm3 的数据包首先通过 vlan100 的 interface 进入物理 router。
2. router 发现目的地址 172.16.101.3 与 172.16.101.1 为同一个 vlan,则从 vlan101 的 interface 发出。 
3. 数据包经过 brq1d7040b8-01 最终到达 cirros-vm3。
 

虚拟 router

虚拟 router 的路由机制与物理 router 一样,只是由软件实现。
Neutron 两种方案都支持。
如果要使用虚拟 router,需要启用 L3 agent。
L3 agent 会在控制节点或者网络节点上运行虚拟 router,为 subnet 提供路由服务。
05-11 11:03