neutron 層次綁定 +binding_levels


 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信息。

 

 

華為層次綁定

http://support-it.huawei.com/docs/zh-cn/hcs-kb/netword-maintence-manual/maten_provision_00000356.html

 

 

網卡層次化綁定

概述中提到過AC插件會對vxlan網絡進行層次化綁定。AC會在每一台主機上給每一個vxlan網絡分配一個vlan, 該網絡下的虛擬機在主機上走vlan通信,在交換機上走vxlan通信。如何查詢AC綁定的vlan是多少呢?

F6.3&6.5部分版本已經將層次化綁定信息直接顯示在了port的信息中,如下圖,層次化綁定正常的話能看到vxlan和vlan的兩條信息

如果這里只顯示了一條vxlan的信息,可以直接找AC側定位為何層次化綁定異常

有的版本可能沒有任何顯示,這時候可以通過查數據庫的方法查看,如下:

  1. 登錄FusionSphere OpenStack后台控制節點執行以下命令,查詢gaussdb的主節點

    cps template-instance-list --service gaussdb gaussdb

  2. 登錄到步驟1查詢的gaussdb主節點,並進入neutron數據庫,密碼跟導環境變量的默認密碼一致

    su gaussdba

    gsql neutron

  3. 登錄數據庫后,執行以下命令查詢該虛擬網卡的綁定層次。

    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 層次換端口綁定特性。


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM