VXLAN(Virtual eXtensible Local Area Network,虛擬可擴(kuò)展局域網(wǎng)),是一種虛擬化隧道通信技術(shù)。它是一種 Overlay(覆蓋網(wǎng)絡(luò))技術(shù),通過(guò)三層的網(wǎng)絡(luò)來(lái)搭建虛擬的二層網(wǎng)絡(luò)。
簡(jiǎn)單來(lái)講,VXLAN 是在底層物理網(wǎng)絡(luò)(underlay)之上使用隧道技術(shù),借助 UDP 層構(gòu)建的 Overlay 的邏輯網(wǎng)絡(luò),使邏輯網(wǎng)絡(luò)與物理網(wǎng)絡(luò)解耦,實(shí)現(xiàn)靈活的組網(wǎng)需求。它對(duì)原有的網(wǎng)絡(luò)架構(gòu)幾乎沒(méi)有影響,不需要對(duì)原網(wǎng)絡(luò)做任何改動(dòng),即可架設(shè)一層新的網(wǎng)絡(luò)。也正是因?yàn)檫@個(gè)特性,很多 CNI 插件(Kubernetes 集群中的容器網(wǎng)絡(luò)接口,這個(gè)大家應(yīng)該都知道了吧,如果你不知道,現(xiàn)在你知道了)才會(huì)選擇 VXLAN 作為通信網(wǎng)絡(luò)。
VXLAN 不僅支持一對(duì)一,也支持一對(duì)多,一個(gè) VXLAN 設(shè)備能通過(guò)像網(wǎng)橋一樣的學(xué)習(xí)方式學(xué)習(xí)到其他對(duì)端的 IP 地址,還可以直接配置靜態(tài)轉(zhuǎn)發(fā)表。
一個(gè)典型的數(shù)據(jù)中心 VXLAN 網(wǎng)絡(luò)拓?fù)鋱D如圖所示:

