一文搞懂網絡虛擬化

本文首發於我的公衆號 cloud_dev,專注於乾貨分享,號內有大量書籍和視頻資源,後臺回覆「1024」即可領取,歡迎大家關注,二維碼文末可以掃。

網絡虛擬化相對計算、存儲虛擬化來說是比較抽象的,以我們在學校書本上學的那點網絡知識來理解網絡虛擬化可能是不夠的。

在我們的印象中,網絡就是由各種網絡設備(如交換機、路由器)相連組成的一個網狀結構,世界上的任何兩個人都可以通過網絡建立起連接。

帶着這樣一種思路去理解網絡虛擬化可能會感覺雲裏霧裏——這樣一個龐大的網絡如何實現虛擬化?

其實,網絡虛擬化更多關注的是數據中心網絡、主機網絡這樣比較「細粒度」的網絡,所謂細粒度,是相對來說的,是深入到某一臺物理主機之上的網絡結構來談的。

如果把傳統的網絡看作「宏觀網絡」的話,那網絡虛擬化關注的就是「微觀網絡」。網絡虛擬化的目的,是要節省物理主機的網卡設備資源。從資源這個角度去理解,可能會比較好理解一點。

傳統網絡架構

在傳統網絡環境中,一臺物理主機包含一個或多個網卡(NIC),要實現與其他物理主機之間的通信,需要通過自身的 NIC 連接到外部的網絡設施,如交換機上,如下圖所示。

這種架構下,爲了對應用進行隔離,往往是將一個應用部署在一臺物理設備上,這樣會存在兩個問題,1)是某些應用大部分情況可能處於空閒狀態,2)是當應用增多的時候,只能通過增加物理設備來解決擴展性問題。不管怎麼樣,這種架構都會對物理資源造成極大的浪費。

虛擬化網絡架構

爲了解決這個問題,可以藉助虛擬化技術對一臺物理資源進行抽象,將一張物理網卡虛擬成多張虛擬網卡(vNIC),通過虛擬機來隔離不同的應用。

這樣對於上面的問題 1),可以利用虛擬化層 Hypervisor 的調度技術,將資源從空閒的應用上調度到繁忙的應用上,達到資源的合理利用;針對問題 2),可以根據物理設備的資源使用情況進行橫向擴容,除非設備資源已經用盡,否則沒有必要新增設備。這種架構如下所示。

其中虛擬機與虛擬機之間的通信,由虛擬交換機完成,虛擬網卡和虛擬交換機之間的鏈路也是虛擬的鏈路,整個主機內部構成了一個虛擬的網絡,如果虛擬機之間涉及到三層的網絡包轉發,則又由另外一個角色——虛擬路由器來完成。

一般,這一整套虛擬網絡的模塊都可以獨立出去,由第三方來完成,如其中比較出名的一個解決方案就是 Open vSwitch(OVS)。

OVS 的優勢在於它基於 SDN 的設計原則,方便虛擬機集羣的控制與管理,另外就是它分佈式的特性,可以「透明」地實現跨主機之間的虛擬機通信,如下是跨主機啓用 OVS 通信的圖示。

總結下來,網絡虛擬化主要解決的是虛擬機構成的網絡通信問題,完成的是各種網絡設備的虛擬化,如網卡、交換設備、路由設備等。

Linux 下網絡設備虛擬化的幾種形式

爲了完成虛擬機在同主機和跨主機之間的通信,需要藉助某種“橋樑”來完成用戶態到內核態(Guest 到 Host)的數據傳輸,這種橋樑的角色就是由虛擬的網絡設備來完成,上面介紹了一個第三方的開源方案——OVS,它其實是一個融合了各種虛擬網絡設備的集大成者,是一個產品級的解決方案。

但 Linux 本身由於虛擬化技術的演進,也集成了一些虛擬網絡設備的解決方案,主要有以下幾種:

(1)TAP/TUN/VETH

