基於EVPN實現neutron的VxLan網路
1.EVPN簡介
EVPN全稱是Ethernet VPN,它最開始由RFC7432定義,RFC的全稱是:BGP MPLS-BasedEthernet VPN,從名字上看,這是一個基於BGP和MPLS的L2 VPN。EVPN架構是在現有的BGP VPLS(RFC4761)方案上,參考了BGP/MPLS L3 VPN(RFC4364)的架構提出的。我們知道SDN架構是控制資料分離,應用在控制層之上構建。對於EVPN來說,控制層是MP-BGP,而EVPN可以看成是構建在MP-BGP上的應用。MBGP有兩個主要的工作,為路由指定特定網路層協議的下一跳和NLRI(網路層可達資訊)。
所以
EVPN組網架構圖
OpenStack的neutron組網,一般是計算節點上部署OpenvSwitch做VTEP,通過 VxLan 跑資料平面。簡單說下原理,首先我們基於
l 基於Flood的VxLan效率低
l 基於軟體實現的L2Gateway無法承擔較大的workload
l 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個時,會下發聚合的配置,支援動態聚合和靜態聚合,當聚合鏈路離開是,刪除聚合組。