VXLAN 基礎教程:VXLAN 協議原理介紹

VXLAN(Virtual eXtensible Local Area Network,虛擬可擴展局域網),是一種虛擬化隧道通訊技術。它是一種 Overlay(覆蓋網絡)技術,經過三層的網絡來搭建虛擬的二層網絡。linux

簡單來說,VXLAN 是在底層物理網絡(underlay)之上使用隧道技術,藉助 UDP 層構建的 Overlay 的邏輯網絡,使邏輯網絡與物理網絡解耦,實現靈活的組網需求。它對原有的網絡架構幾乎沒有影響,不須要對原網絡作任何改動,便可架設一層新的網絡。也正是由於這個特性,不少 CNI 插件(Kubernetes 集羣中的容器網絡接口,這個你們應該都知道了吧,若是你不知道,如今你知道了)纔會選擇 VXLAN 做爲通訊網絡。bash

VXLAN 不只支持一對一,也支持一對多,一個 VXLAN 設備能經過像網橋同樣的學習方式學習到其餘對端的 IP 地址,還能夠直接配置靜態轉發表。服務器

一個典型的數據中心 VXLAN 網絡拓撲圖如圖所示:微信

其中 VM 指的是虛擬機,Hypervisor 指的是虛擬化管理器。網絡

1. 爲何須要 VXLAN?

與 VLAN 相比,VXLAN 很明顯要複雜不少,再加上 VLAN 的先發優點,已經獲得了普遍的支持,那還要 VXLAN 幹啥?架構

VLAN ID 數量限制

VLAN tag 總共有 4 個字節,其中有 12 bit 用來標識不一樣的二層網絡(即 LAN ID),故而最多隻能支持 $2^{12}$,即 4096 個子網的劃分。而虛擬化(虛擬機和容器)的興起使得一個數據中心會有成千上萬的機器須要通訊,這時候 VLAN 就沒法知足需求了。而 VXLAN 的報文 Header 預留了 24 bit 來標識不一樣的二層網絡(即 VNI,VXLAN Network Identifier),即 3 個字節,能夠支持 $2^{24}$ 個子網。框架

交換機 MAC 地址表限制

對於同網段主機的通訊而言,報文到底交換機後都會查詢 MAC 地址表進行二層轉發。數據中心虛擬化以後,VM 的數量與原有的物理機相比呈數量級增加,而應用容器化以後,容器與 VM 相比也是呈數量級增加。。。而交換機的內存是有限的,於是 MAC 地址表也是有限的,隨着虛擬機(或容器)網卡 MAC 地址數量的空前增長,交換機表示壓力山大啊!學習

而 VXLAN 就厲害了,它用 VTEP(後面會解釋)將二層以太網幀封裝在 UDP 中,一個 VTEP 能夠被一個物理機上的全部 VM(或容器)共用,一個物理機對應一個 VTEP。從交換機的角度來看,只是不一樣的 VTEP 之間在傳遞 UDP 數據,只須要記錄與物理機數量至關的 MAC 地址表條目就能夠了,一切又回到了和從前同樣。spa

虛機或容器遷移範圍受限

VLAN 與物理網絡融合在一塊兒,不存在 Overlay 網絡,帶來的問題就是虛擬網絡不能打破物理網絡的限制。舉個例子,若是要在 VLAN 100 部署虛擬機(或容器),那隻能在支持 VLAN 100 的物理設備上部署插件

VLAN 其實也有解決辦法,就是將全部的交換機 Trunk 鏈接起來,產生一個大的二層,這樣帶來的問題就是廣播域過度擴大,也包括更多未知的單播和多播,即 BUM(Broadcast,Unknown Unicast,Multicast),同時交換機 MAC 地址表也會有承受不住的問題。

而 VXLAN 將二層以太網幀封裝在 UDP 中(上面說過了),至關於在三層網絡上構建了二層網絡。這樣無論你物理網絡是二層仍是三層,都不影響虛擬機(或容器)的網絡通訊,也就無所謂部署在哪臺物理設備上了,能夠隨意遷移。

總的來講,傳統二層和三層的網絡在應對這些需求時變得力不從心,雖然不少改進型的技術好比堆疊、SVF、TRILL 等可以增長二層的範圍,努力改進經典網絡,可是要作到對網絡改動儘量小的同時保證靈活性卻很是困難。爲了解決這些問題,有不少方案被提出來,Overlay 就是其中之一,而 VXLANOverlay 的一種典型的技術方案。下面就對 Overlay 作一個簡要的介紹。

2. Overlay 是個啥?

Overlay 在網絡技術領域,指的是一種網絡架構上疊加的虛擬化技術模式,其大致框架是對基礎網絡不進行大規模修改的條件下,實現應用在網絡上的承載,並能與其它網絡業務分離,而且以基於 IP 的基礎網絡技術爲主。