TAP/TUN 是 Linux 內核實現的一對虛擬網絡設備,TAP 工作在二層,TUN 工作在三層。Linux 內核通過 TAP/TUN 設備向綁定該設備的用戶空間程序發送數據,反之,用戶空間程序也可以像操作物理網絡設備那樣,向 TAP/TUN 設備發送數據。

基於 TAP 驅動,即可實現虛擬機 vNIC 的功能,虛擬機的每個 vNIC 都與一個 TAP 設備相連,vNIC 之於 TAP 就如同 NIC 之於 eth。

當一個 TAP 設備被創建時,在 Linux 設備文件目錄下會生成一個對應的字符設備文件,用戶程序可以像打開一個普通文件一樣對這個文件進行讀寫。

比如,當對這個 TAP 文件執行 write 操作時,相當於 TAP 設備收到了數據,並請求內核接受它,內核收到數據後將根據網絡配置進行後續處理,處理過程類似於普通物理網卡從外界收到數據。當用戶程序執行 read 請求時,相當於向內核查詢 TAP 設備是否有數據要發送,有的話則發送,從而完成 TAP 設備的數據發送。

TUN 則屬於網絡中三層的概念,數據收發過程和 TAP 是類似的,只不過它要指定一段 IPv4 地址或 IPv6 地址,並描述其相關的配置信息,其數據處理過程也是類似於普通物理網卡收到三層 IP 報文數據。

VETH 設備總是成對出現,一端連着內核協議棧,另一端連着另一個設備,一個設備收到內核發送的數據後,會發送到另一個設備上去,這種設備通常用於容器中兩個 namespace 之間的通信。

(2)Bridge

Bridge 也是 Linux 內核實現的一個工作在二層的虛擬網絡設備,但不同於 TAP/TUN 這種單端口的設備,Bridge 實現爲多端口,本質上是一個虛擬交換機,具備和物理交換機類似的功能。

Bridge 可以綁定其他 Linux 網絡設備作爲從設備,並將這些從設備虛擬化爲端口,當一個從設備被綁定到 Bridge 上時,就相當於真實網絡中的交換機端口上插入了一根連有終端的網線。

如下圖所示,Bridge 設備 br0 綁定了實際設備 eth0 和 虛擬設備設備 tap0/tap1,當這些從設備接收到數據時,會發送給 br0 ,br0 會根據 MAC 地址與端口的映射關係進行轉發。

因爲 Bridge 工作在二層,所以綁定到它上面的從設備 eth0、tap0、tap1 均不需要設 IP,但是需要爲 br0 設置 IP,因爲對於上層路由器來說,這些設備位於同一個子網,需要一個統一的 IP 將其加入路由表中。

這裏有人可能會有疑問,Bridge 不是工作在二層嗎,爲什麼會有 IP 的說法?其實 Bridge 雖然工作在二層,但它只是 Linux 網絡設備抽象的一種,能設 IP 也不足爲奇。

對於實際設備 eth0 來說,本來它是有自己的 IP 的,但是綁定到 br0 之後,其 IP 就生效了,就和 br0 共享一個 IP 網段了,在設路由表的時候,就需要將 br0 設爲目標網段的地址。

總結

  1. 傳統網絡架構到虛擬化的網絡架構,可以看作是宏觀網絡到微觀網絡的過渡

  2. TAP/TUN/VETH、Bridge 這些虛擬的網絡設備是 Linux 爲了實現網絡虛擬化而實現的網絡設備模塊,很多的雲開源項目的網絡功能都是基於這些技術做的,比如 Neutron、Docker network 等。

  3. OVS 是一個開源的成熟的產品級分佈式虛擬交換機,基於 SDN 的思想,被大量應用在生產環境中。


我的公衆號 cloud_dev,號內有大量書籍和視頻資源,後臺回覆「1024」即可領取,分享的內容包括但不限於雲計算虛擬化、容器、OpenStack、K8S、霧計算、網絡、工具、SDN、OVS、DPDK、Linux、Go、Python、C/C++編程技術等內容,歡迎大家關注。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章