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)幾乎沒有影響舷嗡,不需要對(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ú)法滿足需求了们何。而 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ì)查詢 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ī)表示壓力山大岸杷怠磨德!
而 VXLAN 就厲害了,它用 VTEP
(后面會(huì)解釋)將二層以太網(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
也得到了更多廠家和客戶的支持绕辖,已經(jīng)成為 Overlay
技術(shù)的主流標(biāo)準(zhǔn)。
3. VXLAN 協(xié)議原理
VXLAN 有幾個(gè)常見的術(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è)租戶蹦玫,也就是說(shuō)使用VXLAN
搭建的公有云可以理論上可以支撐千萬(wàn)級(jí)別的租戶赎婚。 -
Tunnel(VXLAN 隧道)
隧道是一個(gè)邏輯上的概念雨饺,在 VXLAN 模型中并沒有具體的物理實(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),類似 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>
-
條目查詢:
$ 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ò)冻记,順便展開解讀上文提到的多播和外部控制中心的工作原理睡毒。
6. 參考資料
微信公眾號(hào)
掃一掃下面的二維碼關(guān)注微信公眾號(hào),在公眾號(hào)中回復(fù)?加群?即可加入我們的云原生交流群冗栗,和孫宏亮演顾、張館長(zhǎng)、陽(yáng)明等大佬一起探討云原生技術(shù)