大多数场景下,主机收发的是不带tag的报文,但是在实际环境中,无论是windows还是Linux环境都通过各自的方法可以收发带有vlan tag的报文。 而一个虚机要想接收不同vlan tag的报文,则需要在虚机上接入不同网络,就意味着在虚机上多一个虚拟网卡,这样如果很多vlan就会有很多接口,管理起来很不方便。尤其在NFV场景中,虚机充当了一个虚拟网络设备,因此接收多个vlan tag的报文就是硬性需求。因此openstack创建的虚机中,能接收带有vlan tag的报文这个需求就更加迫切了。
为了解决这个问题,openStack 先后出了两个方案,一个方案是Neutron VLAN Transparency,另一个方案是VLAN aware VMs。
(一) Neutron VLAN Transparency
在openstack kilo版本特性,VLAN trunking networks for NFV。该功能是802.1ad协议,而当时openvswitch是不支持802.1ad的,所以当时这个功能发布的主要针对一个SDN网络组建。该功能不需要修改配置,只需要在创建network的时候,增加一个参数vlan-transparent=True即可,driver支持就支持,不支持返回来“Backend does not support VLAN Transparency.”。
按是实际上openvswitch在2.8版本(2017年)后,已经支持了802.1ad,详见https://github.com/openvswitch/ovs/commit/f0fb825a3785320430686834741c718ff4f8ebf4
虽然升级openvswitch版本后,底层支持了,但是“
Currently VLANs in VMs are not integrated with Neutron. In certain OVS based plugins VMs can only send untagged traffic. This is because OVS currently does not support QinQ. Even if OVS did support QinQ we would need something to integrate VM tagged traffic with rest of Neutron.“ 所以目前来说,社区还没有使用ovs来很好的支持 VLAN Transparency功能。
(二)VLAN aware VMs
OpenStack Newton版本的特性,由VLAN aware VMs定义。标准的802.1Q协议。这个openvswitch早就支持(有多早呢?在ovs 1.3 就开始支持trunk accss等特性)
需要修改neutron.conf配置,service_plugins=,,,trunk 增加trunk。然后在创建好的network上增加相应的属性。
快速步骤:
1. 修改neutron.conf配置,重启neutron-server
2. 准备网络,net0(parent-net), net1(subnet) net2等,已经相应子网。
3. 创建端口,一个vm对应一个parentport, 租户需要几个vlan网络,就需要创建几个对应的net。
4. 创建trunk,每一个trunk实例中包含一个parentport, 和若干个其他子接口netport
5. 创建vm,指定parentport
6. 在vm内创建子接口接口,支持dhcp自动获取地址
参考文档:
https://www.sdnlab.com/19761.html
http://specs.openstack.org/openstack/neutron-specs/specs/liberty/vlan-aware-vms.html
https://specs.openstack.org/openstack/neutron-specs/specs/liberty/vlan-aware-vms.html