Vxlan 文檔(一)

Vxlan

1.vxlan 簡介

VXLAN 全稱是 Virtual eXtensible Local Area Network,虛擬可擴展的局域網。它是一種 overlay 技術,通過三層的網絡來搭建虛擬的二層網絡。rfc7348 (參考資料1) 上的介紹是這樣的:

A framework for overlaying virtualized layer 2 networks over lay 3 networks.

每一個技術出來都有它要解決的問題,VXLAN 也不例外,那麼我們先看看 VXLAN 到底要解決哪些問題。

  • 虛擬化(虛擬機和容器)的興起使得一個數據中心會有成千上萬的機器需要通信,而傳統的 VLAN 技術只能支持 4096 個網絡上限,已經滿足不了不斷擴展的數據中心規模
  • 越來越多的數據中心(尤其是公有云服務)需要提供多租戶的功能,不同用戶之間需要獨立地分配 ip 和 MAC 地址,如何保證這個功能的擴展性和正確性也是一個待解決的問題
  • 雲計算業務對業務靈活性要求很高,虛擬機可能會大規模遷移,並保證網絡一直可用,也就是大二層的概念。解決這個問題同時保證二層的廣播域不會過分擴大,也是雲計算網絡的要求

傳統二層+三層的網絡在應對這些要求時變得力不從心,雖然很多改進型的技術比如堆疊、SVF、TRILL 等能夠增加二層的範圍,努力改進經典網絡,但是要做到對網絡改動小同時保證靈活性高卻非常困難。

為了解決這些問題,有很多方案被提出來,vxlan 就是其中之一。vxlan 是 VMware、Cisco 等一眾大型企業共同推出的,目前標準文檔在 RFC7348。

Vxlan 文檔(一)


2. VXLAN 模型

vxlan 這類隧道網絡的一個特點是對原有的網絡架構影響小,原來的網絡不需要做任何改動,在原來網絡基礎上架設一層新的網絡。

vxlan 自然會引入一些新的概念,這部分就講講它們。下面這張圖 是 vxlan 的工作模型,它創建在原來的 IP 網絡(三層)上,只要是三層可達(能夠通過 IP 互相通信)的網絡就能部署 vxlan。在每個端點上都有一個 vtep 負責 vxlan 協議報文的封包和解包,也就是在虛擬報文上封裝 vtep 通信的報文頭部。物理網絡上可以創建多個 vxlan 網絡,這些 vxlan 網絡可以認為是一個隧道,不同節點的虛擬機能夠通過隧道直連。每個 vxlan 網絡由唯一的 VNI 標識,不同的 vxlan 可以不相互影響。

Vxlan 文檔(一)


Vxlan 文檔(一)


Vxlan 文檔(一)


Vxlan 文檔(一)


  • VTEP(VXLAN Tunnel Endpoints):vxlan 網絡的邊緣設備,用來進行 vxlan 報文的處理(封包和解包)。vtep 可以是網絡設備(比如交換機),也可以是一臺機器(比如虛擬化集群中的宿主機)
  • VNI(VXLAN Network Identifier):VNI 是每個 vxlan 的標識,是個 24 位整數,一共有 2^24 = 16,777,216(一千多萬),一般每個 VNI 對應一個租戶,也就是說使用 vxlan 搭建的公有云可以理論上可以支撐千萬級別的租戶
  • Tunnel:隧道是一個邏輯上的概念,在 vxlan 模型中並沒有具體的物理實體想對應。隧道可以看做是一種虛擬通道,vxlan 通信雙方(圖中的虛擬機)認為自己是在直接通信,並不知道底層網絡的存在。從整體來說,每個 vxlan 網絡像是為通信的虛擬機搭建了一個單獨的通信通道,也就是隧道

現在來說,這些概念還是非常晦澀難理解的,我們會在下面具體講解 vxlan 網絡的報文和通信流程,希望文章結束之後再回來看這些概念能明白它們的意思。

Vxlan 文檔(一)


Vxlan 文檔(一)


3. VXLAN 報文解析

前面說過,vxlan 在三層網絡上構建一個虛擬的二層網絡出來,這一點能夠在 vxlan 的報文上很明顯地體現出來。

下圖是 vxlan 協議的報文,白色的部分是虛擬機發送報文(二層幀,包含了 MAC 頭部、IP 頭部和傳輸層頭部的報文),前面加了 vxlan 頭部用來專門保存 vxlan 相關的內容,在前面是標準的 UDP 協議頭部(UDP 頭部、IP 頭部和 MAC 頭部)用來在底層網路上傳輸報文。

Vxlan 文檔(一)


