除了前面討論的 local, flat, vlan 這幾類網絡,OpenStack 還支持 vxlan 和 gre 這兩種 overlay network。
overlay network 是指建立在其他網絡上的網絡。 該網絡中的節點可以看作通過虛擬(或邏輯)鏈路連接起來的。
overlay network 在底層可能由若干物理鏈路組成,但對於節點,不需要關心這些底層實現。
例如 P2P 網絡就是 overlay network,隧道也是。 vxlan 和 gre 都是基於隧道技術實現的,它們也都是 overlay network。
目前 linux bridge 只支持 vxlan,不支持 gre;open vswitch 兩者都支持。 vxlan 與 gre 實現非常類似,而且 vxlan 用得較多,所以本教程只介紹 vxlan。
VXLAN 全稱 Virtual eXtensible Local Area Network。
正如名字所描述的,VXLAN 提供與 VLAN 相同的以太網二層服務,但是擁有更強的擴展性和靈活性。與 VLAN 相比,VXLAN 有下面幾個優勢:
-
支持更多的二層網段。 VLAN 使用 12-bit 標記 VLAN ID,最多支持 4094 個 VLAN,這對於大型雲部署會成為瓶頸。
VXLAN 的 ID (VNI 或者 VNID)則用 24-bit 標記,支持 16777216 個二層網段。 -
能更好地利用已有的網絡路徑。 VLAN 使用 Spanning Tree Protocol 避免環路,這會導致有一半的網絡路徑被 block 掉。
VXLAN 的數據包是封裝到 UDP 通過三層傳輸和轉發的,可以使用所有的路徑。 -
避免物理交換機 MAC 表耗盡。 由於采用隧道機制,TOR (Top on Rack) 交換機無需在 MAC 表中記錄虛擬機的信息。
VXLAN 封裝和包格式
VXLAN 是將二層建立在三層上的網絡。 通過將二層數據封裝到 UDP 的方式來擴展數據中心的二層網段數量。
VXLAN 是一種在現有物理網絡設施中支持大規模多租戶網絡環境的解決方案。 VXLAN 的傳輸協議是 IP + UDP。
VXLAN 定義了一個 MAC-in-UDP 的封裝格式。 在原始的 Layer 2 網絡包前加上 VXLAN header,然后放到 UDP 和 IP 包中。
通過 MAC-in-UDP 封裝,VXLAN 能夠在 Layer 3 網絡上建立起了一條 Layer 2 的隧道。
VXLAN 包的格式如下:
如上圖所示,VXLAN 引入了 8-byte VXLAN header,其中 VNI 占 24-bit。 VXLAN 和原始的 L2 frame 被封裝到 UDP 包中。
這 24-bit 的 VNI 用於標示不同的二層網段,能夠支持 16777216 個 LAN。
VXLAN Tunnel Endpoint
VXLAN 使用 VXLAN tunnel endpoint (VTEP) 設備處理 VXLAN 的封裝和解封。 每個 VTEP 有一個 IP interface,配置了一個 IP 地址。
VTEP 使用該 IP 封裝 Layer 2 frame,並通過該 IP interface 傳輸和接收封裝后的 VXLAN 數據包。
下面是 VTEP 的示意圖:
VXLAN 獨立於底層的網絡拓撲; 反過來,兩個 VTEP 之間的底層 IP 網絡也獨立於 VXLAN。
VXLAN 數據包是根據外層的 IP header 路由的,該 header 將兩端的 VTEP IP 作為源和目標 IP。
下節我們通過例子進一步理解 VXLAN 封裝和轉發包的過程,並探討 Linux 對 VXLAN 的支持。