1. 程式人生 > >基於EVPN實現neutron的VxLan網路

基於EVPN實現neutron的VxLan網路

1.EVPN簡介

       EVPN全稱是Ethernet VPN,它最開始由RFC7432定義,RFC的全稱是:BGP MPLS-BasedEthernet VPN,從名字上看,這是一個基於BGPMPLSL2 VPNEVPN架構是在現有的BGP VPLSRFC4761)方案上,參考了BGP/MPLS L3 VPNRFC4364)的架構提出的。我們知道SDN架構是控制資料分離,應用在控制層之上構建。對於EVPN來說,控制層是MP-BGP,而EVPN可以看成是構建在MP-BGP上的應用。MBGP有兩個主要的工作,為路由指定特定網路層協議的下一跳和NLRI(網路層可達資訊)。


所以

EVPN不僅僅是一種技術和架構,它也有應用場景的定義。更具體的說,EVPN不僅定義了L2 VPN的一種改進方案,還定義了各個應用場景下的行為,像multi-homingfast convergenceauto-discoveryMAC mobility等等,這些場景都非常有意思。隨著EVPN技術的討論,EVPN也被用來傳遞IP路由資訊,作為VXLANoverlay網路的控制層,用來作為資料中心互聯的控制層等。

 


EVPN組網架構圖

         OpenStackneutron組網,一般是計算節點上部署OpenvSwitchVTEP,通過 VxLan 跑資料平面。簡單說下原理,首先我們基於

OVS實現的VxLan隧道,由Neutron收集所有Agent建立 VxLan隧道,然後 VTEP因為不知道其後的VIF的地址,所以只能依賴 Flood & learn來學習應該往哪個隧道轉發。ARP廣播也沒有機制實現代理,所以效率和 BUM都成問題。總結一下:

基於FloodVxLan效率低

基於軟體實現的L2Gateway無法承擔較大的workload

neutron Legacy架構的路由是中心化的

本文所寫的是基於EVPN的解決方案,其實核心思想主要是可達資訊的互換,制定一個控制平面,具體可以看 RFC。基於spine-leaf的組網拓撲如下所示:


資料中心分散式組網圖

         spine交換機做BGP路由反射器,leaf上移植了oslo的一些公共庫,作為agent端,主要負責下發evpn配置,通過rpc與neutron-server進行通訊。 控制節點上安裝自己實現的Plugin,主要把ml2和L3的事件,通知到到agent上。

2. EVPN-Plugin

實現自己的Plugin:

         網路層面上,主要實現功能利用 Ml2的分層繫結機制來配置交換機和OVS ;

         路由層面上,實現VRF的分配機制,並將VRF分配情況記錄在資料庫中。

         Plugin要檢測交換機上L2agent的report state報文,並記錄在資料庫中。

如果想利用交換機的EVPN特性,那首先必須知道組網拓撲。

2.1 收集組網拓撲

         利用LLDP鏈路發現協議收集鄰居拓撲,然後記錄到資料庫裡面。對於分散式組網,這兒有兩種方式,一種是交換機側去收集鄰居拓撲並通過RPC,上報給neutron,然後再記錄在資料庫。另外一種是伺服器直接收集鄰居資訊,直接記錄在資料庫裡面。

         我們在交換機上擴充套件了LLDP,支援私有資訊,出於其他功能的考慮,比如監控整個組網拓撲,而不是簡單的獲取openstack的節點的鄰居拓撲,我們實際上是在leaf交換機收集鄰居資訊,然後把鄰居拓撲資訊上報給neutron。

         因為在組網裡面,不管有leaf,伺服器,還有spine。spine的作用是實現bgp的反射器,來控制建立vxlan的tunnel。我們在LLDP報文裡面攜帶了裝置角色的私有TLV,來區分上下行裝置。然後由一臺主spine的裝置,依次去各個交換機上獲取其鄰居拓撲,然後計算出整個組網拓撲。

         伺服器我們的EVPN-Plugin

2.2 實現自己的mechanism機制

         這兒為了避免修改原始碼,實際上是複用的ml2分層繫結機制。

ML2分層埠繫結(ML2Hierarchical Port Binding)

         在OpenstackNeutron的liberty版本ML2機制driver已經支援分層網路拓撲,每一層級網路拓撲都有各自的網路segment id。例如一個機制driver可以繫結一個靜態的網路VXLAN segment id值,因為與ToR交換機相連的計算節點需要動態的分配VLAN id,因此另一個機制driver,例如OVS,就可以繫結計算節點到需要的動態VLAN上。可參考

https://github.com/openstack/neutron-specs/blob/master/specs/kilo/ml2-hierarchical-port-binding.rst

                        +-------------+

                        |             |

                        | Core Switch |

                        |             |

                        +---+-----+---+

                VXLAN       |     |       VXLAN

                +-----------+     +------------+

                |                              |

         +------+-----+                 +------+-----+

         |            |                 |            |

         | ToR Switch |                 | ToR Switch |

         |            |                 |            |

         +---+---+----+                 +---+----+---+

     VLAN    |   |   VLAN           VLAN    |    |    VLAN

     +-------+   +----+                +----+    +------+

     |                |                |                |