Vxlan 文檔(一)


從這個報文中可以看到三個部分:

最外層的 UDP 協議報文用來在底層網絡上傳輸,也就是 vtep 之間互相通信的基礎

中間是 VXLAN 頭部,vtep 接受到報文之後,去除前面的 UDP 協議部分,根據這部分來處理 vxlan 的邏輯,主要是根據 VNI 發送到最終的虛擬機

最裡面是原始的報文,也就是虛擬機看到的報文內容

報文各個部分的意義如下:

VXLAN header:vxlan 協議相關的部分,一共 8 個字節

VXLAN flags:標誌位

Reserved:保留位

VNID:24 位的 VNI 字段,這也是 vxlan 能支持千萬租戶的地方

Reserved:保留字段

UDP 頭部,8 個字節

UDP 應用通信雙方是 vtep 應用,其中目的端口就是接收方 vtep 使用的端口,IANA 分配的端口是 4789

IP 頭部:20 字節

主機之間通信的地址,可能是主機的網卡 IP 地址,也可能是多播 IP 地址

MAC 頭部:14 字節

主機之間通信的 MAC 地址,源 MAC 地址為主機 MAC 地址,目的 MAC 地址為下一跳設備的 MAC 地址

可以看出 vxlan 協議比原始報文多 50 字節的內容,這會降低網絡鏈路傳輸有效數據的比例。vxlan 頭部最重要的是 VNID 字段,其他的保留字段主要是為了未來的擴展,目前留給不同的廠商用這些字段添加自己的功能。

vxlan 網絡通信過程

通過上節的內容,我們大致瞭解 vxlan 報文的發送過程。虛擬機的報文通過 vtep 添加上 vxlan 以及外部的報文層,然後發送出去,對方 vtep 收到之後拆除 vxlan 頭部然後根據 VNI 把原始報文發送到目的虛擬機。

上面的過程是雙方已經知道所有通信信息的過程,但是在第一次通信之前還有很多問題有解決:

  • 哪些 vtep 需要加到一個相同的 VNI 組?
  • 發送方虛擬機怎麼知道對方的 MAC 地址?
  • vtep 怎麼知道目的虛擬機在哪一臺宿主機上?

這三個問題可以歸結為同一個問題:vxlan 網絡怎麼感知彼此的存在並選擇正確的路徑傳輸報文?

而且第一個問題也是不用回答的,因為 vtep 形成的組是虛構的概念,只有某些 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 網絡的 vtep 加入到同一個多播網絡,如果需要知道以上信息,就在組內發送多播來查詢;控制中心的概念是在某個集中式的地方保存了所有虛擬機的上述信息,自動化告知 vtep 它需要的信息。

針對這兩種方式,我們下面就分別分析。

多播

多播的概念和工作原理不是這裡的重點,所以就不介紹了。簡單來說,每個多播組對應一個多播 IP 地址,往這個多播 IP 地址發送的報文會發給多播組的所有主機。

為什麼要使用多播?因為 vxlan 的底層網絡是三層的,廣播地址無法穿越三層網絡,要給 vxlan 網絡所有 vtep 發送報文只能通過多播。

下圖是在多播模式下,vxlan 的報文工作流程,位於左下方的 機器 A 要通過 vxlan 網絡發送報文給右下方的機器 B。

Vxlan 文檔(一)


vtep 建立的時候會通過配置加入到多播組(具體做法取決於實現),圖中的多播組 IP 地址是 239.1.1.1。

1機器 A 只知道對方的 IP 地址,不知道 MAC 地址,因此會發送 ARP 報文進行查詢,內部的 ARP 報文很普通,目標地址為全 1 的廣播地址

2vtep 收到 ARP 報文,發現虛擬機目的 MAC 為廣播地址,封裝上 vxlan 協議頭部之後(外層 IP 為多播組 IP,MAC 地址為多播組的 MAC 地址),發送給多播組 239.1.1.1,支持多播的底層網絡設備(交換機和路由器)會把報文發送給組內所有的成員

3vtep 接收到 vxlan 封裝的 ARP 請求,去掉 vxlan 頭部,並通過報文學習到發送方 三元組保存起來,把原來的 ARP 報文廣播給主機

4主機接收到 ARP 請求報文,如果 ARP 報文請求的是自己的 MAC 地址,就返回 ARP 應答

5vtep-2 此時已經知道發送放的虛擬機和 vtep 信息,把 ARP 應答添加上 vxlan 頭部(外部 IP 地址為 vtep-1 的 IP 地址,VNI 是原來報文的 VNI)之後通過單播發送出去