其中 VM 指的是虛擬機(jī),Hypervisor 指的是虛擬化管理器。
1. 為什么需要 VXLAN?
與 VLAN 相比,VXLAN 很明顯要復(fù)雜很多,再加上 VLAN 的先發(fā)優(yōu)勢(shì),已經(jīng)得到了廣泛的支持,那還要 VXLAN 干啥?
VLAN ID 數(shù)量限制
VLAN tag 總共有 4 個(gè)字節(jié),其中有 12 bit 用來(lái)標(biāo)識(shí)不同的二層網(wǎng)絡(luò)(即 LAN ID),故而最多只能支持 ,即
4096 個(gè)子網(wǎng)的劃分。而虛擬化(虛擬機(jī)和容器)的興起使得一個(gè)數(shù)據(jù)中心會(huì)有成千上萬(wàn)的機(jī)器需要通信,這時(shí)候 VLAN 就無(wú)法滿(mǎn)足需求了。而 VXLAN 的報(bào)文 Header 預(yù)留了 24 bit 來(lái)標(biāo)識(shí)不同的二層網(wǎng)絡(luò)(即 VNI,VXLAN Network Identifier),即 3 個(gè)字節(jié),可以支持 個(gè)子網(wǎng)。
交換機(jī) MAC 地址表限制
對(duì)于同網(wǎng)段主機(jī)的通信而言,報(bào)文到底交換機(jī)后都會(huì)查詢(xún) MAC 地址表進(jìn)行二層轉(zhuǎn)發(fā)。數(shù)據(jù)中心虛擬化之后,VM 的數(shù)量與原有的物理機(jī)相比呈數(shù)量級(jí)增長(zhǎng),而應(yīng)用容器化之后,容器與 VM 相比也是呈數(shù)量級(jí)增長(zhǎng)。。。而交換機(jī)的內(nèi)存是有限的,因而 MAC 地址表也是有限的,隨著虛擬機(jī)(或容器)網(wǎng)卡 MAC 地址數(shù)量的空前增加,交換機(jī)表示壓力山大?。?/p>
而 VXLAN 就厲害了,它用 VTEP(后面會(huì)解釋?zhuān)⒍右蕴W(wǎng)幀封裝在 UDP 中,一個(gè) VTEP 可以被一個(gè)物理機(jī)上的所有 VM(或容器)共用,一個(gè)物理機(jī)對(duì)應(yīng)一個(gè) VTEP。從交換機(jī)的角度來(lái)看,只是不同的 VTEP 之間在傳遞 UDP 數(shù)據(jù),只需要記錄與物理機(jī)數(shù)量相當(dāng)?shù)?MAC 地址表?xiàng)l目就可以了,一切又回到了和從前一樣。
虛機(jī)或容器遷移范圍受限
VLAN 與物理網(wǎng)絡(luò)融合在一起,不存在 Overlay 網(wǎng)絡(luò),帶來(lái)的問(wèn)題就是虛擬網(wǎng)絡(luò)不能打破物理網(wǎng)絡(luò)的限制。舉個(gè)例子,如果要在 VLAN 100 部署虛擬機(jī)(或容器),那只能在支持 VLAN 100 的物理設(shè)備上部署。
VLAN 其實(shí)也有解決辦法,就是將所有的交換機(jī) Trunk 連接起來(lái),產(chǎn)生一個(gè)大的二層,這樣帶來(lái)的問(wèn)題就是廣播域過(guò)分?jǐn)U大,也包括更多未知的單播和多播,即 BUM(Broadcast,Unknown Unicast,Multicast),同時(shí)交換機(jī) MAC 地址表也會(huì)有承受不住的問(wèn)題。
而 VXLAN 將二層以太網(wǎng)幀封裝在 UDP 中(上面說(shuō)過(guò)了),相當(dāng)于在三層網(wǎng)絡(luò)上構(gòu)建了二層網(wǎng)絡(luò)。這樣不管你物理網(wǎng)絡(luò)是二層還是三層,都不影響虛擬機(jī)(或容器)的網(wǎng)絡(luò)通信,也就無(wú)所謂部署在哪臺(tái)物理設(shè)備上了,可以隨意遷移。
總的來(lái)說(shuō),傳統(tǒng)二層和三層的網(wǎng)絡(luò)在應(yīng)對(duì)這些需求時(shí)變得力不從心,雖然很多改進(jìn)型的技術(shù)比如堆疊、SVF、TRILL 等能夠增加二層的范圍,努力改進(jìn)經(jīng)典網(wǎng)絡(luò),但是要做到對(duì)網(wǎng)絡(luò)改動(dòng)盡可能小的同時(shí)保證靈活性卻非常困難。為了解決這些問(wèn)題,有很多方案被提出來(lái),Overlay 就是其中之一,而 VXLAN 是 Overlay 的一種典型的技術(shù)方案。下面就對(duì) Overlay 做一個(gè)簡(jiǎn)要的介紹。
2. Overlay 是個(gè)啥?
Overlay 在網(wǎng)絡(luò)技術(shù)領(lǐng)域,指的是一種網(wǎng)絡(luò)架構(gòu)上疊加的虛擬化技術(shù)模式,其大體框架是對(duì)基礎(chǔ)網(wǎng)絡(luò)不進(jìn)行大規(guī)模修改的條件下,實(shí)現(xiàn)應(yīng)用在網(wǎng)絡(luò)上的承載,并能與其它網(wǎng)絡(luò)業(yè)務(wù)分離,并且以基于 IP 的基礎(chǔ)網(wǎng)絡(luò)技術(shù)為主。
IETF 在 Overlay 技術(shù)領(lǐng)域提出 VXLAN、NVGRE、STT 三大技術(shù)方案。大體思路均是將以太網(wǎng)報(bào)文承載到某種隧道層面,差異性在于選擇和構(gòu)造隧道的不同,而底層均是 IP 轉(zhuǎn)發(fā)。VXLAN 和 STT 對(duì)于現(xiàn)網(wǎng)設(shè)備而言對(duì)流量均衡要求較低,即負(fù)載鏈路負(fù)載分擔(dān)適應(yīng)性好,一般的網(wǎng)絡(luò)設(shè)備都能對(duì) L2-L4 的數(shù)據(jù)內(nèi)容參數(shù)進(jìn)行鏈路聚合或等價(jià)路由的流量均衡,而 NVGRE 則需要網(wǎng)絡(luò)設(shè)備對(duì) GRE 擴(kuò)展頭感知并對(duì) flow ID 進(jìn)行 HASH,需要硬件升級(jí);STT 對(duì)于 TCP 有較大修改,隧道模式接近 UDP 性質(zhì),隧道構(gòu)造技術(shù)屬于革新性,且復(fù)雜度較高,而 VXLAN 利用了現(xiàn)有通用的 UDP 傳輸,成熟性極高。
總體比較,VLXAN 技術(shù)具有更大優(yōu)勢(shì),而且當(dāng)前 VLXAN 也得到了更多廠家和客戶(hù)的支持,已經(jīng)成為 Overlay 技術(shù)的主流標(biāo)準(zhǔn)。
3. VXLAN 協(xié)議原理
VXLAN 有幾個(gè)常見(jiàn)的術(shù)語(yǔ):
-
VTEP(VXLAN Tunnel Endpoints,VXLAN 隧道端點(diǎn))
VXLAN 網(wǎng)絡(luò)的邊緣設(shè)備,用來(lái)進(jìn)行 VXLAN 報(bào)文的處理(封包和解包)。VTEP 可以是網(wǎng)絡(luò)設(shè)備(比如交換機(jī)),也可以是一臺(tái)機(jī)器(比如虛擬化集群中的宿主機(jī))。
-
VNI(VXLAN Network Identifier,VXLAN 網(wǎng)絡(luò)標(biāo)識(shí)符)
VNI是每個(gè) VXLAN 段的標(biāo)識(shí),是個(gè) 24 位整數(shù),一共有(一千多萬(wàn)),一般每個(gè)
VNI對(duì)應(yīng)一個(gè)租戶(hù),也就是說(shuō)使用VXLAN搭建的公有云可以理論上可以支撐千萬(wàn)級(jí)別的租戶(hù)。 -
Tunnel(VXLAN 隧道)
隧道是一個(gè)邏輯上的概念,在 VXLAN 模型中并沒(méi)有具體的物理實(shí)體向?qū)?yīng)。隧道可以看做是一種虛擬通道,VXLAN 通信雙方認(rèn)為自己是在直接通信,并不知道底層網(wǎng)絡(luò)的存在。從整體來(lái)說(shuō),每個(gè) VXLAN 網(wǎng)絡(luò)像是為通信的虛擬機(jī)搭建了一個(gè)單獨(dú)的通信通道,也就是隧道。

上圖所示為 VXLAN 的工作模型,它創(chuàng)建在原來(lái)的 IP 網(wǎng)絡(luò)(三層)上,只要是三層可達(dá)(能夠通過(guò) 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ī)/容器能夠通過(guò)隧道直連。通過(guò) VNI 標(biāo)識(shí)不同的 VXLAN 網(wǎng)絡(luò),使得不同的 VXLAN 可以相互隔離。
VXLAN 的報(bào)文結(jié)構(gòu)如下圖所示:

VXLAN Header : 在原始二層幀的前面增加
8字節(jié)的 VXLAN 的頭部,其中最主要的是VNID,占用3個(gè)字節(jié)(即 24 bit),類(lèi)似 VLAN ID,可以具有個(gè)網(wǎng)段。
-
UDP Header : 在 VXLAN 和原始二層幀的前面使用
8字節(jié)UDP頭部進(jìn)行封裝(MAC IN UDP),目的端口號(hào)缺省使用 4789,源端口按流隨機(jī)分配(通過(guò) MAC,IP,四層端口號(hào)進(jìn)行 hash 操作), 這樣可以更好的做ECMP。IANA(Internet As-signed Numbers Autority)分配了4789作為 VXLAN 的默認(rèn)目的端口號(hào)。
在上面添加的二層封裝之后,再添加底層網(wǎng)絡(luò)的 IP 頭部(20 字節(jié))和 MAC 頭部(14 字節(jié)),這里的 IP 和 MAC 是宿主機(jī)的 IP 地址和 MAC 地址。
同時(shí),這里需要注意 MTU 的問(wèn)題,傳統(tǒng)網(wǎng)絡(luò) MTU 一般為 1500,這里加上 VXLAN 的封裝多出的(36+14/18,對(duì)于 14 的情況為 access 口,省去了 4 字節(jié)的 VLAN Tag)50 或 54 字節(jié),需要調(diào)整 MTU 為 1550 或 1554,防止頻繁分包。

VXLAN 的 Flood 與 Learn
總的來(lái)說(shuō),VXLAN 報(bào)文的轉(zhuǎn)發(fā)過(guò)程就是:原始報(bào)文經(jīng)過(guò) VTEP,被 Linux 內(nèi)核添加上 VXLAN 頭部以及外層的 UDP 頭部,再發(fā)送出去,對(duì)端 VTEP 接收到 VXLAN 報(bào)文后拆除外層 UDP 頭部,并根據(jù) VXLAN 頭部的 VNI 把原始報(bào)文發(fā)送到目的服務(wù)器。但這里有一個(gè)問(wèn)題,第一次通信前雙方如何知道所有的通信信息?這些信息包括:
- 哪些
VTEP需要加到一個(gè)相同的 VNI 組? - 發(fā)送方如何知道對(duì)方的
MAC地址? - 如何知道目的服務(wù)器在哪個(gè)節(jié)點(diǎn)上(即目的 VTEP 的地址)?
第一個(gè)問(wèn)題簡(jiǎn)單,VTEP 通常由網(wǎng)絡(luò)管理員來(lái)配置。要回答后面兩個(gè)問(wèn)題,還得回到 VXLAN 協(xié)議的報(bào)文上,看看一個(gè)完整的 VXLAN 報(bào)文需要哪些信息:
內(nèi)層報(bào)文 : 通信雙方的 IP 地址已經(jīng)明確,只需要 VXLAN 填充對(duì)方的
MAC地址,因此需要一個(gè)機(jī)制來(lái)實(shí)現(xiàn)ARP功能。VXLAN 頭部 : 只需要知道
VNI。一般直接配置在 VTEP 上,要么提前規(guī)劃,要么根據(jù)內(nèi)層報(bào)文自動(dòng)生成。UDP 頭部 : 需要知道源端口和目的端口,源端口由系統(tǒng)自動(dòng)生成,目的端口默認(rèn)是
4789。-
IP 頭部 : 需要知道對(duì)端
VTEP的 IP 地址,這個(gè)是最關(guān)鍵的部分。實(shí)際上,
VTEP也會(huì)有自己的轉(zhuǎn)發(fā)表,轉(zhuǎn)發(fā)表通過(guò)泛洪和學(xué)習(xí)機(jī)制來(lái)維護(hù),對(duì)于目標(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í)可以通過(guò)以下兩種方式:
- 多播
- 外部控制中心(如 Flannel、Cilium 等 CNI 插件)
MAC 頭部 : 確定了
VTEP的 IP 地址,后面就好辦了,MAC 地址可以通過(guò)經(jīng)典的ARP方式獲取。
4. Linux 的 VXLAN
Linux 對(duì) VXLAN 協(xié)議的支持時(shí)間并不久,2012 年 Stephen Hemminger 才把相關(guān)的工作合并到 kernel 中,并最終出現(xiàn)在 kernel 3.7.0 版本。為了穩(wěn)定性和很多的功能,可能會(huì)看到某些軟件推薦在 3.9.0 或者 3.10.0 以后版本的 kernel 上使用 VXLAN。
到了 kernel 3.12 版本,Linux 對(duì) VXLAN 的支持已經(jīng)完備,支持單播和組播,IPv4 和 IPv6。利用 man 查看 ip 的 link 子命令,可以查看是否有 VXLAN type:
$ man ip-link
搜索 VXLAN,可以看到如下描述:

管理 VXLAN 接口
Linux VXLAN 接口的基本管理如下:
-
創(chuàng)建點(diǎn)對(duì)點(diǎn)的 VXLAN 接口:
$ ip link add vxlan0 type vxlan id 4100 remote 192.168.1.101 local 192.168.1.100 dstport 4789 dev eth0其中
id為 VNI,remote為遠(yuǎn)端主機(jī)的 IP,local為你本地主機(jī)的 IP,dev代表 VXLAN 數(shù)據(jù)從哪個(gè)接口傳輸。在 VXLAN 中,一般將 VXLAN 接口(本例中即 vxlan0)叫做 VTEP。
-
創(chuàng)建多播模式的 VXLAN 接口:
$ ip link add vxlan0 type vxlan id 4100 group 224.1.1.1 dstport 4789 dev eth0多播組主要通過(guò)
ARP泛洪來(lái)學(xué)習(xí)MAC地址,即在 VXLAN 子網(wǎng)內(nèi)廣播ARP請(qǐng)求,然后對(duì)應(yīng)節(jié)點(diǎn)進(jìn)行響應(yīng)。group指定多播組的地址。 -
查看 VXLAN 接口詳細(xì)信息:
$ ip -d link show vxlan0
FDB 表
FDB(Forwarding Database entry,即轉(zhuǎn)發(fā)表)是 Linux 網(wǎng)橋維護(hù)的一個(gè)二層轉(zhuǎn)發(fā)表,用于保存遠(yuǎn)端虛擬機(jī)/容器的 MAC地址,遠(yuǎn)端 VTEP IP,以及 VNI 的映射關(guān)系,可以通過(guò) bridge fdb 命令來(lái)對(duì) FDB 表進(jìn)行操作:
-
條目添加:
$ bridge fdb add <remote_host_mac> dev <vxlan_interface> dst <remote_host_ip> -
條目刪除:
$ bridge fdb del <remote_host_mac> dev <vxlan_interface> -
條目更新:
$ bridge fdb replace <remote_host_mac> dev <vxlan_interface> dst <remote_host_ip> -
條目查詢(xún):
$ bridge fdb show
5. 總結(jié)
本文通過(guò)介紹 VXLAN 出現(xiàn)的時(shí)代背景、VXLAN 的概念和網(wǎng)絡(luò)模型、VXLAN 報(bào)文結(jié)構(gòu),讓你對(duì) VXLAN 有了初步的認(rèn)識(shí);通過(guò)介紹 VXLAN 轉(zhuǎn)發(fā)表的泛洪和學(xué)習(xí),讓你知道了通信雙方如何感知對(duì)方;最后介紹了 Linux 中 VXLAN 的基本配置,讓你進(jìn)一步了解如何在 Linux 中玩轉(zhuǎn) VXLAN。下一篇文章將會(huì)通過(guò)實(shí)戰(zhàn)來(lái)說(shuō)明如何搭建基于 VXLAN 的 Overlay 網(wǎng)絡(luò),順便展開(kāi)解讀上文提到的多播和外部控制中心的工作原理。
6. 參考資料
微信公眾號(hào)
掃一掃下面的二維碼關(guān)注微信公眾號(hào),在公眾號(hào)中回復(fù)?加群?即可加入我們的云原生交流群,和孫宏亮、張館長(zhǎng)、陽(yáng)明等大佬一起探討云原生技術(shù)

