next_segments_to_bind
301 def continue_binding(self, segment_id, next_segments_to_bind): 302 # TODO(rkukura) Verify binding allowed, segment in network 303 self._new_bound_segment = segment_id 304 self._next_segments_to_bind = next_segments_to_bind
當ovs-agentbind_port時,kilo版本會查找driver依次綁定,M版本之后就不再支持。這兒可以先調用自己的mechaism機制,將vxlan ID下發到交換機上,然后設置continue_binding變量,繼續將vlan ID綁定到ovs上。
防止重復綁定
context._new_bound_segment
//一類segments_to_bind,遍歷所有的driver
def _bind_port_level(self, context, level, segments_to_bind): ...... for driver in self.ordered_mech_drivers: if not self._check_driver_to_bind(driver, segments_to_bind, context._binding_levels):continue try: context._prepare_to_bind(segments_to_bind) driver.obj.bind_port(context) segment = context._new_bound_segment if segment: context._push_binding_level( models.PortBindingLevel(port_id=port_id,host=context.host, level=level,driver=driver.name,segment_id=segment)) next_segments = context._next_segments_to_bind if next_segments: # Continue binding another level. if self._bind_port_level(context, level + 1,next_segments): //遞歸 return True else: LOG.warning(_LW("Failed to bind port %(port)s on " "host %(host)s at level %(lvl)s"), {'port': context.current['id'],'host': context.host,'lvl': level + 1}) context._pop_binding_level() else: # Binding complete. ...... return True
首先會遍歷每個ml2 driver(例如openvswitch,networking-huawei等),調用_check_driver_to_bind,遍歷每個context._binding_levels中的level,如果該level.segment_id在segments_to_bind里面以及level.driver與當前driver匹配的話,將會退出該driver的綁定流程,進行下一個driver的綁定。簡單總結一下:就是在同一個driver上不能綁定相同的segment_id。
當然,如果是層次化綁定的話,需要higher level的driver將分配的segment_id通過continue_binding()傳遞給bottom level的driver。各種driver進行端口綁定的過程就不詳細分析了,主要就是獲取host中運行的alive狀態的agent,如果agent的信息符合綁定的需求(如檢驗network_type),就會將該agent信息寫入端口綁定信息里(vif_type:ovs,vif_details)。nova創建虛機,需要獲取vif_type:ovs,vif_detail信息。
華為層次綁定
網卡層次化綁定
概述中提到過AC插件會對vxlan網絡進行層次化綁定。AC會在每一台主機上給每一個vxlan網絡分配一個vlan, 該網絡下的虛擬機在主機上走vlan通信,在交換機上走vxlan通信。如何查詢AC綁定的vlan是多少呢?
F6.3&6.5部分版本已經將層次化綁定信息直接顯示在了port的信息中,如下圖,層次化綁定正常的話能看到vxlan和vlan的兩條信息
如果這里只顯示了一條vxlan的信息,可以直接找AC側定位為何層次化綁定異常
有的版本可能沒有任何顯示,這時候可以通過查數據庫的方法查看,如下:
- 登錄FusionSphere OpenStack后台控制節點執行以下命令,查詢gaussdb的主節點
cps template-instance-list --service gaussdb gaussdb
- 登錄到步驟1查詢的gaussdb主節點,並進入neutron數據庫,密碼跟導環境變量的默認密碼一致
su gaussdba
gsql neutron
- 登錄數據庫后,執行以下命令查詢該虛擬網卡的綁定層次。
select * from ml2_port_binding_levels where port_id='<port_id>';
再次執行以下命令,查詢層次化綁定的segmentation_id,即vlan。
select * from ml2_network_segments where id='<segment_id>';
如上圖,ID為ca7f83b4-cca1-4b0f-81f7-7f3df4c0facf的端口進行了兩層綁定,0層為AC綁定,1層為ovs綁定。虛擬機在主機上通信走vlan網絡,vlan號為 617 ,物理網絡平面為 physnet1 。 如果vxlan網絡下的虛擬機只有一層綁定,或者在虛擬機所在主機的物理口進行抓包所帶vlan與在數據庫中查詢到的segmentation_id不一致,找AC同事進行定位。
openstack層次化端口綁定特性(Hierarchical Port Binding)通過在不同的計算節點服務器上建立各自獨立的VLAN到VXLAN映射表項,實現VXLAN(二層網絡域)數量4096個的突破。
為了實現這個功能,需要在計算節點和接入交換機上使能LLDP,使得控制器可以建立計算節點服務器和LEAF設備接入端口的對應關系。
常規機架式服務器計算節點正常配置LLDP即可,但是當LEAF交換機下面連接的是刀框式服務器情況就有點特殊了。刀框上的刀片服務器通過刀框上自帶的接入模塊上聯到LEAF接入交換機上。接入模塊通常分為兩種:交換機或者網絡直通模塊。其中直通模塊效果上可以理解為網線擴展。
在刀框上接入模塊是交換機的時候,由於LEAF交換機需要和計算節點建立LLDP鄰居,那么中間的刀框交換機就需要配置為LLDP報文透傳。
配置步驟
可能我們會配置STP生成樹報文透傳,只需要在交換機上配置
[SWA]undo stp global enable
即可,由於關閉了STP,STP協議報文不會再上送CPU處理,被正常業務報文處理。
那么LLDP報文透傳也是這么配置嗎?其實稍有區別:
全局關閉LLDP:
[SWA]undo lldp global enable
接口下開啟LLDP報文透傳:
[SWA]l2protocol lldp tunnel dot1q
(一定要配置)
配置關鍵點
完成上述配置后LLDP報文可以在刀框交換機上透傳,並可以用VLAN技術進行隔離。可以正常配置Openstack 層次換端口綁定特性。