6vtep-1 接收到報文,並學習到報文中的三元組,記錄下來。然後 vtep 進行解包,知道內部的 IP 和 MAC 地址,並轉發給目的虛擬機

7虛擬機拿到 ARP 應答報文,就知道了到目的虛擬機的 MAC 地址

在這個過程中,只有一次多播,因為 vtep 有自動學習的能力,後續的報文都是通過單播直接發送的。可以看到,多播報文非常浪費,每次的多播其實只有一個報文是有效的,如果某個多播組的 vtep 數量很多,這個浪費是非常大的。但是多播組也有它的實現起來比較簡單,不需要中心化的控制,只有底層網絡支持多播,只有配置好多播組就能自動發現了。

單播報文的發送過程就是上述應答報文的邏輯,應該也非常容易理解了。還有一種通信方式,那就是不同 VNI 網絡之間的通信,這個需要用到 vxlan 網關(可以是物理網絡設備,也可以是軟件),它接收到一個 vxlan 網絡報文之後解壓,根據特定的邏輯添加上另外一個 vxlan 頭部轉發出去。

因為並不是所有的網絡設備都支持多播,再加上多播方式帶來的報文浪費,在實際生產中這種方式很少用到。

分佈式控制中心

從多播的流程可以看出來,其實 vtep 發送報文最關鍵的就是知道對方虛擬機的 MAC 地址和虛擬機所在主機的 vtep IP 地址。如果能夠事先知道這兩個信息,直接告訴 vtep,那麼就不需要多播了。

在虛擬機和容器的場景中,當虛擬機或者容器啟動還沒有進行網絡通訊時,我們就可以知道它的 IP 和 MAC(可能是用某種方式獲取,也有可能是事先控制這兩個地址),分佈式控制中心保存了這些信息。除此之外,控制中心還保存了每個 vxlan 網絡有哪些 vtep,這些 vtep 的地址是多少。有了這些信息,vtep 就能發送報文時直接查詢並添加頭部,不需要多播去滿網絡地問了。

一般情況下,在每個 vtep 所在的節點都會有一個 agent,它會和控制中心通信,獲取 vtep 需要的信息以某種方式告訴 vtep。具體的做法取決於具體的實現,每種實現可能會更新不同的信息給 vtep,比如 HER(Head End Replication)只是把多播組替換成多個單播報文,也就是把多播組所有的 VTEP IP 地址告訴 vtep,這樣查詢的時候不是發送多播,而是給組內每個 vtep 發送一個單播報文;有些實現只是告訴 vtep 目的虛擬機的 MAC 地址信息;有些實現告訴 MAC 地址對應的 vtep IP 地址。

此外,什麼時候告訴 vtep 這些信息也是有區別的。一般有兩種方式:常見的是一旦知道了虛擬機的三元組信息就告訴 vtep(即使某個 vtep 用不到這個信息,因為它管理的虛擬機不會和這個地址通信),一般這時候第一次通信還沒有發生;另外一種方式是在第一次通信時,當 vtep 需要這些信息的時候以某種方式通知 agent,然後 agent 這時候才告訴 vtep 信息。

分佈式控制的 vxlan 是一種典型的 SDN 架構,也是目前使用最廣泛的方式。因為它的實現多樣,而且每種實現都有些許差距,這裡不便來具體的例子來說明,只要明白了上面的原理,不管是什麼樣的實現,都能很快上手。

vxlan 網絡帶來新的問題

vxlan 協議給虛擬網絡帶來了靈活性和擴展性,讓雲計算網絡能夠像計算、存儲資源那樣按需擴展,並靈活分佈。和計算機領域所有技術一樣,這也是一種 tradeoff,相對於經典網絡來說,vxlan 主要的問題是它的複雜性和額外的開銷。

額外的報文和計算

這一點可容易看出來,每個 vxlan 報文都有額外的 50 字節開銷,如果加上 vlan 字段,開銷要到 54 字節。這對於小報文的傳輸是非常昂貴的操作,試想如果某個報文應用數據才幾個字節,原來的網絡頭部加上 vxlan 報文頭部都能有 100 字節的控制信息。

額外的報文也帶來了額外的計算量,每個 vxlan 報文的封包和解包操作都是必須的,如果用軟件來實現這些步驟,額外的計算量也是不可以忽略的影響。

複雜度

vxlan 另外一個缺點是複雜度,雖然經典網絡在應對雲計算時捉緊見拙,但是經典網絡模型已經發展了很久,所有的部署、監控、運維都比較成熟。如果使用 vxlan 網絡,那麼所有的這些都要重新學習,時間和人力成本必然會大大提高。


分享到:


相關文章: