著作權宣告:本文為Heriam博主原創文章,遵循CC 4.0 BY-SA 著作權協議,轉載請附上原文出處鏈接和本宣告,
原文鏈接:https://jiang-hao.com/articles/2020/networking-vxlan-in-depth.html
目錄
- VxLAN簡介
- 背景
- 定義
- 意義
- VxLAN組網模型
- VxLAN報文格式
- VxLAN運行機制
- 隧道建立
- 手工方式
- 自動方式
- 二層MAC學習
- 組播方式
- 控制器方式
- BUM報文轉發
- 單播路由方式泛洪(頭端復制)
- 組播路由方式泛洪(核心復制)
- 隧道建立
- 參考文獻
VxLAN簡介
背景
任何技術的產生,都有其特定的時代背景與實際需求,VXLAN正是為了解決云計算時代虛擬化中的一系列問題而產生的一項技術,那么我們先看看 VXLAN 到底要解決哪些問題,
- 虛擬機規模受網路設備表項規格的限制
對于同網段主機的通信而言,報文通過查詢MAC表進行二層轉發,服務器虛擬化后,資料中心中VM的數量比原有的物理機發生了數量級的增長,伴隨而來的便是虛擬機網卡MAC地址數量的空前增加,一般而言,接入側二層設備的規格較小,MAC地址表項規模已經無法滿足快速增長的VM數量,
-
傳統網路的隔離能力有限
虛擬化(虛擬機和容器)的興起使得一個資料中心會有動輒上萬的機器需要通信,而傳統的 VLAN 技術在標準定義中只有12位元,也就只能支持 4096 個網路上限,已經顯然滿足不了不斷擴展的資料中心規模,
-
虛擬機遷移范圍受限
虛擬機遷移,顧名思義,就是將虛擬機從一個物理機遷移到另一個物理機,但是要求在遷移程序中業務不能中斷,要做到這一點,需要保證虛擬機遷移前后,其IP地址、MAC地址等引數維持不變,這就決定了,虛擬機遷移必須發生在一個二層域中,而傳統資料中心網路的二層域,將虛擬機遷移限制在了一個較小的區域范圍內,此外,解決這個問題同時還需保證二層的廣播域不會過分擴大,這也是云計算網路的要求,
傳統“二層+三層”的網路在應對這些要求時變得力不從心,雖然通過很多改進型的技術比如堆疊、SVF、TRILL等可以構建物理上的大二層網路,可以將虛擬機遷移的范圍擴大,但是,構建物理上的大二層,難免需要對原來的網路做大的改動,并且大二層網路的范圍依然會受到種種條件的限制,
為了解決這些問題,有很多方案被提出來,VxLAN就是其中之一,VxLAN 是 VMware、Cisco 等一眾大型企業共同推出的,目前標準檔案在 RFC7348,
定義
在介紹完VxLAN要解決的問題也就是技術背景之后,接下來正式闡述一下VxLAN的定義,也就是它到底是什么,
VXLAN 全稱是 Virtual eXtensible Local Area Network,虛擬可擴展的局域網,它是一種 Overlay 技術,采用L2 over L4(MAC-in-UDP)封裝方式,是NVO3(Network Virtualization over Layer 3)中的一種網路虛擬化技術,將二層報文用三層協議進行封裝,可實作虛擬的二層網路在三層范圍內進行擴展,同時滿足資料中心大二層虛擬遷移和多租戶的需求,RFC7348上的介紹是這樣的:
A framework for overlaying virtualized layer 2 networks over lay 3 networks.
意義
針對大二層網路,VxLAN技術的出現很好的解決了云計算時代背景下資料中心在物理網路基礎設施上實施服務器虛擬化的隔離和可擴展性問題:
- 通過24位元的VNI可以支持多達16M的VXLAN段的網路隔離,對用戶進行隔離和標識不再受到限制,可滿足海量租戶,
- 除VXLAN網路邊緣設備,網路中的其他設備不需要識別虛擬機的MAC地址,減輕了設備的MAC地址學習壓力,提升了設備性能,
- 通過采用MAC in UDP封裝來延伸二層網路,實作了物理網路和虛擬網路解耦,租戶可以規劃自己的虛擬網路,不需要考慮物理網路IP地址和廣播域的限制,大大降低了網路管理的難度,
VxLAN組網模型
VxLAN主要用于資料中心網路,VxLAN技術將已有的三層物理網路作為Underlay網路,在其上構建出虛擬的二層網路,即Overlay網路,Overlay網路通過Mac-in-UDP封裝技術、利用Underlay網路提供的三層轉發路徑,實作租戶二層報文跨越三層網路在不同的站點間傳遞,對于租戶來說,Underlay網路是透明的,同一租戶的不同站點就像是作業在一個局域網中,同時,在同一個物理網路上可以構建多個VxLAN網路,每個VxLAN網路由唯一的VNI標識,不同VxLAN之間互不影響,從而實作租戶網路之間的隔離,
如上圖所示,VxLAN的典型網路模型中主要包含以下幾個基本元素:
- VM (Virtual Machine): 虛擬機,在一臺服務器上可以創建多臺虛擬機,不同的虛擬機可以屬于不同的 VXLAN,處于相同VxLAN的虛擬機處于同一個邏輯二層網路,彼此之間二層互通;屬于不同VxLAN的虛擬機之間二層隔離,
- VxLAN Tunnel: VxLAN隧道,“隧道”是一個邏輯上的概念,它并不新鮮,比如大家熟悉的GRE,說白了就是將原始報文“變身”下,加以“包裝”,好讓它可以在承載網路(比如IP網路)上傳輸,從主機的角度看,就好像原始報文的起點和終點之間,有一條直通的鏈路一樣,而這個看起來直通的鏈路,就是“隧道”,顧名思義,“VXLAN隧道”便是用來傳輸經過VXLAN封裝的報文的,它是建立在兩個VTEP之間的一條虛擬通道,Vxlan 通信雙方(圖中的虛擬機)認為自己是通過二層VSI直接通信,并不知道底層網路的存在,
- VTEP (VxLAN Tunnel Endpoints): VXLAN隧道端點,VXLAN網路的邊緣設備,是VXLAN隧道的起點和終點,VXLAN報文的封裝和解封裝處理均在這上面進行,VTEP可以理解為Overlay網路立足于Underlay物理網路之上的支腳點,分配有物理網路的IP地址,該地址與虛擬網路無關,VXLAN報文中源IP地址為隧道一端節點的VTEP地址,目的IP地址為隧道另一端節點的VTEP地址,一對VTEP地址就對應著一個VXLAN隧道,VTEP 可以是一個獨立的網路設備(比如交換機),也可以是一臺物理服務器(比如虛擬機所在的宿主機),
- VNI (VXLAN Network Identifier): VXLAN 網路識別符號,以太網資料幀中VLAN只占了12位元的空間,這使得VLAN的隔離能力在資料中心網路中力不從心,而VNI的出現,就是專門解決這個問題的,VNI是一種類似于VLAN ID的用戶標示,一個VNI代表了一個租戶,即使多個終端用戶屬于同一個VNI,也表示一個租戶,VNI
由24位元組成,支持多達16M的租戶,屬于不同VNI的虛擬機之間不能直接進行二層通信,VXLAN報文封裝時,給VNI分配了足夠的空間使其可以支持海量租戶的隔離, - IP核心設備/隧道中間設備: 網路中普通的路由/轉發設備,不參與VxLAN處理,僅需根據封裝后的VxLAN報文的目的VTEP IP地址沿著VxLAN隧道路徑進行普通的三層轉發,
- VSI (Virtual Switch Instance): 虛擬交換實體,VTEP上為每個VxLAN提供二層交換服務的虛擬交換實體,VSI可以看做是VTEP上的一臺針對某個VxLAN內的資料幀進行二層轉發的虛擬交換機,它具有傳統以太網交換機的所有功能,包括源MAC地址學習、MAC地址老化、泛洪等,VSI與VxLAN一一對應,
- VSI-Interface: VSI的虛擬三層介面,類似于Vlan-Interface,用來處理跨VNI即跨VXLAN的流量,VSI-Interface與VSI一一對應,在沒有跨VNI流量時可以沒有VSI-Interface,
VxLAN報文格式
VXLAN是MAC in UDP的網路虛擬化技術,所以其報文封裝是在原始以太報文之前添加了一個UDP頭及VXLAN頭封裝:VTEP會將VM發出的原始報文封裝成一個新的UDP報文,并使用物理網路的IP和MAC地址作為外層頭,對網路中的其他設備只表現為封裝后的引數,也就是說,網路中的其他設備看不到VM發送的原始報文,
如果服務器作為VTEP,那從服務器發送到接入設備的報文便是經過封裝后的報文,這樣,接入設備就不需要學習VM的MAC地址了,它只需要根據外層封裝的報文頭負責基本的三層轉發就可以了,因此,虛擬機規模就不會受網路設備表項規格的限制了,
當然,如果網路設備作為VTEP,它還是需要學習VM的MAC地址,但是,從對報文進行封裝的角度來說,網路設備的性能還是要比服務器強很多,
下圖是 VxLAN 協議的報文,白色的部分是虛擬機發出的原始報文(二層幀,包含了 MAC 頭部、IP 頭部和傳輸層頭部的報文),前面加了VxLAN 頭部用來專門保存 VxLAN 相關的內容,再前面是標準的 UDP 協議頭部(UDP 頭部、IP 頭部和 MAC 頭部)用來在物理網路上傳輸報文,
從這個報文中可以看到三個部分:
- 最外層的 UDP 協議報文用來在底層物理網路上傳輸,也就是 VTEP 之間互相通信的基礎;
- 中間是 VXLAN 頭部,VTEP 接受到報文之后,去除前面的 UDP 協議部分,根據這部分來處理 VxLAN 的邏輯,主要是根據 VNI 發送到最終的虛擬機;
- 最里面是原始的二層幀,也就是虛擬機所見的報文內容,
VxLAN報文各個部分解釋如下:
-
Outer Ethernet/MAC Header: 外層以太頭,14位元組,如果有VLAN TAG則為18位元組,
- SA:發送報文的虛擬機所屬VTEP的MAC地址,
- DA:到達目的VTEP的路徑上下一跳設備的MAC地址,
- VLAN Type:可選欄位,當報文中攜帶VLAN Tag時,該欄位取值為0x8100,
- Ethernet Type:以太報文型別,IP協議報文該欄位取值為0x0800,
-
Outer IP Header: 外層IP頭,20位元組,其中,源IP地址(Outer Src. IP)為源VM所屬VTEP的IP地址,目的IP地址(Outer Dst. IP)為目的VM所屬VTEP的IP地址,IP協議號(Protocol)為17(0x11),指示內層封裝的是UDP報文,
-
Outer UDP Header: 外層UDP頭,8位元組,其中,UDP目的埠號(UDP Destination Port)固定為4789,指示內層封裝報文為VxLAN報文,UDP源埠號(UDP Source Port)為原始以太幀通過哈希演算法計算后的隨機任意值,可以用于VxLAN網路VTEP節點之間ECMP負載均衡,
-
VxLAN Header: VxLAN頭,8位元組,
- Flags: 8位元,RRRRIRRR,“I”位為1時,表示VXLAN頭中的VXLAN ID有效;為0,表示VXLAN ID無效,“R”位保留未用,設定為0,
- VxLAN ID (VNI): 24位元,用于標識一個單獨的VXLAN網路,這也是 VxLAN 能支持千萬租戶的地方,
- Reserved: 兩個保留欄位,分別為24位元和8位元,
-
Original L2 Frame: 原始以太網報文,
從報文的封裝可以看出,VXLAN頭和原始二層報文是作為UDP報文的載荷存在的,在VTEP之間的網路設備,只需要根據Outer MAC Header和Outer IP Header進行轉發,利用UDP Source Port進行負載分擔,這一程序,與轉發普通的IP報文完全相同,這樣,除了VTEP設備,現網的大量設備無需更換或升級即可支持VXLAN網路,
VxLAN協議比原始報文多出50位元組的內容,這會降低網路鏈路傳輸有效資料的比例,此外,新增加的VXLAN報文封裝也引入了一個問題,即MTU值的設定,一般來說,虛擬機的默認MTU為1500 Bytes,也就是說原始以太網報文最大為1500位元組,這個報文在經過VTEP時,會封裝上50位元組的新報文頭(VXLAN頭8位元組+UDP頭8位元組+外部IP頭20位元組+外部MAC頭14位元組),這樣一來,整個報文長度達到了1550位元組,而現有的VTEP設備,一般在解封裝VXLAN報文時,要求VXLAN報文不能被分片,否則無法正確解封裝,這就要求VTEP之間的所有網路設備的MTU最小為 1550位元組,如果中間設備的MTU值不方便進行更改,那么設定虛擬機的MTU值為1450,也可以暫時解決這個問題,
VxLAN頭部最重要的是VNID欄位,其他的保留欄位主要是為了未來的擴展,很多廠商都會加以運用來實作自己組網的一些特性,
VxLAN運行機制
隧道建立
網路中存在多個VTEP,那么這其中哪些VTEP間需要建立VXLAN隧道呢?如前所述,通過VXLAN隧道,“二層域”可以突破物理上的界限,實作大二層網路中VM之間的通信,所以,連接在不同VTEP上的VM之間如果有“大二層”互通的需求,這兩個VTEP之間就需要建立VXLAN隧道,換言之,同一大二層域內的VTEP之間都需要建立VXLAN隧道,
一般而言,隧道的建立不外乎手工方式和自動方式兩種,
手工方式
這種方式需要用戶手動指定VXLAN隧道的源和目的IP地址分別為本端和對端VTEP的IP地址,也就是人為的在本端VTEP和對端VTEP之間建立靜態VXLAN隧道,以華為CE系列交換機為例,以上配置是在NVE(Network Virtualization Edge)介面下完成的,配置程序如下:
#
interface Nve1 //創建邏輯介面NVE 1
source 1.1.1.1 //配置源VTEP的IP地址(推薦使用Loopback介面的IP地址)
vni 5000 head-end peer-list 2.2.2.2
vni 5000 head-end peer-list 2.2.2.3
#
其中,vni 5000 head-end peer-list 2.2.2.2和vni 5000 head-end peer-list 2.2.2.3的配置,表示屬于VNI 5000的對端VTEP有兩個,IP地址分別為2.2.2.2和2.2.2.3,根據這兩條配置,VTEP上會生成如下所示的一張表:
<HUAWEI> display vxlan vni 5000 verbose
BD ID : 10
State : up
NVE : 288
Source : 1.1.1.1
UDP Port : 4789
BUM Mode : head-end
Group Address : -
Peer List : 2.2.2.2 2.2.2.3
根據上表中的Peer List,本端VTEP就可以知道屬于同一VNI的對端VTEP都有哪些,這也就決定了同一大二層廣播域的范圍,當VTEP收到BUM(Broadcast&Unknown-unicast&Multicast,廣播&未知單播&組播)報文時,會將報文復制并發送給Peer List中所列的所有對端VTEP(這就好比廣播報文在VLAN內廣播),因此,這張表也被稱為“頭端復制串列”,當VTEP收到已知單播報文時,會根據VTEP上的MAC表來確定報文要從哪條VXLAN隧道走,而此時Peer List中所列的對端,則充當了MAC表中“出介面”的角色,在后面的報文轉發流程中,你將會看到頭端復制串列是如何在VXLAN網路中指導報文進行轉發的,
自動方式
自動方式下VXLAN隧道的建立需要借助于其他的協議,例如通過BGP/EVPN(Ethernet Virtual Private Network)或ENDP(Enhanced Neighbor Discovery Protocol)發現遠端VTEP后,自動在本端和遠端VTEP之間建立VXLAN隧道,
二層MAC學習
通過上節的內容,我們大致了解 VxLAN 報文的發送程序,概括地說就是虛擬機的報文通過 VTEP 添加上 VxLAN 以及外部的UDP/IP報文頭,然后發送出去,對方 VTEP 收到之后拆除 VxLAN 頭部然后根據 VNI 把原始報文發送到目的虛擬機,
這個程序是雙方已經知道所有通信所需資訊的情況下的轉發流程,但是在第一次通信之前還有很多問題有解決:
- VTEP是如何對報文進行封裝?
- 發送方虛擬機怎么知道對方的 MAC 地址?
- VTEP怎么知道目的虛擬機在哪一臺宿主機上?
要回答這些問題,我們還是回到 VxLAN 協議報文上,看看一個完整的 VxLAN 報文需要哪些資訊,
- 內層報文:通信的虛擬機雙方要么直接使用 IP 地址,要么通過 DNS 等方式已經獲取了對方的 IP 地址,因此網路層的源和目的地址已經知道,同一個網路的虛擬機需要通信,還需要知道對方虛擬機的 MAC 地址,VxLAN需要一個機制來實作類似傳統網路 ARP 的功能,
- VxLAN 頭部:只需要知道 VNI,這一般是直接配置在 VTEP 上的,要么是提前規劃固定的,要么是根據內部報文自動生成的,也不需要擔心,
- UDP 頭部:最重要的是源埠和目的埠,源埠是系統生成并管理的,目的埠也是固定的,比如 IANA 規定的 4789 埠,這部分也不需要擔心,
- 外層IP頭部:外層IP頭部關心的是隧道兩端VTEP的IP地址,源地址可以很簡單確定,目的地址是目的虛擬機所在宿主機關聯的VTEP IP 地址,這個也需要由某種方式來確定,
- 外層MAC頭部:如果目的VTEP 的 IP 地址確定了,根據路由表查找到下一跳的MAC 地址可以通過經典的 ARP 方式來獲取,畢竟 VTEP 網路在同一個三層,經典網路架構那一套就能直接用了,
總結一下,一個 VxLAN 報文需要確定兩個地址資訊:目的虛擬機的 MAC 地址和目的 VTEP 的 IP 地址,如果 VNI 也是動態感知的,那么 VTEP 就需要一個三元組:
(內層目的虛機MAC, VNI, 外層目的VTEP IP)
組成為控制平面的表來記錄對端地址可達情況,VXLAN有著與傳統以太網非常相似的MAC學習機制,當VTEP接收到VXLAN報文后,會記錄源VTEP的IP、虛擬機MAC和VNI到本地MAC表中,這樣當VTEP接收到目的MAC為此虛擬機的MAC時,就可以進行VXLAN封裝并轉發,VXLAN學習地址的時候仍然保存著二層協議的特征,節點之間不會周期性的交換各自的轉發表,對于不認識的MAC地址,VXLAN一般依靠組播或控制中心來獲取路徑資訊,組播的概念是同個 VxLAN 網路的 VTEP 加入到同一個組播網路,如果需要知道以上資訊,就在組內發送多播來查詢;控制中心的概念是在某個集中式的地方保存了所有虛擬機的上述資訊,自動化告知 VTEP 它需要的資訊,
組播方式
每個多播組對應一個多播IP地址,vtep 建立的時候會通過配置加入到多播組(具體做法取決于實作),往這個多播IP地址發送的報文會發給多播組的所有主機,為什么要使用多播?因為vxlan的底層網路是三層的,廣播地址無法穿越三層網路,要給vxlan 網路所有vtep發送報文只能通過多播, 通過組播的方式承載ARP的廣播報文可以實作整個VxLAN網路下的地址決議以及VSI的MAC地址學習,在這個程序中,只需要有一次多播,因為VTEP有自動學習的能力,后續的報文都是通過單播直接發送的,也可以看到,多播報文非常浪費,每次的多播其實只有一個報文是有效的,如果某個多播組的 vtep 數量很多,這個浪費是非常大的,但是多播組也有它的實作起來比較簡單,不需要中心化的控制,只要底層網路支持多播,只需配置好多播組就能自動發現了,因為并不是所有的網路設備都支持多播,再加上多播方式帶來的報文浪費,在實際生產中這種方式很少用到,綜上,VXLAN和傳統VLAN網路資料平面一樣,資料經過未知單播泛洪->MAC表項及ARP表項建立->單播轉發的程序,我們稱之為自學習模式,但自學習方式過于簡單,其大量的泛洪報文以及無法智能調整的缺點,使得這樣的控制平面構建方式不適合SDN網路,
控制器方式
VTEP發送報文最關鍵的就是知道對方虛擬機的 MAC 地址和虛擬機所在主機的 VTEP IP 地址,如果實作知道這兩個資訊,那么就不需要多播了,SDN最大的特點就是轉控分離,集中控制,按照這個指導思想,將控制功能單獨剝離出來成為一個單獨的設備便是很自然的事了,這個設備就是 Controller,Controller可以是一個或者一組硬體設備,也可以是一套軟體,Controller與網路中所有設備建立連接,整個VXLAN網路的資料轉發都由Controller來管理,Controller與設備連接的介面稱為南向介面,可以使用OpenFlow、Netconf等協議;對用戶提供服務的介面稱為北向介面,也可以提供API以便與其他管理平臺對接或進行深度開發,基于Controller的南向介面,可以通過OpenFlow或OVSDB協議的方式向VTEP設備下發遠端MAC地址表項,具體不在這里進行展開講述,
BUM報文轉發
前面描述的報文轉發程序都是已知單播報文轉發,如果VTEP收到一個未知地址的BUM報文如何處理呢,與傳統以太網BUM報文轉發類似,VTEP會通過泛洪的方式轉發流量,BUM(Broadcast, Unknown-unicast, Multicast)即廣播、未知單播、組播流量,根據對泛洪流量的復制方式不同可分為單播路由方式(頭端復制)和組播路由方式(核心復制)兩種,
單播路由方式泛洪(頭端復制)
在頭端復制方式下,VTEP負責復制報文,采用單播方式將復制后的報文通過本地介面發送給本地站點,并通過VXLAN隧道發送給VXLAN內的所有遠端VTEP,
如下圖所示,當VTEP 1上的VM 1發出BUM報文后,VTEP 1判斷資料所屬的VXLAN,通過該VXLAN內所有本地介面和VXLAN Tunnel轉發報文,通過VXLAN Tunnel轉發報文時,封裝VXLAN頭、UDP頭和IP頭,將泛洪報文封裝于單播報文中,發送到VXLAN內的所有遠端VTEP,
遠端VTEP收到VXLAN報文后,解封裝報文,將原始資料在本地站點的VXLAN內泛洪,為避免環路,遠端VTEP從VXLAN隧道上接收到報文后,不會再將其泛洪到其他的VXLAN隧道,
通過頭端復制完成BUM報文的廣播,不需要依賴組播路由協議,
組播路由方式泛洪(核心復制)
組播路由方式的組網中同一個VXLAN內的所有VTEP都加入同一個組播組,利用組播路由協議(如PIM)在IP網路上為該組播建立組播轉發表項,VTEP上相應生成一個組播隧道,
與頭端復制方式不同,當VTEP 1上的VM 1發出BUM報文后,VTEP 1不僅在本地站點內泛洪,還會為其封裝組播目的IP地址,封裝后的報文根據已建立的組播轉發表項轉發到IP網路,
在組播報文到達IP網路中的中間設備時,該設備根據已建立的組播表項對報文進行復制并轉發,
遠端VTEP(VTEP 2和VTEP 3)接收到報文后,解封裝報文,將原始的資料幀在本地站點的指定VXLAN泛洪,為了避免環路,遠端VTEP從VXLAN隧道上接收到報文后,不會再將其泛洪到其他的VXLAN隧道,
由于泛洪流量使用了組播技術,所以整個組網中的網路設備需要支持組播路由協議(如PIM等)來建立組播路徑以便組播報文轉發,
參考文獻
- vxlan 協議原理簡介
- 華為悅讀匯技術發燒友:認識VXLAN
- 華為VxLAN技術白皮書
轉載請註明出處,本文鏈接:https://www.uj5u.com/qita/10245.html
標籤:其他