IETF 在 Overlay 技術領域提出 VXLANNVGRESTT 三大技術方案。大致思路均是將以太網報文承載到某種隧道層面,差別性在於選擇和構造隧道的不一樣,而底層均是 IP 轉發。VXLANSTT 對於現網設備而言對流量均衡要求較低,即負載鏈路負載分擔適應性好,通常的網絡設備都能對 L2-L4 的數據內容參數進行鏈路聚合或等價路由的流量均衡,而 NVGRE 則須要網絡設備對 GRE 擴展頭感知並對 flow ID 進行 HASH,須要硬件升級STT 對於 TCP 有較大修改,隧道模式接近 UDP 性質,隧道構造技術屬於革新性,且複雜度較高,而 VXLAN 利用了現有通用的 UDP 傳輸,成熟性極高。

整體比較,VLXAN 技術具備更大優點,並且當前 VLXAN 也獲得了更多廠家和客戶的支持,已經成爲 Overlay 技術的主流標準。

3. VXLAN 協議原理

VXLAN 有幾個常見的術語:

  • VTEP(VXLAN Tunnel Endpoints,VXLAN 隧道端點)

    VXLAN 網絡的邊緣設備,用來進行 VXLAN 報文的處理(封包和解包)。VTEP 能夠是網絡設備(好比交換機),也能夠是一臺機器(好比虛擬化集羣中的宿主機)。

  • VNI(VXLAN Network Identifier,VXLAN 網絡標識符)

    VNI 是每一個 VXLAN 段的標識,是個 24 位整數,一共有 $2^{24} = 16777216$(一千多萬),通常每一個 VNI 對應一個租戶,也就是說使用 VXLAN 搭建的公有云能夠理論上能夠支撐千萬級別的租戶。

  • Tunnel(VXLAN 隧道)

    隧道是一個邏輯上的概念,在 VXLAN 模型中並無具體的物理實體向對應。隧道能夠看作是一種虛擬通道,VXLAN 通訊雙方認爲本身是在直接通訊,並不知道底層網絡的存在。從總體來講,每一個 VXLAN 網絡像是爲通訊的虛擬機搭建了一個單獨的通訊通道,也就是隧道。

上圖所示爲 VXLAN 的工做模型,它建立在原來的 IP 網絡(三層)上,只要是三層可達(可以經過 IP 相互通訊)的網絡就能部署 VXLAN。在 VXLAN 網絡的每一個端點都有一個 VTEP 設備,負責 VXLAN 協議報文的解包和封包,也就是在虛擬報文上封裝 VTEP 通訊的報文頭部。

物理網絡上能夠建立多個 VXLAN 網絡,能夠將這些 VXLAN 網絡當作一個隧道,不一樣節點上的虛擬機/容器可以經過隧道直連。經過 VNI 標識不一樣的 VXLAN 網絡,使得不一樣的 VXLAN 能夠相互隔離。

VXLAN 的報文結構以下圖所示:

  • VXLAN Header : 在原始二層幀的前面增長 8 字節的 VXLAN 的頭部,其中最主要的是 VNID,佔用 3 個字節(即 24 bit),相似 VLAN ID,能夠具備 $2^{24}$ 個網段。

  • UDP Header : 在 VXLAN 和原始二層幀的前面使用 8 字節 UDP 頭部進行封裝(MAC IN UDP),目的端口號缺省使用 4789,源端口按流隨機分配(經過 MAC,IP,四層端口號進行 hash 操做), 這樣能夠更好的作 ECMP

    IANA(Internet As-signed Numbers Autority)分配了 4789 做爲 VXLAN 的默認目的端口號。

在上面添加的二層封裝以後,再添加底層網絡的 IP 頭部(20 字節)和 MAC 頭部(14 字節),這裏的 IP 和 MAC 是宿主機的 IP 地址和 MAC 地址

同時,這裏須要注意 MTU 的問題,傳統網絡 MTU 通常爲 1500,這裏加上 VXLAN 的封裝多出的(36+14/18,對於 14 的狀況爲 access 口,省去了 4 字節的 VLAN Tag)5054 字節,須要調整 MTU 爲 15501554,防止頻繁分包。

VXLAN 的 Flood 與 Learn

總的來講,VXLAN 報文的轉發過程就是:原始報文通過 VTEP,被 Linux 內核添加上 VXLAN 頭部以及外層的 UDP 頭部,再發送出去,對端 VTEP 接收到 VXLAN 報文後拆除外層 UDP 頭部,並根據 VXLAN 頭部的 VNI 把原始報文發送到目的服務器。但這裏有一個問題,第一次通訊前雙方如何知道全部的通訊信息?這些信息包括:

  • 哪些 VTEP 須要加到一個相同的 VNI 組?
  • 發送方如何知道對方的 MAC 地址?
  • 如何知道目的服務器在哪一個節點上(即目的 VTEP 的地址)?