+----+----+      +----+----+      +----+----+      +----+----+

|         |      |         |      |         |      |         |

| Compute |      | Compute |      | Compute |      | Compute |

| Node    |      | Node    |      | Node    |      | Node    |

|         |      |         |      |         |      |         |

+---------+      +---------+      +---------+      +---------+

         當ovs-agentbind_port時,kilo版本會查詢driver依次繫結,M版本之後就不再支援。這兒可以先呼叫自己的mechaism機制,將vxlan ID下發到交換機上,然後設定continue_binding變數,繼續將vlan ID繫結到ovs上。

3.Agent

         交換機上移植了agent的程式碼,同RPC與neutron-server進行通訊。實現了vxlan集中式,vxan分散式和vlan組網結構,其中vxlan分散式組網應用最廣。以vxlan分散式組網為例。

3.1 L2 agent

交換機leaf上實現l2 agent:

   1.當create-network時,下發vsi配置(vsi 虛擬交換例項),負責vtep,leaf之間建立tunnel

   2.當 network關聯router時,會將vsi例項繫結到VRF(VPN Routing & Forwarding Instance)上。



分散式EVPN閘道器示意圖

3.2 L3 agent

         利用VRF實現租戶路由的隔離,L3agent的主要功能是:分配VRF,生成RD和配置RT,VRF可以解決不同租戶裡面地址重複的問題。

 

VRF:在一臺PE上虛擬出來的一個路由器,包括一些特定的介面,一張路由表,一個路由協議,一個RD和一組RT規則。

RT:表明了一個VRF的路由喜好,通過他可以實現不同VRF之間的路由互通。他的本質就是BGP的community屬性。

RD:為了防止一臺PE接收到遠端PE發來的不同VRF的相同路由時不知所措,而加在路由前面的特殊資訊。在PE釋出路由時加上,在遠端PE接收到路由後放在本地路由表中,用來與後來接收到的路由進行比較。

4. underlay網路

4.1 獲取配置檔案

         交換機啟動後,管理介面會自動獲取DHCP報文。我們先來看下dhcp報文格式


這裡我們通過DHCP-server上指定引導檔名, 然後交換機從DHCP報文中解析出檔名。通過tftp去tftp-server上獲取對應的檔案,比如spine獲取spine的模板檔案,leaf獲取leaf對應的模板檔案。

         模板檔案上記錄著基本的資訊,比如使能lldp、配置telnet、netconf等等。使用者也可以自行新增。

4.2 收集全域性拓撲

         我們在交換機上擴充套件了LLDP,支援私有資訊。我們在LLDP報文裡面攜帶了裝置角色的私有TLV,來區分上下行裝置,即區分對端是spine、leaf或者其他角色。每臺裝置都維護著自己的鄰居拓撲,然後由一臺主spine的裝置,依次去各個交換機上獲取其鄰居拓撲,最後計算出整個組網拓撲,稱為全域性拓撲。

4.3 主spine分配LoopBack地址

         當全域性拓撲有新裝置加入時,通過netconf為其分配LoopBack 0地址。當有鄰居離開時,要回收其LoopBack 0地址。

         交換機相互連線的介面借用LoopBack0的地址,通過OSPF協議,實現三層網路的互通,作為neutron的Underlay網路。

4.4 其他自動化功能

         自動化功能的配置,都來源於配置檔案。通過Python自帶的模組ConfigParser 是解析配置檔案,讀取裡面的配置資訊。

      4.4.1支援自動更換交換機版本

         如果需要更換新版本,放置在ftp伺服器。裝置啟動時,首先檢測當前版本和伺服器側版本號是否一致,如果不一致,則會根據ftp協議去下載新版本。

         首先,會獲取ftp伺服器上裝置版本的大小,比計算交換機的儲存空間大小,如果發現空間不足,則會刪除一些無用的檔案,以達到預留的空間。但是有些ftp伺服器不支援查詢檔案的大小,那就根據裝置執行的版本大小來預估新版本的大小。

         然後,利用ftp協議去獲取新版本,下載完畢,解壓,安裝,重啟。

      4.4.2支援裝置的自動堆疊和BFDMAD檢測

         實際組網中,需要裝置的堆疊來實現高可用和擴充套件介面的數量。我們定義相同的角色的裝置直連時(此處靠LLDP的私有資訊傳遞角色來判斷),會下發觸發交換機的堆疊。

         當裝置堆疊完成以後,會配置BFD-MAD檢測堆疊分裂。

      4.4.3支援上下行裝置自動下發介面配置和聚合

         當裝置發現對端裝置是自己的上行或者下行裝置時(此處靠LLDP的私有資訊傳遞角色來判斷),會自動下發介面的配置。當介面的數量大於2個時,會下發聚合的配置,支援動態聚合和靜態聚合,當聚合鏈路離開是,刪除聚合組。