VXLAN與EVPN的結(jié)合使用
EVPN是近幾年最熱門(mén)的網(wǎng)絡(luò)技術(shù)之一。如果你還沒(méi)聽(tīng)過(guò)EVPN,你的網(wǎng)絡(luò)技能可能已經(jīng)落伍了,趕緊看看之前的《EVPN簡(jiǎn)介》吧!EVPN全稱(chēng)是Ethernet VPN,從名字上看是一個(gè)L2 VPN的實(shí)現(xiàn)。實(shí)際上在最開(kāi)始提出時(shí),也是用作L2 VPN,號(hào)稱(chēng)是next generation L2 VPN,對(duì)原有的VPLS(Virtual Private LAN Service)進(jìn)行改進(jìn)。所以最開(kāi)始的EVPN,是一套跨WAN(Wide Area Network)的L2 VPN的控制層和數(shù)據(jù)層技術(shù),數(shù)據(jù)層特指的就是MPLS。所有的這些在EVPN簡(jiǎn)介中都有介紹,今天我們來(lái)看一個(gè)EVPN應(yīng)用的變化,將EVPN的控制層與VXLAN結(jié)合。
EVPN作為控制層,通常可以對(duì)接三種數(shù)據(jù)層,MPLS,PBB和NVO。NVO(Network Virtualization Overlay),這一分類(lèi)包含了VXLAN(Virtual eXtensible LAN)。
傳統(tǒng)的VXLAN工作方式
VXLAN是一種Overlay網(wǎng)絡(luò)技術(shù),我相信大家對(duì)Overlay和VXLAN已經(jīng)有一定的了解了,所以,我不在這對(duì)Overlay和VXLAN做解釋。我們直接看一下VXLAN網(wǎng)絡(luò)是如何工作的。
VTEP
首先看看VXLAN網(wǎng)絡(luò)中的重要組成部分,VTEP(VXLAN Tunnel Endpoint)。VTEP是一個(gè)網(wǎng)絡(luò)設(shè)備VXLAN數(shù)據(jù)是在VTEP之間傳遞。從邏輯上看,VTEP包含了兩個(gè)接口:uplink和downlink。Uplink連接Underlay網(wǎng)絡(luò),原始數(shù)據(jù)封裝成VXLAN格式通過(guò)uplink在Underlay網(wǎng)絡(luò)上傳輸;downlink連接Overlay網(wǎng)絡(luò),原始數(shù)據(jù)從downlink傳入傳出。所以,VTEP可以看成是一個(gè)連接Overlay和Underlay網(wǎng)絡(luò)的edge設(shè)備。
舉個(gè)例子,當(dāng)Overlay中VLAN100數(shù)據(jù)包通過(guò)downlink發(fā)送至VTEP,首先會(huì)映射到VXLAN ID 1001。在這之后,VTEP根據(jù)原始數(shù)據(jù)包的目的MAC地址和剛剛轉(zhuǎn)換獲得的VXLAN ID,在VTEP L2 Table中查找對(duì)應(yīng)的Remote VTEP,如果能找到,就原始的Ethernet Frame封裝成VXLAN數(shù)據(jù)包,再通過(guò)uplink發(fā)送出去。
對(duì)端VTEP的uplink收到了VXLAN數(shù)據(jù)包,解封裝獲得原始的Ethernet Frame,再將VXLAN ID與VLAN ID做映射,加入VLAN100的信息,最后數(shù)據(jù)包再通過(guò)downlink發(fā)送出去。這樣,兩個(gè)VTEP下的VLAN 100網(wǎng)絡(luò)相當(dāng)于是連通的。(注:雖然這里都是VLAN 100,但是實(shí)際上兩個(gè)VTEP下對(duì)同一個(gè)VXLAN ID對(duì)應(yīng)的VLAN ID可以不一樣)
原始的Ethernet Frame被封裝成了一個(gè)IP/UDP packet,數(shù)據(jù)的傳輸變成了VTEP之間的IP/UDP packet傳輸,VTEP之間可以是二層網(wǎng)絡(luò),三層網(wǎng)絡(luò),甚至更復(fù)雜,但是這對(duì)VLAN100是透明的。
flood-learn
前面的例子中,如果VTEP L2 Table中沒(méi)有找到對(duì)應(yīng)的Remote VTEP,那就要通過(guò)flood-learn來(lái)獲得對(duì)端的VTEP。
為了更好的描述flood-learn,我們假設(shè)最左側(cè)虛機(jī)已經(jīng)知道目的MAC了(VTEP中的L2 Table已經(jīng)老化,虛機(jī)中的ARP cache還沒(méi)老化)。當(dāng)最左側(cè)虛機(jī)想ping最右側(cè)虛機(jī),ping包送到VTEP,因?yàn)樵赩TEP中找不到對(duì)應(yīng)的Remote VTEP,VTEP會(huì)做如下操作:
原始的Ethernet Frame被封裝成VXLAN格式,VXLAN包的外層目的IP地址為組播地址。
VXLAN數(shù)據(jù)包被發(fā)送給組播內(nèi)所有其他VTEP。
其實(shí)這就是flood過(guò)程。因?yàn)榻M播內(nèi)所有VTEP都是接收方,最右側(cè)虛機(jī)可以受到組播的ping包。最右側(cè)的VTEP首先從ping包中學(xué)習(xí)到了最左側(cè)虛機(jī)的MAC地址,VXLAN ID和對(duì)應(yīng)的VTEP。因?yàn)橛辛诉@些信息,當(dāng)最右側(cè)虛機(jī)返回時(shí),會(huì)直接發(fā)送到最左側(cè)VTEP。這樣最左側(cè)VTEP也能從返回包中學(xué)習(xí)到最右側(cè)虛機(jī)的MAC地址,VXLAN ID和對(duì)應(yīng)的VTEP,并記錄在自己的L2 Table中,這就是learn過(guò)程。與交換機(jī)中的flood-learn不一樣的是,交換機(jī)中記錄的是對(duì)應(yīng)的交換機(jī)端口和MAC的關(guān)系,這里記錄的是Remote VTEP(IP Address)和MAC的關(guān)系。
下次最左側(cè)虛機(jī)想訪(fǎng)問(wèn)最右側(cè)虛機(jī),不需要再flood,直接查VTEP L2 Table就能找到對(duì)應(yīng)的remote VTEP。
所以從這里看出,VXLAN的轉(zhuǎn)發(fā)信息,也是通過(guò)數(shù)據(jù)層的flood-learn獲取,VXLAN不需要一個(gè)控制層也能工作,這與VPLS的情況很像啊!
EVPN control plane
VXLAN由RFC7348定義,在RFC中,只定義了數(shù)據(jù)層的行為,并沒(méi)有指定VXLAN控制層。在VXLAN技術(shù)早期,通過(guò)數(shù)據(jù)層的來(lái)獲取轉(zhuǎn)發(fā)信息,在實(shí)現(xiàn)上較為簡(jiǎn)單,相應(yīng)的技術(shù)門(mén)檻較低,有利于廠(chǎng)商實(shí)現(xiàn)VXLAN。但是隨著網(wǎng)絡(luò)規(guī)模的發(fā)展,完全依賴(lài)數(shù)據(jù)層做控制會(huì)造成網(wǎng)絡(luò)中廣播組播風(fēng)暴,因此VXLAN也需要有一個(gè)控制層。
SDN controller也可以作為VXLAN的控制層,OpenStack中普遍用SDN controller控制OpenVSwitch,VTEP直接通過(guò)OVSDB和OpenFlow流表進(jìn)行管理。這些內(nèi)容很有意思,功能也很強(qiáng)大,不過(guò)跟本文是兩件事情,本文只討論EVPN作為控制層的情況。
EVPN作為NVO的控制層由IETF草案:draft-ietf-bess-evpn-overlay定義。上一篇講了EVPN的實(shí)現(xiàn)是參考了BGP/MPLS L3 VPN,那么EVPN作為VXLAN的控制層時(shí),仍然采用相同的架構(gòu),只是架構(gòu)的組成元素發(fā)生了改變。
具體的變換包括了:
- PE設(shè)備變成了VTEP,有的時(shí)候也稱(chēng)為NVE(Network Virtualization Endpoint)。相應(yīng)的MP-BGP連接也建立在VTEP之間。
- 數(shù)據(jù)層變成了VXLAN,VXLAN是在Underlay網(wǎng)絡(luò)傳輸。
- CE設(shè)備變成了Server,這里可以是Virtual Server也可以是Physical Server。
控制層數(shù)據(jù)傳輸
與傳統(tǒng)的EVPN基本一致,Server到VTEP還是通過(guò)local learning,VTEP通過(guò)讀取Ethernet Frame獲得本地連接設(shè)備的MAC地址和對(duì)應(yīng)的端口。VTEP之間通過(guò)MP-BGP傳輸Route Type 2的MAC/IP route。這里有點(diǎn)不一樣,以MPLS為數(shù)據(jù)層時(shí),MAC/IP route傳輸?shù)氖荕PLS Label,而以VXLAN為數(shù)據(jù)層時(shí),MAC/IP route傳輸?shù)氖荲XLAN ID。正好VXLAN ID也是3個(gè)字節(jié),能夠匹配原來(lái)MPLS Label的空間。相應(yīng)的NLRI信息如下:
MAC/IP route通過(guò)MP-BGP傳輸?shù)綄?duì)端VTEP?,F(xiàn)實(shí)中要求BGP連接是full mesh(任意兩兩互連),而為了減輕配置壓力,通常會(huì)引入BGP RR(Router Reflector)。BGP RR的作用是將一個(gè)BGP Speaker的數(shù)據(jù)反射給所有其他連接的BGP peer。使用BGP RR可以使得所有的BGP Speaker只需與BGP RR建立連接,否則按照f(shuō)ull mesh,任意一個(gè)BGP Speaker必須與其他所有的BGP peer建立BGP連接。
所以,在有BGP RR的環(huán)境中,網(wǎng)絡(luò)拓?fù)淙缦聢D所示,是不是跟Spine-Leaf的網(wǎng)絡(luò)結(jié)構(gòu)很像?
所有的VTEP學(xué)習(xí)到本地的MAC地址之后,通過(guò)MP-BGP發(fā)送給BGP RR。BGP RR再將收到的MAC轉(zhuǎn)發(fā)信息,發(fā)送給所有其他的VTEP。經(jīng)過(guò)BGP RR的反射之后,各個(gè)VTEP已經(jīng)有了所有其他VTEP的MAC轉(zhuǎn)發(fā)信息,如下圖所示:
看一看圖中各個(gè)VTEP的L2 Table,第一列是MAC地址,第二列是對(duì)應(yīng)的Remote VTEP(遠(yuǎn)端MAC)或者當(dāng)前VTEP連接的端口(本地MAC),第三列是VXLAN ID,這三列在介紹VTEP時(shí)說(shuō)過(guò)。第四列是用來(lái)做MAC Mobility,也就是MAC遷移用的,這個(gè)稍后單獨(dú)介紹。
就這樣,控制層數(shù)據(jù)分發(fā)到了各個(gè)VTEP。
數(shù)據(jù)層數(shù)據(jù)傳輸
有了控制層數(shù)據(jù),數(shù)據(jù)層就簡(jiǎn)單多了。Server A想訪(fǎng)問(wèn)Server B,通過(guò)查找本地VTEP L2 Table找到VTEP2,再封裝成VXLAN數(shù)據(jù)發(fā)送到VTEP2,VTEP2將VXLAN解封裝,轉(zhuǎn)發(fā)給本地的Server B。所以可以看出,從數(shù)據(jù)層面角度來(lái)看,有沒(méi)有EVPN效果都是一樣的。EVPN只負(fù)責(zé)VXLAN的控制層面,也就是MAC轉(zhuǎn)發(fā)信息的傳輸,對(duì)VXLAN數(shù)據(jù)層面沒(méi)有影響。
EVPN作為VXLAN的控制層面就是這樣了,是不是也不太復(fù)雜?接下來(lái)看一看MAC Mobility。
MAC Mobility
MAC Mobility在RFC7432中已經(jīng)定義,也就是說(shuō)這不是為VXLAN專(zhuān)門(mén)定義的。先來(lái)看看MAC Mobility解決了什么問(wèn)題?
現(xiàn)實(shí)中,經(jīng)常會(huì)面臨Server遷移的場(chǎng)景,例如虛機(jī)遷移,物理機(jī)房的改造造成的遷移。以上圖為例,當(dāng)Server A從VTEP1遷移到了VTEP3,VTEP3通過(guò)本地?cái)?shù)據(jù)層面的學(xué)習(xí)(讀取ARP或者DHCP的Ethernet Header),發(fā)現(xiàn)了Server A。本來(lái)VTEP3上的MP-BGP進(jìn)程應(yīng)該將這個(gè)新學(xué)習(xí)的MAC通過(guò)Route type 2發(fā)送給其他VTEP。但是現(xiàn)在有幾個(gè)問(wèn)題。首先,VTEP3本身已經(jīng)有了Server A的MAC轉(zhuǎn)發(fā)信息,表明了Server A在VTEP1上,那么VTEP3本地?cái)?shù)據(jù)已經(jīng)有了沖突了。其次,VTEP1和VTEP2中也有Server A的MAC轉(zhuǎn)發(fā)信息,它們將如何處理VTEP3發(fā)出來(lái)的Server A的轉(zhuǎn)發(fā)信息。你可以說(shuō),后來(lái)的覆蓋先來(lái)的,但是EVPN,或者M(jìn)P-BGP,這是一個(gè)L7的協(xié)議,后來(lái)的不一定是更新的數(shù)據(jù)。比如,Server A遷移到VTEP3,VTEP3本地學(xué)習(xí)到了Server A的MAC,并發(fā)送出去,VTEP2收到了這個(gè)信息,但是由于網(wǎng)絡(luò)阻塞,VTEP1關(guān)于Server A的信息過(guò)了一會(huì)也發(fā)送到了VTEP2。如果后來(lái)的覆蓋前面的,那這時(shí)就是舊的信息覆蓋了新的信息。
在說(shuō)解決方案之前,先回顧一下EVPN新增的MP-BGP Route type和BGP Extended community。
MAC Mobility就是基于圖中標(biāo)注的Extended community實(shí)現(xiàn)。BGP Extended community是跟隨在BGP NLRI信息之后的輔助信息,像RT(Route Target)就是最常用的一種BGP Extended community。MAC Mobility Extended Community的格式定義如下:
所以,具體工作過(guò)程是這樣,當(dāng)VTEP通過(guò)本地的數(shù)據(jù)層學(xué)習(xí)獲得了一個(gè)MAC地址,如果本地的L2 Table中沒(méi)有這條MAC地址的記錄,那么VTEP接下來(lái)發(fā)布的MAC/IP route會(huì)帶上一份MAC Mobility Extended Community,其中的Sequence Number是0。(也可以不帶,這樣默認(rèn)就是0)這也就是上面示意圖中第四列中的0的意義。
當(dāng)VTEP通過(guò)本地的數(shù)據(jù)層學(xué)習(xí)獲得了一個(gè)MAC地址,如果本地的L2 Table中已經(jīng)有這條MAC地址的記錄,那么VTEP首先會(huì)更新自己的L2 Table,將之前的MAC轉(zhuǎn)發(fā)信息覆蓋。之后VTEP發(fā)布的MAC/IP route必然會(huì)帶上一份MAC Mobility Extended Community,其中的Sequence Number是原有記錄的數(shù)值加1。這樣,當(dāng)其他的VTEP收到了這條MAC/IP route,對(duì)比本地記錄,就會(huì)發(fā)現(xiàn),這是一條更新的MAC轉(zhuǎn)發(fā)信息,原有記錄會(huì)被覆蓋。如果VTEP收到的MAC/IP route中的Sequence Number小于當(dāng)前記錄的信息,那么這條MAC/IP route會(huì)被丟棄。
MAC Mobility中的Sequence Number可以看成是MAC轉(zhuǎn)發(fā)信息的版本號(hào),高版本可以覆蓋低版本。
從另一個(gè)角度看,如果沒(méi)有控制層的MAC Mobility機(jī)制,那么Server遷移之后,只能等L2 Table中的表項(xiàng)老化以后,重新flood-learn才能獲得更新之后的MAC轉(zhuǎn)發(fā)信息,這樣的時(shí)間相對(duì)要長(zhǎng)很多。這就是EVPN作為控制層帶來(lái)的好處之一。
最后
EVPN的提出是作為下一代L2 VPN。L2 VPN實(shí)際上是在WAN上的一個(gè)邏輯二層網(wǎng)絡(luò)。如果將L2 VPN與Overlay技術(shù),例如VXLAN做對(duì)比,其實(shí)有很多相似的地方。比如都是有Overlay和Underlay,Overlay都是L2網(wǎng)絡(luò),都有相應(yīng)的edge設(shè)備等等。正是這些相似之處,才會(huì)有將原本是L2 VPN的控制層的EVPN,用作Overlay網(wǎng)絡(luò),例如VXLAN網(wǎng)絡(luò)的控制層。VXLAN網(wǎng)絡(luò)配合EVPN作為控制層,不僅能減少網(wǎng)絡(luò)中的廣播與組播數(shù)量,而且能帶來(lái)EVPN作為控制層的一些優(yōu)點(diǎn),例如本文介紹的MAC Mobility。在一個(gè)VXLAN Fabric架構(gòu)中,采用EVPN做控制層,借助功能完善的BGP(確切說(shuō)是MP-BGP)協(xié)議,能夠高效的連接不同的POD,甚至連接不同的site。所以從這個(gè)角度來(lái)說(shuō),EVPN作為VXLAN的控制層的應(yīng)用,并不遜色與其作為L(zhǎng)2 VPN的應(yīng)用。
作者簡(jiǎn)介:肖宏輝,畢業(yè)于中科院研究生院,8年的工作經(jīng)驗(yàn),其中6年云計(jì)算開(kāi)發(fā)經(jīng)驗(yàn),OpenStack社區(qū)積極活躍,有超過(guò)300個(gè)commit和超過(guò)30000行代碼的貢獻(xiàn)。目前關(guān)注SDN/NFV等虛擬網(wǎng)絡(luò)技術(shù)。本文所有觀點(diǎn)僅代表作者個(gè)人觀點(diǎn),與作者現(xiàn)在或者之前所在的公司無(wú)關(guān)。