從 Bridge 到 OVS,深度探索虛擬交換機

Linux Bridge

和物理網絡一樣,虛擬網絡要通信,必須藉助一些交換設備來轉發數據。因此,對於網絡虛擬化來說,交換設備的虛擬化是很關鍵的一環。

上文網絡虛擬化已經大致介紹了 Linux 內核爲了滿足網絡虛擬化的要求,實現了一套虛擬交換設備——Bridge。本文重點介紹下 Bridge 的加強版——Open vSwitch(OVS),並從 Bridge 過渡到 OVS 的緣由講起,讓大家有個全面的認識。

藉助 Linux Bridge 功能,同主機或跨主機的虛擬機之間能夠輕鬆實現通信,也能夠讓虛擬機訪問到外網,這就是我們所熟知的橋接模式,一般在裝 VMware 虛擬機或者 VirtualBox 虛擬機的時候,都會提示我們要選擇哪種模式,常用的兩種模式是橋接和 NAT。

NAT 也很好理解,可以簡單理解爲當虛擬機啓用了 NAT 模式之後,宿主機便通過 DHCP 爲其生成可以訪問外網的 IP,當 VM 訪問外網的時候,就可以用該 IP 訪問,其實就是宿主機爲其做了地址轉換。更詳細的內容請自行搜索瞭解。

物理交換機有個重要的功能,就是虛擬局域網(VLAN),是對局域網(LAN)的軟件化升級。一般,兩臺計算機通過一臺交換機連接在一起就構成了一個 LAN。

一個 LAN 表示一個廣播域,這意味着這個 LAN 中的任何節點發的數據包,其他節點都能收到,這有兩個問題,一個是容易形成廣播風暴,造成網絡擁塞,另一個是廣播包無法隔離,比如節點 B 不想接收節點 A 的包,但節點 A 強行要發,這就有點說不過去了。

解決這個問題的方案就是 VLAN,VLAN 能夠對廣播包進行有效隔離,它的做法是從軟件上將交換機的端口虛擬出多個子端口,用 tag 來標記,相當於將交換機的端口劃分多個 LAN,同一個 LAN 中的節點發出的數據包打上本 LAN 的 tag,這樣,其他 LAN 中的節點就無法收到包,達到隔離的目的。

Bridge 本身是支持 VLAN 功能的,如下圖所示,通過配置,Bridge 可以將一個物理網卡設備 eth0 劃分成兩個子設備 eth0.10,eth0.20,分別掛到 Bridge 虛擬出的兩個 VLAN 上,VLAN id 分別爲 VLAN 10 和 VLAN 20。同樣,兩個 VM 的虛擬網卡設備 vnet0 和 vnet 1 也分別掛到相應的 VLAN 上。這樣配好的最終效果就是 VM1 不能和 VM2 通信了,達到了隔離。

Linux Bridge + VLAN 便可以構成一個和物理交換機具備相同功能的虛擬交換機了。對於網絡虛擬化來說,Bridge 已經能夠很好地充當交換設備的角色了。

OVS

但是爲什麼還有很多廠商都在做自己的虛擬交換機,比如比較流行的有 VMware virtual switch、Cisco Nexus 1000V,以及 Open vSwitch。究其原因,主要有以下幾點(我們重點關注 OVS):

1)方便網絡管理與監控。OVS 的引入,可以方便管理員對整套雲環境中的網絡狀態和數據流量進行監控,比如可以分析網絡中流淌的數據包是來自哪個 VM、哪個 OS 及哪個用戶,這些都可以藉助 OVS 提供的工具來達到。

2)加速數據包的尋路與轉發。相比 Bridge 單純的基於 MAC 地址學習的轉發規則,OVS 引入流緩存的機制,可以加快數據包的轉發效率。

3)基於 SDN 控制面與數據面分離的思想。上面兩點其實都跟這一點有關,OVS 控制面負責流表的學習與下發,具體的轉發動作則有數據面來完成。可擴展性強。

4)隧道協議支持。Bridge 只支持 VxLAN,OVS 支持 gre/vxlan/IPsec 等。

5)適用於 Xen、KVM、VirtualBox、VMware 等多種 Hypervisors。

......

除此之外,OVS 還有很多高級特性,詳情可以查閱官網自行了解。

下面簡單看下 OVS 的整體架構,如下圖所示,OVS 在 Linux 用戶態和內核態都實現了相應的模塊,用戶態主要組件有數據庫服務 ovsdb-server 和守護進程 ovs-vswitchd。內核態中實現了 datapath 模塊。

其中, ovs-vswitchd 和 datapath 共同構成了 OVS 的數據面,控制面由 controller 模塊來完成,controller 一般表示的是 OpenFlow 控制器,在 OVS 中,它可以藉由第三方來完成,只要支持 OpenFlow 協議即可。

這裏額外提一點,很多的一些產品級的虛擬交換機都是自身集成了控制器,比如 Cisco 1000V 的 Virtual Supervisor Manager(VSM),VMware 的分佈式交換機中的 vCenter,而 OVS 是把這個事交由第三方去做,這麼做的意義還是比較大的,可以讓自己的產品很好地融入到各種解決方案中。

OpenFlow
OpenFlow 是控制面和數據面通信的一套協議,我們常常把支持 OpenFlow 協議的交換機稱爲 OpenFlow 交換機,控制器稱爲 OpenFlow 控制器,業界比較知名的 OpenFlow 控制器有 OpenDaylight、ONOS 等。

OpenFlow 是一個獨立的完整的流表協議,不依賴於 OVS,OVS 只是支持 OpenFlow 協議,有了支持,就可以使用 OpenFlow 控制器來管理 OVS 中的流表。OpenFlow 不僅僅支持虛擬交換機,某些硬件交換機也支持 OpenFlow 協議。

ovs-vswitchd
ovs-vswitchd 是 OVS 的核心組件,它和內核模塊 datapath 共同構成了 OVS 的數據面。它使用 OpenFlow 協議與 OpenFlow 控制器通信,使用 OVSDB 協議與 ovsdb-server 通信,使用 netlink 和 datapath 內核模塊通信。

ovsdb-server
ovsdb-server 是 OVS 輕量級的數據庫服務,用於整個 OVS 的配置信息,包括接口、交換內容、VLAN 等,ovs-vswitchd 根據這些配置信息工作。

OpenFlow 控制器
OpenFlow 控制器可以通過 OpenFlow 協議連接到任何支持 OpenFlow 的交換機,比如 OVS 。控制器通過向交換機下發流表規則來控制數據流向。

Kernel Datapath
datapath 內核模塊和 ovs-vswitchd 是相互協作工作的,datapath 負責具體的收發包,而 ovs-vswitchd 通過 controller 下發的流表規則指導 datapath 如何轉發包。

舉個例子,datapath 從主機物理網卡 NIC 或者 VM 的 虛擬網卡 vNIC 收到包,如果是第一次收到包,datapath 不知道怎麼處理這個包,於是將其丟給 ovs-vswitchd , ovs-vswitchd 決定該如何處理這個包之後又丟給 datapath,datapath 根據 ovs-vswitchd 的指示執行相應的動作,是丟棄還是從哪個口傳出去。同時,ovs-vswitchd 會讓 datapath 緩存好這個包的動作,下次再來就可以直接執行動作。

如果不是第一次收到包,就是按照之前緩存好的動作執行,這樣極大地提高了數據處理的速度。


本文先對 OVS 有個初步印象, OVS 的其他組件詳細介紹以及下載可以進羣973961276獲取

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