http://specs.openstack.org/openstack/neutron-specs/specs/kilo/ml2-hierarchical-port-binding.html
步骤如下:
- 用户用Nova boot创建一个虚拟机, vm 的网络设定为VXLAN A;
- Neutron创建一个VXLAN A网络接口,并将请求发送到ML2组件;
- Neutron ML2先调用物理交换机(TOR)的Mechanism Driver进行端口绑定(port binding),将VxLAN A 绑定到物理交换机的网络接口 ;
- 物理交换机Mechanism Driver再申请一个VLAN B并通知ML2,告诉ML2当前这个VM的网络接口还需要绑定VLAN B
- 物理交换机Mechanism Driver通过Netconf接口告诉物理交换机设定VLAN B和VXLAN A的映射关系;
- ML2知道网络接口还需要绑定到对应的VLAN上,所以ML2调用OVS的Mechanism Driver,在OVS添加VLAN B,并将该VLAN配置到VM对应的接口上,
- OVS的Mechanism Driver会通过相应的API,告知位于计算节点的OpenVSwitch,OVS将对VM发出的数据包打上TAG=VLAN B 并转发到物理交换机的接口,物理交换机将带有TAG=VLAN B的数据包转换为TAG=VXLAN A的数据包;
- 层次化端口绑定的逻辑,一半是在Neutron ML2里面,有另一半是在物理交换机对应的Mechanism driver里面。
- 硬件交换机与服务器要运行LLDP之类的协议,来获取连接关系
OpenStack层次化端口绑定在 SDN中host和交换机如何协同?
虚拟机
1、计算节点开启lldp服务,从underlay nic接口发送携带主机名的lldp报文,作为VTEP设备的交换机接收后上报控制器,控制器就记录计算节点所属的交换机端口,
当计算节点启动虚机的时候,虚机的vport中会携带主机名(计算节点的名字,也就是lldp报文中携带的主机名),控制器就知道了这个虚拟机的报文将进入交换机的哪个端口。
2、Openstack创建port在bind_port时,根据port所属计算节点动态分配一个这个计算节点的physical network的vlan,然后赋值给框架的next_segments_to_bind以便框架进行openvswitch vlan绑定的绑定,如果这个port是这个这个网络的第一个port的话,会通知这个计算节点添加vlan和vxlan的映射关系。
3、虚机上线时,上线信息上报给控制器VSM模块,VSM模块再给NEM模块上报激活事件,使得NEM向交换机下发vlan和vxlan映射关系。
裸金属
裸金属通过nuetron传递的local_link_information来感知服务器连接交换机的端口。在inspect阶段,裸金属用的deploy镜像里会包含lldp服务,ironic-agent会收集lldp信息,告知ironic。
host对不同租户的虚拟机的报文 Tag 不同的VLAN ,host连接到交换机的port设为Trunk口,这样host可以把不同VLAN Tag的网络数据送到交换机vetp。vetp根据VLAN Tag映射到不同的vxlan tag,进而封装成相应的VxLAN数据。