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數據。