和實體網絡一樣,虛拟網絡要通信,必須借助一些交換裝置來轉發資料。是以,對于網絡虛拟化來說,交換裝置的虛拟化是很關鍵的一環。
借助 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 已經能夠很好地充當交換裝置的角色了。
但是為什麼還有很多廠商都在做自己的虛拟交換機,比如比較流行的有 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 的其他元件。
對雲計算感興趣的小夥伴可以關注我的微信公衆号:aCloudDeveloper,專注雲計算領域,堅持分享幹貨。