1、Overlay網(wǎng)絡(luò)與SDN
VXLAN(虛擬可擴(kuò)展局域網(wǎng)),是一種虛擬化隧道通信技術(shù)。它是一種Overlay(覆蓋網(wǎng)絡(luò))技術(shù),通過三層的網(wǎng)絡(luò)來搭建虛擬的二層網(wǎng)絡(luò)。
對計(jì)算機(jī)網(wǎng)絡(luò)或者Kubernetes網(wǎng)絡(luò)稍有了解的工程師都應(yīng)該聽說過延展網(wǎng)絡(luò)(OverlayNetwork),Overlay網(wǎng)絡(luò)其實(shí)并不是一門新技術(shù),它是指構(gòu)建在另一個(gè)網(wǎng)絡(luò)上的計(jì)算機(jī)網(wǎng)絡(luò),這是一種網(wǎng)絡(luò)虛擬化技術(shù)的形式,近年來云計(jì)算虛擬化技術(shù)的演進(jìn)促進(jìn)了網(wǎng)絡(luò)虛擬化技術(shù)的應(yīng)用。
因?yàn)镺verlay網(wǎng)絡(luò)是建立在另一個(gè)計(jì)算機(jī)網(wǎng)絡(luò)之上的虛擬網(wǎng)絡(luò),所以它不能獨(dú)立出現(xiàn),Overlay底層依賴的網(wǎng)絡(luò)就是Underlay網(wǎng)絡(luò),這兩個(gè)概念也經(jīng)常成對出現(xiàn)。
Underlay網(wǎng)絡(luò)是專門用來承載用戶IP流量的基礎(chǔ)架構(gòu)層,它與Overlay網(wǎng)絡(luò)之間的關(guān)系有點(diǎn)類似物理機(jī)和虛擬機(jī)。Underlay網(wǎng)絡(luò)和物理機(jī)都是真正存在的實(shí)體,它們分別對應(yīng)著真實(shí)存在的網(wǎng)絡(luò)設(shè)備和計(jì)算設(shè)備,而Overlay網(wǎng)絡(luò)和虛擬機(jī)都是依托在下層實(shí)體使用軟件虛擬出來的層級。
在分析Overlay網(wǎng)絡(luò)的作用之前,我們需要對它的常見實(shí)現(xiàn)有大概的了解,在實(shí)踐中我們一般會(huì)使用虛擬局域網(wǎng)擴(kuò)展技術(shù)(VirtualExtensibleLAN,VxLAN)組建Overlay網(wǎng)絡(luò)。在下圖中,兩個(gè)物理機(jī)可以通過三層的IP網(wǎng)絡(luò)互相訪問:
VxLAN使用虛擬隧道端點(diǎn)(VirtualTunnelEndPoint、VTEP)設(shè)備對服務(wù)器發(fā)出和收到的數(shù)據(jù)包進(jìn)行二次封裝和解封。
上圖中兩個(gè)VTEP會(huì)相互連接并獲得網(wǎng)絡(luò)中的MAC地址、IP地址等信息,例如,服務(wù)器1中的VTEP需要知道想要訪問綠色網(wǎng)絡(luò)中的10.0.0.2虛擬機(jī)需要先訪問IP地址為204.79.197.200的服務(wù)器2。這些配置可以被網(wǎng)絡(luò)管理員手動(dòng)配置、自動(dòng)學(xué)習(xí)、也可以通過上層的管理器設(shè)置。當(dāng)綠色的10.0.0.1虛擬機(jī)想要向綠色的10.0.0.2發(fā)送數(shù)據(jù)時(shí),會(huì)經(jīng)過以下幾個(gè)步驟:
1、綠色的10.0.0.1會(huì)將IP數(shù)據(jù)包發(fā)送給VTEP;
2、服務(wù)器1的VTEP收到10.0.0.1發(fā)送的數(shù)據(jù)包后;
從收到的IP數(shù)據(jù)包中獲取目的虛擬機(jī)的MAC地址;
在本地的轉(zhuǎn)發(fā)表中查找該MAC地址所在服務(wù)器的IP地址,即204.79.197.200;
將綠色虛擬機(jī)所在的虛擬網(wǎng)絡(luò)標(biāo)識(shí)符(VxLANNetworkIdentifier、VNI)以及原始的IP數(shù)據(jù)包作為負(fù)載,構(gòu)建新的UDP數(shù)據(jù)包;
將新的UDP數(shù)據(jù)包發(fā)送到網(wǎng)絡(luò)中;
3、服務(wù)器2的VTEP收到UDP數(shù)據(jù)包后;
4、綠色的10.0.0.2會(huì)收到綠色服務(wù)器10.0.0.1發(fā)送的數(shù)據(jù)包;
在數(shù)據(jù)包的傳輸過程中,通信的雙方都不知道底層網(wǎng)絡(luò)做的這些轉(zhuǎn)換,它們認(rèn)為兩者可以通過二層的網(wǎng)絡(luò)互相訪問,但是實(shí)際上經(jīng)過了三層IP網(wǎng)絡(luò)的中轉(zhuǎn),通過VTEP之間建立的隧道實(shí)現(xiàn)了連通。除了VxLAN之外,Overlay網(wǎng)絡(luò)還有很多實(shí)現(xiàn)方案,不過也都大同小異。Overlay網(wǎng)絡(luò)雖然能夠利用底層網(wǎng)絡(luò)在多數(shù)據(jù)中心之間組成二層網(wǎng)絡(luò),但是它的封包和拆包過程也會(huì)帶來額外開銷,所以為什么我們的集群需要Overlay網(wǎng)絡(luò)呢,本文將介紹Overlay網(wǎng)絡(luò)解決的三個(gè)問題:
云計(jì)算中集群內(nèi)的、跨集群的或者數(shù)據(jù)中心間的虛擬機(jī)和實(shí)例的遷移比較常見;
單個(gè)集群中的虛擬機(jī)規(guī)?赡芊浅4螅罅康腗AC地址和ARP請求會(huì)為網(wǎng)絡(luò)設(shè)備帶來巨大的壓力;
傳統(tǒng)的網(wǎng)絡(luò)隔離技術(shù)VLAN只能建立4096個(gè)虛擬網(wǎng)絡(luò),公有云以及大規(guī)模的虛擬化集群需要更多的虛擬網(wǎng)絡(luò)才能滿足網(wǎng)絡(luò)隔離的需求;
2、VXLAN協(xié)議原理
VXLAN有幾個(gè)常見的術(shù)語:
VXLAN網(wǎng)絡(luò)的邊緣設(shè)備,用來進(jìn)行VXLAN報(bào)文的處理(封包和解包)。VTEP可以是網(wǎng)絡(luò)設(shè)備(比如交換機(jī)),也可以是一臺(tái)機(jī)器(比如虛擬化集群中的宿主機(jī))。
VNI是每個(gè)VXLAN段的標(biāo)識(shí),是個(gè)24位整數(shù),一共有16777216,一般每個(gè)VNI對應(yīng)一個(gè)租戶,也就是說使用VXLAN搭建的公有云可以理論上可以支撐千萬級別的租戶。
隧道是一個(gè)邏輯上的概念,在VXLAN模型中并沒有具體的物理實(shí)體向?qū)?yīng)。隧道可以看做是一種虛擬通道,VXLAN通信雙方認(rèn)為自己是在直接通信,并不知道底層網(wǎng)絡(luò)的存在。從整體來說,每個(gè)VXLAN網(wǎng)絡(luò)像是為通信的虛擬機(jī)搭建了一個(gè)單獨(dú)的通信通道,也就是隧道。
上圖所示為VXLAN的工作模型,它創(chuàng)建在原來的IP網(wǎng)絡(luò)(三層)上,只要是三層可達(dá)(能夠通過IP相互通信)的網(wǎng)絡(luò)就能部署VXLAN。在VXLAN網(wǎng)絡(luò)的每個(gè)端點(diǎn)都有一個(gè)VTEP設(shè)備,負(fù)責(zé)VXLAN協(xié)議報(bào)文的解包和封包,也就是在虛擬報(bào)文上封裝VTEP通信的報(bào)文頭部。
物理網(wǎng)絡(luò)上可以創(chuàng)建多個(gè)VXLAN網(wǎng)絡(luò),可以將這些VXLAN網(wǎng)絡(luò)看成一個(gè)隧道,不同節(jié)點(diǎn)上的虛擬機(jī)/容器能夠通過隧道直連。通過VNI標(biāo)識(shí)不同的VXLAN網(wǎng)絡(luò),使得不同的VXLAN可以相互隔離。
VXLANHeader:在原始二層幀的前面增加8字節(jié)的VXLAN的頭部,其中最主要的是VNID,占用3個(gè)字節(jié)(即24bit),類似VLANID,可以具有$2^{24}$個(gè)網(wǎng)段。
UDPHeader:在VXLAN和原始二層幀的前面使用8字節(jié)UDP頭部進(jìn)行封裝(MACINUDP),目的端口號缺省使用4789,源端口按流隨機(jī)分配(通過MAC,IP,四層端口號進(jìn)行hash操作),這樣可以更好的做ECMP。
IANA(
InternetAs-signedNumbersAutority)分配了4789作為VXLAN的默認(rèn)目的端口號。
在上面添加的二層封裝之后,再添加底層網(wǎng)絡(luò)的IP頭部(20字節(jié))和MAC頭部(14字節(jié)),這里的IP和MAC是宿主機(jī)的IP地址和MAC地址。
同時(shí),這里需要注意MTU的問題,傳統(tǒng)網(wǎng)絡(luò)MTU一般為1500,這里加上VXLAN的封裝多出的(36+14/18,對于14的情況為access口,省去了4字節(jié)的VLANTag)50或54字節(jié),需要調(diào)整MTU為1550或1554,防止頻繁分包。
VXLAN的Flood與Learn:
總的來說,VXLAN報(bào)文的轉(zhuǎn)發(fā)過程就是:原始報(bào)文經(jīng)過VTEP,被Linux內(nèi)核添加上VXLAN頭部以及外層的UDP頭部,再發(fā)送出去,對端VTEP接收到VXLAN報(bào)文后拆除外層UDP頭部,并根據(jù)VXLAN頭部的VNI把原始報(bào)文發(fā)送到目的服務(wù)器。但這里有一個(gè)問題,第一次通信前雙方如何知道所有的通信信息?這些信息包括:
第一個(gè)問題簡單,VTEP通常由網(wǎng)絡(luò)管理員來配置。要回答后面兩個(gè)問題,還得回到VXLAN協(xié)議的報(bào)文上,看看一個(gè)完整的VXLAN報(bào)文需要哪些信息:
內(nèi)層報(bào)文:通信雙方的IP地址已經(jīng)明確,只需要VXLAN填充對方的MAC地址,因此需要一個(gè)機(jī)制來實(shí)現(xiàn)ARP功能。
VXLAN頭部:只需要知道VNI。一般直接配置在VTEP上,要么提前規(guī)劃,要么根據(jù)內(nèi)層報(bào)文自動(dòng)生成。
UDP頭部:需要知道源端口和目的端口,源端口由系統(tǒng)自動(dòng)生成,目的端口默認(rèn)是4789。
IP頭部:需要知道對端VTEP的IP地址,這個(gè)是最關(guān)鍵的部分。
實(shí)際上,VTEP也會(huì)有自己的轉(zhuǎn)發(fā)表,轉(zhuǎn)發(fā)表通過泛洪和學(xué)習(xí)機(jī)制來維護(hù),對于目標(biāo)MAC地址在轉(zhuǎn)發(fā)表中不存在的未知單播,廣播流量,都會(huì)被泛洪給除源VTEP外所有的VTEP,目標(biāo)VTEP響應(yīng)數(shù)據(jù)包后,源VTEP會(huì)從數(shù)據(jù)包中學(xué)習(xí)到MAC,VNI和VTEP的映射關(guān)系,并添加到轉(zhuǎn)發(fā)表中,后續(xù)當(dāng)再有數(shù)據(jù)包轉(zhuǎn)發(fā)到這個(gè)MAC地址時(shí),VTEP會(huì)從轉(zhuǎn)發(fā)表中直接獲取到目標(biāo)VTEP地址,從而發(fā)送單播數(shù)據(jù)到目標(biāo)VTEP。
VTEP轉(zhuǎn)發(fā)表的學(xué)習(xí)可以通過以下兩種方式:
3、Overlay與SDN
在使用VxLAN搭建的Overlay網(wǎng)絡(luò)中,網(wǎng)絡(luò)會(huì)將虛擬機(jī)發(fā)送的數(shù)據(jù)重新封裝成IP數(shù)據(jù)包,這樣網(wǎng)絡(luò)只需要知道不同VTEP的MAC地址,由此可以將MAC地址表項(xiàng)中的幾十萬條數(shù)據(jù)降低到幾千條,ARP請求也只會(huì)在集群中的VTEP之間擴(kuò)散,遠(yuǎn)端的VTEP將數(shù)據(jù)拆包后也僅會(huì)在本地廣播,不會(huì)影響其他的VTEP,雖然這對于集群中的網(wǎng)絡(luò)設(shè)備仍然有較高的要求,但是已經(jīng)極大地降低了核心網(wǎng)絡(luò)設(shè)備的壓力。
Overlay網(wǎng)絡(luò)其實(shí)與軟件定義網(wǎng)絡(luò)(Software-definednetworking、SDN)密切相關(guān),而SDN引入了數(shù)據(jù)平面和控制平面,其中數(shù)據(jù)平面負(fù)責(zé)轉(zhuǎn)發(fā)數(shù)據(jù),而控制平面負(fù)責(zé)計(jì)算并分發(fā)轉(zhuǎn)發(fā)表。VxLAN的RFC7348中只定義了數(shù)據(jù)平面的內(nèi)容,由該技術(shù)組成的網(wǎng)絡(luò)可以通過傳統(tǒng)的自學(xué)習(xí)模式學(xué)習(xí)網(wǎng)絡(luò)中的MAC與ARP表項(xiàng)5,但是在大規(guī)模的集群中,我們?nèi)匀恍枰肟刂破矫娣职l(fā)路由轉(zhuǎn)發(fā)表。
4、總結(jié)
Overlay網(wǎng)絡(luò)只是一種在物理網(wǎng)絡(luò)上的虛擬網(wǎng)絡(luò),使用該技術(shù)并不能直接解決集群中的規(guī)模性等問題,而VxLAN也不是組建Overlay網(wǎng)絡(luò)的唯一方法,在不同場景中我們可以考慮使用不同的技術(shù),例如:NVGRE、GRE、STT等。