第一個問題簡單,VTEP 一般由網絡管理員來配置。要回答後面兩個問題,還得回到 VXLAN 協議的報文上,看看一個完整的 VXLAN 報文須要哪些信息:

  • 內層報文 : 通訊雙方的 IP 地址已經明確,只須要 VXLAN 填充對方的 MAC 地址,所以須要一個機制來實現 ARP 功能。

  • VXLAN 頭部 : 只須要知道 VNI。通常直接配置在 VTEP 上,要麼提早規劃,要麼根據內層報文自動生成。

  • UDP 頭部 : 須要知道源端口和目的端口,源端口由系統自動生成,目的端口默認是 4789

  • IP 頭部 : 須要知道對端 VTEP 的 IP 地址,這個是最關鍵的部分

    實際上,VTEP 也會有本身的轉發表,轉發表經過泛洪和學習機制來維護,對於目標 MAC 地址在轉發表中不存在的未知單播,廣播流量,都會被泛洪給除源 VTEP 外全部的 VTEP,目標 VTEP 響應數據包後,源 VTEP 會從數據包中學習到 MACVNIVTEP 的映射關係,並添加到轉發表中,後續當再有數據包轉發到這個 MAC 地址時,VTEP 會從轉發表中直接獲取到目標 VTEP 地址,從而發送單播數據到目標 VTEP。

    VTEP 轉發表的學習能夠經過如下兩種方式:

    • 多播
    • 外部控制中心(如 Flannel、Cilium 等 CNI 插件)
  • MAC 頭部 : 肯定了 VTEP 的 IP 地址,後面就好辦了,MAC 地址能夠經過經典的 ARP 方式獲取。

4. Linux 的 VXLAN

Linux 對 VXLAN 協議的支持時間並不久,2012 年 Stephen Hemminger 才把相關的工做合併到 kernel 中,並最終出如今 kernel 3.7.0 版本。爲了穩定性和不少的功能,可能會看到某些軟件推薦在 3.9.0 或者 3.10.0 之後版本的 kernel 上使用 VXLAN。

到了 kernel 3.12 版本,Linux 對 VXLAN 的支持已經完備,支持單播和組播,IPv4 和 IPv6。利用 man 查看 ip 的 link 子命令,能夠查看是否有 VXLAN type:

$ man ip-link複製代碼

搜索 VXLAN,能夠看到以下描述:

管理 VXLAN 接口

Linux VXLAN 接口的基本管理以下:

  1. 建立點對點的 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 爲遠端主機的 IP,local 爲你本地主機的 IP,dev 表明 VXLAN 數據從哪一個接口傳輸。

    在 VXLAN 中,通常將 VXLAN 接口(本例中即 vxlan0)叫作 VTEP

  2. 建立多播模式的 VXLAN 接口:

    $ ip link add vxlan0 type vxlan id 4100 group 224.1.1.1 dstport 4789 dev eth0複製代碼

    多播組主要經過 ARP 泛洪來學習 MAC 地址,即在 VXLAN 子網內廣播 ARP 請求,而後對應節點進行響應。group 指定多播組的地址。

  3. 查看 VXLAN 接口詳細信息:

    $ ip -d link show vxlan0複製代碼

FDB 表

FDB(Forwarding Database entry,即轉發表)是 Linux 網橋維護的一個二層轉發表,用於保存遠端虛擬機/容器的 MAC地址,遠端 VTEP IP,以及 VNI 的映射關係,能夠經過 bridge fdb 命令來對 FDB 表進行操做:

  • 條目添加:

    $ 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. 總結

本文經過介紹 VXLAN 出現的時代背景、VXLAN 的概念和網絡模型、VXLAN 報文結構,讓你對 VXLAN 有了初步的認識;經過介紹 VXLAN 轉發表的泛洪和學習,讓你知道了通訊雙方如何感知對方;最後介紹了 Linux 中 VXLAN 的基本配置,讓你進一步瞭解如何在 Linux 中玩轉 VXLAN。下一篇文章將會經過實戰來講明如何搭建基於 VXLAN 的 Overlay 網絡,順便展開解讀上文提到的多播和外部控制中心的工做原理。

6. 參考資料

微信公衆號

掃一掃下面的二維碼關注微信公衆號,在公衆號中回覆◉加羣◉便可加入咱們的雲原生交流羣,和孫宏亮、張館長、陽明等大佬一塊兒探討雲原生技術

相關文章
相關標籤/搜索