VxLAN 數(shù)據(jù)面封裝協(xié)議
? 2011 年 8 月,主要由 VMware 與 Cisco 公司草擬并由 IETF 發(fā)布了 RFC 7348 草案《Virtual eXtensible Local Area Network (VXLAN): A Framework for Overlaying Virtualized Layer 2 Networks over Layer 3 Networks》。 ? VxLAN(Virtual Extensible Local Area Network,虛擬擴展本地局域網(wǎng))是 IETF 定義的 NVO3(Network Virtualization over Layer 3)標(biāo)準(zhǔn)技術(shù)之一,從名字可以看出,VxLAN 最初定位于對傳統(tǒng) VLAN 協(xié)議的一種增強替代方案。本質(zhì)是一種 Tunneling(隧道)網(wǎng)絡(luò)傳輸技術(shù),又稱為 Overlay 網(wǎng)絡(luò),特點是將 L2 Frame 封裝到 UDPVxLAN Header 中,并在 L3 IP 網(wǎng)絡(luò)中進(jìn)行傳輸(L2 over L3)。 ? 通過 VxLAN 技術(shù)可以將處于不同 L3 Subnets 的 Underlay 網(wǎng)絡(luò)設(shè)備整合到一個邏輯上的 Overlay 網(wǎng)絡(luò)中。對于 Overlay 網(wǎng)絡(luò)的終端用戶而言,這些網(wǎng)絡(luò)設(shè)備似乎 “真實” 地部署在了同一個 L2 數(shù)據(jù)鏈路層網(wǎng)絡(luò)中,以此來適應(yīng)大規(guī)模云計算多租戶隔離網(wǎng)絡(luò)的需求。
?
?VxLAN 組網(wǎng)拓?fù)浣榻B
? 如上圖所示,首先介紹構(gòu)建一個 VxLAN 網(wǎng)絡(luò)所需要的組成部分,包括以下 3 組核心元素: ?
NVE / VTEP / VxLAN Tunnel
VxLAN L2 Gateway / L2 VNI / BD
VxLAN L3 Gateway / L3 VNI / VRF
NVE / VTEP / VxLAN Tunnel
在抽象的 Overlay 網(wǎng)絡(luò)中,NVE(Network Virtualization Edge,網(wǎng)絡(luò)虛擬邊緣節(jié)點)是一個處于 Underlay 網(wǎng)絡(luò)和 Overlay 網(wǎng)絡(luò)交界處的邊緣設(shè)備,提供網(wǎng)絡(luò)虛擬化功能,用于銜接 2 個不同的網(wǎng)絡(luò)類型。 ? 根據(jù)具體的組網(wǎng)環(huán)境,NVE 可以是主機中運行的一個虛擬網(wǎng)元,也可以是一個物理網(wǎng)元(e.g. Spine/Leaf 交換機)。在本文中主要討論硬件 NVE 的情況。
? ??軟件 NVE 常見的有 OvS Tun Bridge 和 Linux Bridge + Tun 虛擬隧道網(wǎng)卡設(shè)備。 ?
??硬件 NVE 常見的有 Spine-Leaf 交換機設(shè)備。 ? 在具體的 VxLAN Overlay 網(wǎng)絡(luò)中,NVE 需要具備 VTEP(VxLAN Tunnel Endpoints,隧道端點)功能,用于完成 VxLAN 協(xié)議棧的封裝/解封裝。兩個 VTEP(local-VTEP 和 remote-VTEP)之間具有 Underlay IP 路由可達(dá)性,繼而可以構(gòu)造一個 L3 之上的 VxLAN Tunnel。 ? 區(qū)別于 VLAN 使用 VLAN ID 來隔離二層網(wǎng)絡(luò),VxLAN 使用了 VNI(VXLAN Network Identifier,VXLAN 網(wǎng)絡(luò)標(biāo)識符)來作為隔離標(biāo)記。在一個 VxLAN Tunnel 中,可用于傳輸若干個由 VNI 進(jìn)行隔離的 VxLAN 虛擬網(wǎng)絡(luò)。 ? 另外,與 VLAN 網(wǎng)絡(luò)隔離需要通過 L3 Gateway 來互聯(lián)互通類似,在 VxLAN 網(wǎng)絡(luò)隔離中同樣需要 VxLAN Gateway 來實現(xiàn) VxLAN 虛擬網(wǎng)絡(luò)與其他類型網(wǎng)絡(luò)之間的互聯(lián)互通,而且情況會更加復(fù)雜。根據(jù)用途的區(qū)別,VxLAN Gateway 大體上可以分為 VxLAN L2 Gateway 和 VxLAN L3 Gateway 這 2 種類型,對應(yīng)的 VNI 也根據(jù)用途被細(xì)分為 L2 VNI 和 L3 VNI 這 2 種類型。 ?
VxLAN L2 Gateway / L2 VNI / BD
VxLAN L2 Gateway 用于實現(xiàn) VxLAN 和 VLAN 之間的互聯(lián)。 ? 在 Leaf NVE 中,為了實現(xiàn) VxLAN L2 Gateway 的 L2 隔離和轉(zhuǎn)發(fā)而引入了 BD(Bridge Domain)的概念,它是一個可配置的二層廣播域,類似于一個虛擬網(wǎng)橋設(shè)備。在新建一個 BD Instance 時,通常會將 BD Instance、L2 VNI、Local VLAN ID 配置為一一對應(yīng),并且在一個 BD Instance 中會同時存在 2 種類型的接口: ?
Overlay 側(cè)接口
是一個對內(nèi)的二層接口設(shè)備,更準(zhǔn)確的說是一個 Host 上聯(lián) Leaf Port 的二層子接口設(shè)備(e.g. CloudEngine VAP),具有同一個 VLAN ID 的下掛終端(VM/Host)的 Original L2 Frame 會從此接口進(jìn)入到 VTEP 中進(jìn)行后續(xù)的封裝。 ?
Underlay 側(cè)接口
是一個對外的三層接口設(shè)備,會被分配一個 Underlay IP,與物理網(wǎng)絡(luò)相連。在 Underlay 網(wǎng)絡(luò)中的多個 VTEP 之間具備 IP 路由可達(dá)性,用于構(gòu)建 VxLAN Tunnel。被 VTEP 封裝之后的 VxLAN 封裝包會從此接口流出進(jìn)入 VxLAN Tunnel 傳輸。 ? 另外,BD Instance 為了能夠 “縫合“ Local VLAN 和 VxLAN Tunnel 這兩段網(wǎng)絡(luò),維護了 VID-VNID 映射關(guān)系。通過這樣的方式,VxLAN L2 Gateway 就將 Local VLAN 作為了 VxLAN Tunnel 的接入點,所有加入到 Local VLAN 中的終端(VM/Host)L2 流量,就會進(jìn)入到對應(yīng)的 VxLAN Tunnel 中。
VxLAN L3 Gateway / L3 VNI / VRF
VxLAN L3 Gateway 用于實現(xiàn)下列 2 種互聯(lián)場景: ?
兩個 VNI 不同的 VxLAN 虛擬網(wǎng)絡(luò)之間的互聯(lián)互通。
VxLAN 虛擬網(wǎng)絡(luò)和外部 IP 網(wǎng)絡(luò)之間的互聯(lián)互通。
可見,VxLAN L3 Gateway 主要提供了 L3 隔離和轉(zhuǎn)發(fā)功能,具體沿用了 L3 VPN Instance 中的 VRF 技術(shù)。每個 VRF 都具有自己的 Route Tables,類似于 Linux Network Namespace,同時維護了 VRF 和 L3 VNI 的映射關(guān)系,以此在 VxLAN L3 Gateway 層面實現(xiàn)了對不同租戶之間的 L3 隔離。 ? 另外,在常見的 Spine-Leaf 數(shù)據(jù)中心網(wǎng)絡(luò)架構(gòu)中,根據(jù)將 VxLAN L3 Gateway 部署在 Spine 或者部署在 Leaf 上的不同,又可以再細(xì)分為 2 種不同的 VxLAN 組網(wǎng)方案: ?
集中式 VxLAN L3 Gateway 組網(wǎng)方案
分布式 VxLAN L3 Gateway 組網(wǎng)方案
下圖中概述性的列舉了這 2 種組網(wǎng)方案的異同。
集中式 VxLAN L3 Gateway 組網(wǎng)方案
在分布的 Leaf 上部署 VxLAN L2 Gateway 功能,在集中的 Spine 上部署 VxLAN L3 Gateway 功能。這意味著所有跨網(wǎng)絡(luò)之間的流量都需要經(jīng)過 Spine 進(jìn)行轉(zhuǎn)發(fā),包括:VxLAN 虛擬網(wǎng)絡(luò)之間,以及 VxLAN 虛擬網(wǎng)絡(luò)與外部 IP 網(wǎng)絡(luò)之間的流量。 ? 該方案的優(yōu)點是跨網(wǎng)絡(luò)流量集中管理,簡化網(wǎng)關(guān)部署和管理。而缺點是: ?
轉(zhuǎn)發(fā)路徑并非最優(yōu)
跨網(wǎng)絡(luò)之間的流量都需要在 Spine 上進(jìn)行 L3 繞行,這樣就導(dǎo)致了 Leaf 與 Spine 之間的鏈路上存在冗余的報文,額外占用了大量的帶寬。 ?
Spine 的 ARP 表項壓力大
所有通過 L3 轉(zhuǎn)發(fā)的 ARP 表項(MAC-IP)都存儲在 Spine 上,當(dāng)終端的數(shù)量越來越多時,Spine 就容易成為網(wǎng)絡(luò)瓶頸。 ? 所以該方案適用于小型組網(wǎng)環(huán)境。
分布式 VxLAN L3 Gateway 組網(wǎng)方案
在分布的 Leaf 上同時部署了 VxLAN L2 和 L3 Gateway,而 Spine 只作為常規(guī) L3 轉(zhuǎn)發(fā)節(jié)點并不需要感知 VxLAN 隧道的存在。具有以下特性: ?
相同 VTEP 下跨網(wǎng)絡(luò)之間的流量在 Leaf 上完成 L3 轉(zhuǎn)發(fā)。
只有不同 VTEP 下跨網(wǎng)絡(luò)之間的流量需要經(jīng)過 Spine 完成 L3 轉(zhuǎn)發(fā)。
另外,只要求 Leaf 學(xué)習(xí)下掛終端的 ARP 表項,從而解決了 Spine 規(guī)格帶來的容量瓶頸問題。所以該方案適用于中大規(guī)模(5000 臺服務(wù)器及以上)的高性能網(wǎng)絡(luò)。 ? 而缺點是網(wǎng)關(guān)部署、故障定位及網(wǎng)絡(luò)運維相對復(fù)雜,通常需要結(jié)合 EVPN Control Plane 來完成一系列的自動化配置工作,例如:基于 BGP Peer 的 VTEP 自動發(fā)現(xiàn)、VxLAN Tunnel 自動建立,ARP 表項自動生成等等。 ?
? VxLAN 協(xié)議棧解析
? VxLAN 的協(xié)議棧比較簡單,定義了一種 MAC-in-IP 的報文封裝格式。 ?
Original L2 Frame
一個原始且完整的 L2 數(shù)據(jù)幀,是業(yè)務(wù)層發(fā)出(通常是 VM)的實際 Payload 數(shù)據(jù)。 ?
VxLAN Header(8Bytes)
將 Original L2 Frame 封裝到 VxLAN Header(8Bytes)成為 Overlay Segment。 ?
VxLAN Flags(8bits):標(biāo)記字段,如果 VNI 有效,則固定取值為 00001000。
Reserved(24bits):保留字段,固定取值為全 0。
VNI(VxLAN Network Identifier,24bits):最多支持 16777216(1600 萬)個二層隔離網(wǎng)絡(luò)。根據(jù)用途的不同可分為 L2 VNI 和 L3 VNI。
Reserved(8bits):保留字段,固定取值為全 0。
UDP Header(8Bytes)
是 Overlay 和 Underlay 的分界線。UDP 協(xié)議由于其高效率、低占用的特性常被用作隧道封裝協(xié)議的傳輸層。 ?
UDP srcPort(16bits):由 local-VTEP 通過對 Original L2 Frame 進(jìn)行 HASH 計算后得出,該特性使得 VxLAN 封裝包在 Receive Site 具備了可行的 HASH-base 負(fù)載均衡處理能力(e.g. ECMP 等價路由)。
UDP dstPort / VxLAN Port(16bits):缺省取值為 UDP 4789,根據(jù)具體設(shè)備型號可能支持配置更改。
UDP Length(16bits):指示一個 UDP 數(shù)據(jù)報的總長度。
Checksum(16bits):檢驗字段。
Outer IP Header(20Bytes)
是 Underlay 的 L3 IP Header 封裝。 ?
srcIP 是 local-VTEP 的 IP 地址。
dstIP 可能是 remote-VTEP 的 IP 單播地址,也可能是用于 BUM 流量的多播/組播地址。
Outer MAC Header
是 Underlay 的 L2 Frame 封裝。dstMAC 和 srcMAC 地址視乎于具體的 Underlay 網(wǎng)絡(luò)拓?fù)洹??
srcMAC 是 local-VTEP 的 MAC 地址;
dstMAC 視乎于具體的 Underlay 以太網(wǎng)絡(luò)拓?fù)洹?/p>
VxLAN 數(shù)據(jù)面轉(zhuǎn)發(fā)原理
同 VNI 的 BUM 報文轉(zhuǎn)發(fā)場景
BUM(Broadcast,Unknown-unicast,Multicast)是網(wǎng)絡(luò)中常見的 3 種流量類型,分別表示: ?
廣播流量(Broadcast)
指發(fā)送到網(wǎng)絡(luò)中所有設(shè)備的流量,例如:ARP 報文、DHCP 報文等。 ?
未知單播流量(Unknown-unicast)
指發(fā)送給網(wǎng)絡(luò)中不存在的設(shè)備的流量,例如:發(fā)往一個錯誤的 MAC 地址的報文等。當(dāng)交換機收到一個未知目的 MAC 地址的報文時,它需要向除了源端口外的所有端口轉(zhuǎn)發(fā)該報文,以便讓目的主機能夠收到該報文并發(fā)送響應(yīng)。因此,未知單播報文也是廣播報文的一種,也會對網(wǎng)絡(luò)帶寬造成浪費。 ?
組播流量(Multicast)
指發(fā)送給一組目標(biāo)設(shè)備的流量,這些設(shè)備加入到了一個組播組,組播流量的目的地址也是特定的組播地址,因此對網(wǎng)絡(luò)帶寬的占用相較于廣播更少一些。 ? 在網(wǎng)絡(luò)中,對于不同類型的 BUM 報文,交換機的處理方式也不同,例如,對于 Broadcast 和 Multicast 報文,交換機會將它們轉(zhuǎn)發(fā)到所有的端口,而對于 Unknown-unicast 報文,則只會將它們轉(zhuǎn)發(fā)到除源端口外的所有端口?;谶@樣的特性,為了簡單理解,我們可以將 BUM 報文統(tǒng)稱為 Flooding 流量。 ? 在大規(guī)模的 VxLAN 場景中,由于多個 Overlay 虛擬網(wǎng)絡(luò)共享 Underlay 物理網(wǎng)絡(luò),多租戶情況下,這些 Flooding(洪泛)流量對物理帶寬資源的占用尤為突出,需要特別的注意。 ? 物理網(wǎng)絡(luò)設(shè)備對 BUM 的處理方式(數(shù)據(jù)包復(fù)制)大體上有 2 種: ?
頭端復(fù)制(Head-End Replication,HER)
在源頭(即發(fā)送端所在的端口)將 BUM 流量復(fù)制到多個目的地,每個目的地對應(yīng)著一個收件人(e.g. 一個接收組播流的客戶端)。這種方式需要在源端口上復(fù)制和轉(zhuǎn)發(fā)每個數(shù)據(jù)包,因此可能會導(dǎo)致性能問題和鏈路擁塞。頭端復(fù)制適用于小規(guī)模網(wǎng)絡(luò),常用于數(shù)據(jù)中心的二層網(wǎng)絡(luò)中。 ?
核心復(fù)制(Core Replication,CR)
將 BUM 流量復(fù)制到一組專用的核心設(shè)備,這些設(shè)備負(fù)責(zé)將流量復(fù)制到所有需要它的接收方(e.g. 接收組播流的客戶端)。這種方式通過在核心層進(jìn)行復(fù)制,避免了在源端口上進(jìn)行大量的復(fù)制和轉(zhuǎn)發(fā),因此對網(wǎng)絡(luò)性能的影響更小。核心復(fù)制適用于大規(guī)模網(wǎng)絡(luò),常用于廣域網(wǎng)環(huán)境中。 ? 對應(yīng)的 VxLAN 硬件 NVE 同樣有 2 種 BUM 報文處理方式: ?
VxLAN 頭端復(fù)制 + Underlay 單播路由
由 local-VTEP(源頭設(shè)備)負(fù)責(zé)對終端(VM/Host)發(fā)出的 BUM 報文進(jìn)行復(fù)制,并采用 Underlay 單播路由的方式,經(jīng)過 VxLAN Tunnels 將 BUM 傳遞到其他多個 remote-VTEPs 接收。remote-VTEP 接收到 BUM 報文之后,就不再 Flooding,避免了環(huán)路。
再展開一下 Local LAN 流量接入 VxLAN Tunnel 的流程細(xì)節(jié)。如下圖所示,當(dāng) VTEP 接收到終端的攜帶 VLAN 的 BUM 之后,首先會通過 VLAN ID 匹配到對應(yīng)的 BD,然后在該 BD 內(nèi)查找 VNI-Tunnel List,最后為 BUM 封裝上不同的 OverlayUnderlay Header 之后向 VNI-Tunnel List 指定的所有 VxLAN Tunnels 發(fā)出。
VxLAN 核心復(fù)制 + Underlay 組播路由
首先將網(wǎng)絡(luò)中所有的 VTEPs 設(shè)備都加入到同一個組播組中,部署專門的核心層設(shè)備并通過組播路由協(xié)議(e.g. PIM)或 IPv6 多播路由協(xié)議(e.g. IGMP )與 VTEPs 建立一個組播信道和相應(yīng)的組播轉(zhuǎn)發(fā)表項。當(dāng)終端發(fā)出 BUM 報文后,local-VTEP 會為其封裝好組播目的 IP 地址,然后進(jìn)入核心層設(shè)備進(jìn)行數(shù)據(jù)復(fù)制,并采用 Underlay 組播的方式,將 BUM 傳遞到同一個組播組內(nèi)的其他 remote-VTEPs 接收。
同 VNI 的單播報文轉(zhuǎn)發(fā)場景
同 VNI 的單播報文轉(zhuǎn)發(fā)場景中,一個 IP 單播報文的發(fā)送實際上可以拆分為 3 次轉(zhuǎn)發(fā)流程,分別是: ?
ARP Request 廣播轉(zhuǎn)發(fā);
ARP Reply 單播轉(zhuǎn)發(fā);
IP 單播轉(zhuǎn)發(fā)。
下面以較為簡單的 “VxLAN 頭端復(fù)制 + Underlay 單播路由“ 方式為例進(jìn)行介紹:VM_A、VM_B、VM_C 同屬于 VNI 5000,也同屬于 10.1.1.0/24 子網(wǎng)。此時,VM_A 想與 VM_C 進(jìn)行首次通信。
ARP Request 廣播轉(zhuǎn)發(fā)流程
首次通信,VM_A 沒有 VM_C 的 MAC 地址,所以首先進(jìn)行 ARP Request 廣播轉(zhuǎn)發(fā)流程,請求獲取 VM_C 的 MAC 地址。 ?
VM_A 發(fā)送 srcMAC 為 MAC_A、dstMAC 為 “全 F(廣播)”、srcIP 為 IP_A、dstIP 為 IP_C 的 ARP Request 廣播報文,請求獲取 VM_C 的 MAC 地址。
VTEP_1 收到 ARP Request 后,根據(jù)二層子接口上的 VLAN 和 DB 配置判斷報文需要進(jìn)入 VxLAN Tunnel。確定報文所屬 VNID 后,VTEP_1 首先會自學(xué)習(xí) MAC_A、VNID 和 Port_1(二層子接口對應(yīng)的物理接口)的映射關(guān)系,并記錄在本地 MAC Table 中。之后,VTEP_1 會根據(jù)頭端復(fù)制列表對報文進(jìn)行復(fù)制,并分別進(jìn)行 OverlayUnderlay Header 封裝。
封裝的 Outer srcIP 地址為 VTEP_1 的 IP 地址,Outer dstIP 地址為 remote-VTEP(VTEP_2 或 VTEP_3)的 IP 地址;Outer srcMAC 地址為 VTEP_1 的 MAC 地址,而 Outer dstMAC 地址為去往目的 IP 的網(wǎng)絡(luò)中下一跳設(shè)備的 MAC 地址。
根據(jù) Outer MAC/IP 信息,在 Underlay IP 網(wǎng)絡(luò)中進(jìn)行傳輸,直至到達(dá) remote-VTEP。
報文到達(dá) remote-VTEP 后,對報文進(jìn)行解封裝,得到 VM_A 發(fā)送的 Original L2 Frame。同時,remote-VTEP 學(xué)習(xí) VM_A 的 MAC 地址、VNID 和 VTEP_1 的 IP 地址的映射關(guān)系,并記錄在本地 MAC Table 中。之后,remote-VTEP 根據(jù)二層子接口上 BD 和 VLAN 配置對報文在 Local LAN 二層域內(nèi)進(jìn)行廣播。
VM_B 或 VM_C 接收到 ARP Request 后,比較報文中的 dstIP 地址是否為本機的 IP 地址。VM_B 發(fā)現(xiàn) dstIP 不是本機 IP,故將報文丟棄;VM_C 發(fā)現(xiàn) dstIP 是本機 IP,則對 ARP Request 做出應(yīng)答。
ARP Reply 單播轉(zhuǎn)發(fā)流程
VM_C 應(yīng)答 ARP Reply 時,由于 VM_C 已經(jīng)知道了 VM_A 的 MAC 地址,所以 ARP Reply 報文為單播報文。報文的 srcMAC 為 MAC_C,dstMAC 為 MAC_A, srcIP 為 IP_C、dstIP 為 IP_A。 ?
VTEP_3 接收到 VM_C 發(fā)送的 ARP Reply 報文后,同樣先自學(xué)習(xí) MAC_C、VNI 和 Port_3 的映射關(guān)系,并記錄在本地 MAC Table 中。然后 VTEP_3 對報文進(jìn)行封裝。
封裝的 Outer srcIP 地址為 VTEP_3 的 IP 地址,Outer dstIP 地址為 VTEP_1 的 IP 地址;Outer srcMAC 地址為 VTEP_3 的 MAC 地址,而 Outer dstMAC 地址為去往目的 IP 的網(wǎng)絡(luò)中下一跳設(shè)備的 MAC 地址。
根據(jù) Outer MAC/IP 信息,在 Underlay IP 網(wǎng)絡(luò)中進(jìn)行傳輸,直至到達(dá) remote-VTEP。
報文到達(dá) VTEP_1 后,VTEP_1 對報文進(jìn)行解封裝,得到 VM_C 發(fā)送的 Original L2 Frame。同時,VTEP_1 學(xué)習(xí) VM_C 的 MAC 地址、VNI 和 VTEP_3 的 IP 地址的映射關(guān)系,并記錄在本地 MAC Table 中。然后 VTEP_1 將解封裝后的報文發(fā)送給 VM_A。
至此,VM_A 和 VM_C 均已學(xué)習(xí)到了對方的 MAC 地址。之后,VM_A 和 VM_C 將采用 IP 單播方式進(jìn)行轉(zhuǎn)發(fā)。轉(zhuǎn)發(fā)流程類似,這里不再贅述。
不同 VNI 的單播報文轉(zhuǎn)發(fā)場景
不同 VNI 的單播報文轉(zhuǎn)發(fā)場景,又稱為 “跨 VxLAN 子網(wǎng)的單播報文轉(zhuǎn)發(fā)場景“,需要結(jié)合上文中提到的 VxlAN L3 Gateway 來共同完成。 ? 這里以較為簡單的 “集中式 VxLAN L3 Gateway 組網(wǎng)方案“ 來進(jìn)行介紹:Spine 提供 L3 Forwarding 功能,VM1 和 VM4 處于不同的 VxLAN 子網(wǎng),VM1 的網(wǎng)關(guān)是 VSI-Interface10,VM4 的網(wǎng)關(guān)是 VSI-Interface20,并分別接入到不同的 VSI(Virtual Switching Instance,虛擬交換實例)中,VSI 具有傳統(tǒng)以太網(wǎng)交換機的所有功能。 ? 假設(shè)現(xiàn)在已經(jīng)不是首次通信,VM1、VM4、VSI-Interface10、VSI-Interface20 之間的 MAC 地址都已經(jīng)互相學(xué)習(xí)到了。此時 VM1 向 VM4 發(fā)出跨子王的 IP 單播報文。 ?
VM1 先將報文發(fā)送給 VSI-Interface10。
Leaf-A 收到 VM1 發(fā)來的報文,識別此報文屬于 VxLAN 10,查找 dstMAC G10 的表項,然后對報文進(jìn)行 VxLAN 封裝后從 Tunnel2 發(fā)送出去。
Spine-C 收到 Leaf-A 發(fā)來的報文,進(jìn)行 L3 Forwarding 處理:
發(fā)現(xiàn) Outer dstIP 是自己,于是對報文進(jìn)行解封裝。
解完封裝后,Spine-C 發(fā)現(xiàn) Original L2 Frame 的 dstMAC 是本機 VSI-interface10 的 MAC、dstIP 是 IP4,于是根據(jù)路由表查找 IP4 的下一跳;
發(fā)現(xiàn)一下跳為 Leaf-B、出接口為 VSI-Interface20,再查詢 ARP 表項,并將 Original L2 Frame 的 srcMAC 修改為 VSI-interface20 的 MAC 地址,將 dstMAC 修改為 VM4 的 MAC 地址。
報文到達(dá) VSI-interface20 接口時,識別到需要進(jìn)入 VxLAN 20,所以根據(jù) MAC 表對報文進(jìn)行封裝。
封裝的 VNI 為 20,Outer srcIP 為 Spine-C 的 IP 地址,Outer dstIP 為 Leaf-B 的 IP 地址;Outer srcMAC 為 Spine-C 的 MAC 地址,Outer dstMAC 為去往目的 IP 的網(wǎng)絡(luò)中下一跳設(shè)備的 MAC 地址。
封裝后的報文,根據(jù) Outer dstMAC/dstIP 信息,在 Underlay IP 網(wǎng)絡(luò)中進(jìn)行傳輸,直至到達(dá) remote-VTEP。
Leaf-B 收到 Spine-C 發(fā)來的報文后,解封裝,得到 Original L2 Frame。在 VxLAN 20 內(nèi)找到 dstMAC 為 MAC4 的表項,并將報文從對應(yīng)的接口和 VLAN 中發(fā)送出去。
最終 VM4 收到了來自 VM1 的報文。 ?
? VxLAN/UDP 的 MTU 問題 ? UDP(User Datagram Protocol,用戶數(shù)據(jù)報協(xié)議),是一種無連接的、非可靠的傳輸層協(xié)議,常被應(yīng)用于 Tunnel 協(xié)議的傳輸層。主要原因有以下幾點: ?
速度快
只要應(yīng)用進(jìn)程將 Payload 傳給 UDP,UDP 將此數(shù)據(jù)打包后就立刻傳遞給 IP 層,而無需作其他額外的機制處理。 ?
首部開銷小
相較于 TCP Header 都有 20Bytes 的首部開銷,UDP Header 只有 8Bytes。 ?
負(fù)載均衡特性
因為無連接,所以 UDP srcPort 可以使用 HASH 計算值,該特性能夠在各個網(wǎng)絡(luò)環(huán)節(jié)中進(jìn)行負(fù)載均衡優(yōu)化,例如:ECMP 傳輸環(huán)節(jié),CPU 隊列綁定收包環(huán)節(jié)等。 ? 但相對的,UDP 也存在一個關(guān)鍵的 MTU 分片問題,即:假如 UDP Datagram 進(jìn)行分片,那么只有 First Fragment 是包含 UDP Header 的,一旦丟包就會導(dǎo)致 Receiver 無法重組出一個完整的 Datagram。如下圖所示。
? 所以,當(dāng)采用 UDP 作為傳輸層時,需要十分注意 MTU 的設(shè)置,才能帶來更好的傳輸性能以及可靠性。根據(jù) VXLAN RFC7348 中的建議,VxLAN 封裝包不應(yīng)該分片,否則在接收端 VTEP 上會丟棄分片的報文,導(dǎo)致無法正確解封裝。
通常的,VM/Host 的默認(rèn) MTU 是 1500Bytes,即 Original L2 Frame 最大為 1500Bytes。在 VTEP 封裝上 VxLAN Overhead 的 50Bytes(VxLAN header + UDP Header + Outer IP/MAC Header)之后,VxLAN 封裝包的總長度就達(dá)到了 1550Bytes。 ? 如果希望不對 VxLAN 封裝包進(jìn)行分片,可以通過 2 種常規(guī)手段來實現(xiàn): ?
減小 VM/Host 的 MTU。
加大 Underlay 網(wǎng)絡(luò)的 MTU。
根據(jù)實際的場景,需要考慮采用不同的實現(xiàn)方式。
DCN 場景中的 VxLAN MTU
在 DCN 場景中,由于運營商對整網(wǎng)環(huán)境具有把控能力,所以通常會采用從 “業(yè)務(wù)需求出發(fā)“ 的原則,即:調(diào)整 Underlay MTU 以適應(yīng) VM/Host MTU 的需求。所以,極端情況下,Underlay MTU 可能被設(shè)置為 9000Bytes。
DCI 場景中的 VxLAN MTU
并跨越兩個地理位置分離的 DC(數(shù)據(jù)中心),通過 L3 路由廣域網(wǎng)(WAN)或其他數(shù)據(jù)中心互連(DCI)傳輸連接的場景中。因為 VxLAN 封裝包需要經(jīng)過并非完全可控的第三方承載網(wǎng)絡(luò),所以對 MTU 的規(guī)劃需要更加嚴(yán)謹(jǐn)。所以通常采用 “從適配性出發(fā)“ 的原則,即:對 VM/Host MTU 進(jìn)行控制,確保在整個端到端的承載網(wǎng)中均小于 Underlay MTU。 ? 以一個內(nèi)層 ping 包(長度為 1422Bytes)為例,計算各層封裝的長度如下表,發(fā)現(xiàn)最終的 VxLAN 封裝包大于 1500Bytes,此時就需要修改 Inner MTU 以及 Inner App 的長度值,使其小于等于 1500Bytes。
?
? EVPN MP-BGP 控制面協(xié)議
? EVPN (Ethernet VPN)是一個 L2 VPN(L2-in-L3)協(xié)議,最初的設(shè)計目的是為了替換落后的 VPLS(Virtual Private LAN Service),號稱為 Next Generation L2 VPN(下一代的 L2 VPN)。 ? 后來,EVPN 逐漸演進(jìn)為一套通用的 Control Plane 協(xié)議,而不是具體為了承載業(yè)務(wù)的 Data Plane 協(xié)議。EVPN Control Plane 可以與多種不同的 Data Plane 技術(shù)(包括:MPLS、SRv6、VxLAN 等)結(jié)合使用實現(xiàn)一套完整的數(shù)控分離 SDN 方案。 ? EVPN Control Plane 的全稱為 EVPN MP-BGP(Ethernet VPN base on Multi-Protocols BGP),是一種基于 MP-BGP 協(xié)議可擴展性的實現(xiàn)方式,增加新的協(xié)議類型和路由類型,包括: ?
L2 VPN AFI(Address Family Identifier,地址族標(biāo)識)
EVPN SAFI(Subsequent Address Family Identifier,子地址族標(biāo)識)
EVPN NLRI(Network Layer Reachability Information,網(wǎng)絡(luò)層可達(dá)性信息)
??EVPN VxLAN SDN 方案
? 在引入 EVPN 作為 VxLAN 的 Control Plane 之前,需要通過手工的方式建立靜態(tài) VxLAN 隧道,即:手動指定 VxLAN Tunnel 的 local-VTEP 和remote-VTEP 的 IP 地址對,并構(gòu)建 Tunnel。手工靜態(tài)配置的方式在集中式 VxLAN L3 Gateway 組網(wǎng)方案中或許還能夠勉強接受,但在大規(guī)模的分布式 VxLAN L3 Gateway 組網(wǎng)方案中會出現(xiàn)較為嚴(yán)峻的挑戰(zhàn),主要有 2 個方面: ?
網(wǎng)絡(luò)擴展困難:網(wǎng)絡(luò)變更需要手動修改集群配置,容易出現(xiàn) “雪花設(shè)備“ 故障。
BUM 洪泛流量占比大:所有 VTEP 都需要通過 Flood and Learn(洪泛和自學(xué)習(xí))來完成數(shù)據(jù)轉(zhuǎn)發(fā)之前的 ARP 表項和主機路由表項學(xué)習(xí)。
為了解決這個問題,需要在 VxLAN 網(wǎng)絡(luò)中引入 Control Plane 方案來提供靈活的運維管理支撐。目前最為流行和成熟的組合就是 EVPN VxLAN(RFC6624),依托于 BGP 在 E-BGP 和 I-BGP 場景中的適配性,也使得 VxLAN 不僅局限于 DCN(數(shù)據(jù)中心網(wǎng)絡(luò))場景,還能應(yīng)用于 DCI(數(shù)據(jù)中心互聯(lián))場景。
? 相應(yīng)的,采用 EVPN 作為 VxLAN 的 Control Plane 帶來了 2 個核心優(yōu)勢: ?
EVPN 可實現(xiàn) VTEP 自動發(fā)現(xiàn)、VxLAN Tunnel 的自動建立,從而降低網(wǎng)絡(luò)運維的復(fù)雜度和提升了網(wǎng)絡(luò)可擴展性。
EVPN 可實現(xiàn) IP、MAC、VNI 等 ARP 和主機路由信息的自動宣告,從而有效減少了 BUM 泛洪流量。
? EVPN VxLAN 的路由類型
? EVPN 基于 MP-BGP NLRI 擴展引入了 5 種新的路由類型(Route Type),如下: ?
Type1. Ethernet Auto-Discovery Route(Ethernet 自動發(fā)現(xiàn)路由)
Type2. MAC/IP Advertisement Route(MAC/IP 通告路由)
Type3. Inclusive Multicast Ethernet Tag Route(集成多播 Ethernet Tag 路由)
Type4. Ethernet Segment Route(Ethernet 段路由)
Type5. IP Prefix Route(IP 前綴路由)
在 EVPN VxLAN 場景中,NVE(交換機)充當(dāng) PE 的角色,同時具備了 BGP Peer 和 VTEP 的功能,下文中統(tǒng)稱為 VTEP Peer。其主要應(yīng)用了 Type2、Type3、Type5 這 3 種路由類型,下面重點介紹這些路由類型的定義和作用。 ?
Type2:MAC/IP Advertisement Route(MAC/IP 通告路由)
Type2 Route 的 EVPN NLRI 字段如下: ? ??Route Distinguisher: 指示一個 EVPN Instance 的 RD 值,用于區(qū)分不同的 EVPN Instances。每個 EVPN Instance 都具有一個對應(yīng)的 BD(二層廣播域)。
? ??Ethernet Segment Identifier: EVPN 允許在同一物理網(wǎng)絡(luò)上創(chuàng)建多個虛擬網(wǎng)絡(luò),這些虛擬網(wǎng)絡(luò)被稱為 Ethernet Segment。而 Ethernet Segment Identifier 就是該虛擬網(wǎng)絡(luò)的唯一標(biāo)識。在 VxLAN 場景中,ES 就是 VxLAN Tunnel,ESI 用于唯一標(biāo)識一個 VxLAN Tunnel 的連接。
? ??Ethernet Tag ID 指示當(dāng)前設(shè)備配置的以太網(wǎng) VLAN ID。
? ??MAC Address Length 指示該 Route 攜帶的 host-MAC 地址的長度。
? ??MAC Address 指示該 Route 攜帶的 host-MAC 地址。 ?
??IP Address Length 指示該 Route 攜帶的 host-IP 地址的掩碼長度,為 32bits(IPv4)或 128bits(IPv6)。
? ??IP Address 指示該 Route 攜帶的 host-IP 地址。 ?
??MPLS Label1 指示該 Route 攜帶的 L2 VNI,用于標(biāo)識不同的 BD。 ?
??MPLS Label2 指示該 Route 攜帶的 L3 VNI,用于標(biāo)識不同的 VRF(L3 VPN)。VxLAN 網(wǎng)絡(luò)中為了實現(xiàn)不同租戶之間的隔離,需要通過不同的 VRF 來隔離租戶的路由表。 ? 從上述字段可見,Type2 Route 的關(guān)鍵特性就是支持對稱 IRB(Integrated Bridging and Routing,集成的橋接和路由),能夠同時發(fā)布 L2 MAC Switching 和 L3 IP Routing 信息,以此來支撐 VxLAN L2 和 L3 Gateway 應(yīng)用場景。
? 基于這樣的特性,Type2 Route 非常適用于云計算虛擬機遷移的場景(MAC Mobility,MAC 移動性),可以有效避免了虛擬機遷移期間所帶來的 IP 地址更改,以及重新配置網(wǎng)絡(luò)的問題。例如:當(dāng)一臺 VM 從 VTEP1 遷移到 VTEP2 時,VTEP2 會學(xué)習(xí)到該 VM 的 ARP 信息(通過 VM 發(fā)出的 gARP 實現(xiàn)),并生成 VM 對應(yīng)的 Type2 Route,然后傳遞給 VTEP1。VTEP1 收到后,感知到 VM 的位置發(fā)生變化,觸發(fā) ARP 探測,當(dāng)探測不到 VM 時,則會撤銷 VM 在本地的 ARP 和主機路由信息。
VTEP 應(yīng)用 Type2 通告 host-MAC 地址
當(dāng) VTEP 是 VxLAN L2 Gateway 時,VTEP Peer 之間可以通過 Type2 Route 來互相學(xué)習(xí)對方的 host-MAC Table,包括:host-MAC、BD、Interface 等信息。 ? 如下圖所示,Leaf1、Leaf2 是 VxLAN L2 Gateway,Host1、Host2 屬于同一個 VxLAN 子網(wǎng),Leaf1 向 Leaf2 通告它的 host-MAC Table。 ?
Host1 通過特定的 Interface 和 BD 接入到 Leaf1 時,通常會觸發(fā) ARP、DHCP 等廣播流量。Leaf1 以此來學(xué)習(xí)到 Host1 對應(yīng)的 Host1-MAC 并記錄在 BD 的 host-MAC Table 中。
隨后 Leaf1 向 Leaf2 發(fā)送 Type2 Route,攜帶了 EVPN Instance RD、Host1-MAC、L2 VNI、VTEP IP 等信息。
Leaf2 收到 Type2 Route 后,根據(jù) L2 VNI 匹配到相應(yīng)的 BD,并將 Host1-MAC 保存在 BD 的 host-MAC Table 中。
VTEP 應(yīng)用 Type2 通告 host-IP 精確路由
在 VxLAN 網(wǎng)絡(luò)中,要想實現(xiàn)跨網(wǎng)絡(luò)之間的三層互訪,就需要在 VxLAN L3 Gateway 中應(yīng)用 L3 VPN Instance 和隔離的 Route Table 來完成 IP Routing。 ? 當(dāng) VTEP 是 VxLAN L3 Gateway 時,VTEP Peer 之間可以通過 Type2 Route 來互相學(xué)習(xí)對方的 host-IP Table,包括:host-IPv4 /32 或 host-IPv6 /128 精確路由、Interface、L3 VNI 等信息。 ? 以較為復(fù)雜的 “分布式 VxLAN L3 Gateway 組網(wǎng)” 場景為例。如下圖所示,Leaf1、Leaf2 同時作為 VxLAN L2/L3 Gateway,Host1、Host2 屬于不同的 VxLAN 子網(wǎng),Leaf1 向 Leaf2 通告它的 host-IP Table。 ? Host1 通過特定的 Interface 和 BD 接入到 Leaf1 時,通常會觸發(fā) ARP、DHCP 等廣播流量。
L2 Gateway 特性:學(xué)習(xí)到 Host1 對應(yīng)的 Host1-MAC 并記錄在 BD 的 host-MAC Table 中。
L3 Gateway 特性:學(xué)習(xí)到 Host1 對應(yīng)的 Host1-IP 并記錄在 L3 VNI 對應(yīng)的 VRF 的 host-IP Table 中。
隨后 Leaf1 向 Leaf2 發(fā)送 Type2 Route,攜帶了 EVPN Instance RD、Host1-MAC、Host1-IP、L2 VNI、L3 VNI、VTEP IP 等信息。 ? Leaf2 收到 Type2 Route 后,根據(jù) L2 VNI 匹配到相應(yīng)的 BD,并將 Host1-MAC 保存在 BD 的 host-MAC Table 中。
L2 Gateway 特性:根據(jù) L2 VNI 匹配到相應(yīng)的 BD,并將 Host1-MAC 保存在 BD 的 host-MAC Table 中。
L3 Gateway 特性:根據(jù) L3 VNI 匹配到相應(yīng)的 VRF,并將 Host1-IP 保存在 VRF 的 host-IP Table 中。
VTEP 應(yīng)用 Type2 實現(xiàn) ARP 廣播抑制
同一個 VxLAN 子網(wǎng)屬于一個 “大二層“ 虛擬網(wǎng)絡(luò),子網(wǎng)內(nèi)的主機要互相通信就需要知道對方的 MAC 地址,傳統(tǒng)的方式是發(fā)出 ARP Request 廣播報文。而在 EVPN 場景中,則可以應(yīng)用 Type2 實現(xiàn) ARP 廣播抑制,能夠有效減少 ARP 洪泛的流量。 ?
首先,VxLAN L3 Gateway 之間通過 Type2 Route 互相宣告 ARP 表項信息(host-MAC/IP)。
然后,VxLAN L3 Gateway 通過傳遞 ARP 類型路由,將 ARP 表項信息傳遞給 VxLAN L2 Gateway。
最后,VxLAN L2 Gateway 開啟 ARP 代答功能后,就會根據(jù) ARP 表項信息生成 ARP 廣播抑制表,包括:host-IP、host-MAC、VTEP、VNI 等信息。
完成控制面的配置后,當(dāng) VxLAN L2 Gateway(e.g. Leaf1)再收到從 Host1 向 Host2 發(fā)出的 ARP Request 時,就會先查看自己的 ARP 廣播抑制表,發(fā)現(xiàn)有 Host2 的 MAC-IP 記錄,則直接將 ARP Request 報文中的廣播 MAC 地址替換為目的單播 MAC 地址(廣播變單播),然后原路 Reply,從而達(dá)到 ARP 廣播抑制的目的。
但需要注意的是,Type2 Route 和 ARP 廣播抑制只是減少了 ARP 洪泛流量,但不能完全避免,例如下面場景: ?
新上線的可能是 “靜默主機“,它不會自動觸發(fā) ARP、DHCP 等廣播流量,所以上掛 VTEP 不能被動學(xué)習(xí)其 MAC 地址。首次訪問 “靜默主機” 時,還是需要在 VxLAN 子網(wǎng)中廣播 ARP Request 報文來獲得對方的 MAC 地址。
在 VTEP 沒來及的學(xué)習(xí)到 ARP 廣播抑制表項的時候,也會按照正常的流程進(jìn)行廣播。
Type3:Inclusive Multicast Ethernet Tag Route(集成多播 Ethernet Tag 路由)
通過應(yīng)用 Type3 Route 可以實現(xiàn) VTEP Peers 的自動發(fā)現(xiàn)和認(rèn)證,并在 VTEP Peer 之間互相傳遞 L2 VNI 和 VTEP IP 地址信息。 ? Type3 Route 的 EVPN NLRI 字段如下: ?
Route Distinguisher:指示 EVPN Instance 的 RD 值。
Ethernet Tag ID:指示當(dāng)前設(shè)備配置的以太網(wǎng) VLAN ID。在 Type3 Route 中為全 0。
IP Address Length:指示該 Route 攜帶的 local-VTEP IP 地址的掩碼長度。
Originating Router's IP Address:指示該 Route 攜帶的 local-VTEP IP 地址。
Flags:在 VxLAN 場景中,該字段沒有實際意義。
MPLS Label:指示該 Route 攜帶的 L2 VNI,用于標(biāo)識不同的 BD。
Tunnel Type:指示該 Route 攜帶的隧道類型。在 VxLAN 場景中,該字段為 “6: Ingress Replication”,即頭端復(fù)制類型。
Tunnel Identifier:指示該 Route 攜帶的隧道信息。在 VxLAN 場景中,該字段也是 local-VTEP IP 地址。
VTEP 應(yīng)用 Type3 建立頭端復(fù)制列表
前面提到 Type2 Route 只能 “抑制“ ARP 洪泛流量,但不能完全避免。這些不能避免的 BUM 流量,還是需要通過頭端復(fù)制或核心復(fù)制方式來進(jìn)行廣播或組播。 ? 以頭端復(fù)制為例,VTEP Peer 之間可以通過 Type3 Route 宣告來實現(xiàn)自動創(chuàng)建頭端復(fù)制列表,包括:L2 VNI、src-VTEP IP、dst-VTEP IP 等信息。如下圖所示,Leaf1、Leaf2、Leaf3 作為 VTEP,Leaf1 向 Leaf2、Leaf3 發(fā)送 Type3 Route。 ?
在 Leaf1 上完成 VTEP IP、L2 VNI、EVPN Instance 等相關(guān)配置后,Leaf1 會向 Leaf2、Leaf3 分別發(fā)送 Type3 Route,攜帶了 L2 VNI、local-VTEP IP、EVPN Instance RD 等信息。
Leaf2、Leaf3 收到來自 Leaf1 的 Type3 Route 后:
如果 Leaf1 VTEP IP 三層路由可達(dá),則建立一條 VxLAN Tunnel。
如果如果 remote-VNI 與 local-VNI 相同,則新建一個頭端復(fù)制表,用于后續(xù) BUM 報文廣播。
Type5:IP Prefix Route(IP 前綴路由)
Type3 Route 的 EVPN NLRI 字段如下: ?
Route Distinguisher
指示 EVPN Instance 的 RD 值。 ?
Ethernet Segment Identifier
用于唯一標(biāo)識一個 VxLAN Tunnel 的連接。 ?
Ethernet Tag ID
指示當(dāng)前設(shè)備配置的以太網(wǎng) VLAN ID。 ?
IP Prefix Length
指示該 Route 攜帶的 IP Prefix 的掩碼長度。 ?
IP Prefix
指示該 Route 攜帶的 IP Prefix,可以是精確路由(/32 或 /128),也可以網(wǎng)段地址(/0-32 或 /0-128),主要是傳遞網(wǎng)段路由。 ?
GW IP Address
指示默認(rèn)網(wǎng)關(guān)地址。該字段在 VxLAN 場景中沒有實際意義。 ?
MPLS Label
指示該 Route 攜帶的 L3 VNI,用于標(biāo)識不同的 VRF。 ?
VTEP 應(yīng)用 Type5 通告 host-IP 網(wǎng)段路由
Type5 Route 有 2 個主要的應(yīng)用場景: ?
在沒有 IP 地址重疊的網(wǎng)絡(luò)規(guī)劃中,可以配置 VTEP 通過 Type5 Route 宣告 host-IP 網(wǎng)段路由,而不是 host-IP 精確路由,以此來有效減少 VxLAN L3 Gateway 設(shè)備的路由表項。
在 VxLAN 網(wǎng)絡(luò)和外部 IP 網(wǎng)絡(luò)之間需要互聯(lián)互通時,可以通過 Type5 Route 將外部 IP 網(wǎng)段宣告到 VxLAN L3 Gateway,繼而實現(xiàn) VxLAN 網(wǎng)絡(luò)中的主機能夠與外部網(wǎng)絡(luò)之間進(jìn)行 IP 訪問。
如下圖所示,Leaf1、Leaf2 作為 VxLAN L3 Gateway,其中 Leaf1 連接了一個外部網(wǎng)絡(luò)的 192.168.1.0/24 網(wǎng)段。 ?
Leaf1 探測到 192.168.1.0/24 網(wǎng)段路由后,向 Leaf2 宣告 Type5 Route,包括:EVPN Instance RD、IP Prefix、L3 VNI、Leaf1 VTEP IP 地址等信息。
Leaf2 收到 Type5 Route 后,學(xué)習(xí)到 192.168.1.0/24 網(wǎng)段信息,并將其保存在相應(yīng)的 Route Table 中,其下一跳為 Leaf1 VTEP IP 地址。
后續(xù),Leaf2 就可以直接轉(zhuǎn)發(fā) dstIP 為 192.168.1.0/24 網(wǎng)段的 IP 報文了。
? ?
編輯:黃飛
?
評論