本文首發於我的公眾號 Linux雲計算網絡(id: cloud_dev),專注於干貨分享,號內有 10T 書籍和視頻資源,后台回復「1024」即可領取,歡迎大家關注,二維碼文末可以掃。
在前文「從 Bridge 到 OVS」中,我們已經對 OVS 進行了一番探索。本文決定從 OVS 的整體架構到各個組件都進行一個詳細的介紹。
OVS 架構
OVS 是產品級的虛擬交換機,大量應用在生產環境中,支撐整個數據中心虛擬網絡的運轉。OVS 基於 SDN 的思想,將整個核心架構分為控制面和數據面,數據面負責數據的交換工作,控制面實現交換策略,指導數據面工作。
從整體上看,OVS 可以划分為三大塊,管理面、數據面和控制面。
數據面就是以用戶態的 ovs-vswitchd 和內核態的 datapath 為主的轉發模塊,以及與之相關聯的數據庫模塊 ovsdb-server,控制面主要是由 ovs-ofctl 模塊負責,基於 OpenFlow 協議與數據面進行交互。而管理面則是由 OVS 提供的各種工具來負責,這些工具的提供也是為了方便用戶對底層各個模塊的控制管理,提高用戶體驗。下面就對這些工具進行一個逐一的闡述。
ovs-ofctl
:這個是控制面的模塊,但本質上它也是一個管理工具,主要是基於 OpenFlow 協議對 OpenFlow 交換機進行監控和管理,通過它可以顯示一個 OpenFlow 交換機的當前狀態,包括功能、配置和表中的項。使用時,有很多參數,我們可以通過 ovs-ofctl --help 查看。
常用命令:
ovs-ofctl show switch-name :輸出交換機信息,包括其流量表和端口信息。
ovs-ofctl dump-ports switch-name:輸出交換機的端口統計信息,包括收發包、丟包、錯誤包等數量。
ovs-ofctl add-flow switch-name:為交換機配置流策略。
ovs-dpctl
:用來配置交換機的內核模塊 datapath,它可以創建,修改和刪除 datapath,一般,單個機器上的 datapath 有 256 條(0-255)。一條 datapath 對應一個虛擬網絡設備。該工具還可以統計每條 datapath 上的設備通過的流量,打印流的信息等,更過參數通過 ovs-dpctl --help 查看。
常用命令:
ovs-dpctl show :顯示所有 datapath 的基本信息。
ovs-dpctl dump-dps :顯示所有 datapath 的名字。
ovs-dpctl dump-flows DP :顯示一條 datapath DP 上的流信息。
ovs-appctl
:查詢和控制運行中的 OVS 守護進程,包括 ovs-switchd,datapath,OpenFlow 控制器等,兼具 ovs-ofctl、ovs-dpctl 的功能,是一個非常強大的命令。ovs-vswitchd 等進程啟動之后就以一個守護進程的形式運行,為了能夠很好的讓用戶控制這些進程,就有了這個命令。詳細可以 ovs-appctl --help 查看。
ovs-vsctl
:查詢和更新 ovs-vswitchd 的配置,這也是一個很強大的命令,網橋、端口、協議等相關的命令都由它來完成。此外,還負責和 ovsdb-server 相關的數據庫操作。
常用命令:
ovs-vsctl show :顯示主機上已有的網橋及端口信息。
ovs-vsctl add-br br0:添加網橋 br0。
ovsdb-client
:訪問 ovsdb-server 的客戶端程序,通過 ovsdb-server 執行一些數據庫操作。
常用命令:
ovsdb-client dump:用來查看ovsdb內容。
ovsdb-client transact :用來執行一條類 sql。
ovsdb-tool
:和 ovsdb-client 要借助 ovsdb-server 才能進行相關數據庫操作不同,ovsdb-tool 可以直接操作數據庫。
OVS 源碼結構
OVS 源碼結構中,主要包含以下幾個主要的模塊,數據交換邏輯在 vswitchd 和 datapath 中實現,vswitchd 是最核心的模塊,OpenFlow 的相關邏輯都在 vswitchd 中實現,datapath 則不是必須的模塊。ovsdb 用於存儲 vswitch 本身的配置信息,如端口、拓撲、規則等。控制面部分采用的是 OVS 自家實現的 OVN,和其他控制器相比,OVN 對 OVS 和 OpenStack 有更好的兼容性和性能。
從圖中可以看出 OVS 的分層結構,最上層 vswitchd 主要與 ovsdb 通信,做配置下發和更新等,中間層是 ofproto ,用於和 OpenFlow 控制器通信,並基於下層的 ofproto provider 提供的接口,完成具體的設備操作和流表操作等工作。
dpif 層實現對流表的操作。
netdev 層實現了對網絡設備(如 Ethernet)的抽象,基於 netdev provider 接口實現多種不同平台的設備,如 Linux 內核的 system, tap, internal 等,dpdk 系的 vhost, vhost-user 等,以及隧道相關的 gre, vxlan 等。
數據轉發流程
通過一個例子來看看 OVS 中數據包是如何進行轉發的。
1)ovs 的 datapath 接收到從 ovs 連接的某個網絡端口發來的數據包,從數據包中提取源/目的 IP、源/目的 MAC、端口等信息。
2)ovs 在內核態查看流表結構(通過 hash),如果命中,則快速轉發。
3)如果沒有命中,內核態不知道如何處置這個數據包,所以,通過 netlink upcall 機制從內核態通知用戶態,發送給 ovs-vswitchd 組件處理。
4)ovs-vswitchd 查詢用戶態精確流表和模糊流表,如果還不命中,在 SDN 控制器接入的情況下,經過 OpenFlow 協議,通告給控制器,由控制器處理。
5)如果模糊命中, ovs-vswitchd 會同時刷新用戶態精確流表和內核態精確流表,如果精確命中,則只更新內核態流表。
6)刷新后,重新把該數據包注入給內核態 datapath 模塊處理。
7)datapath 重新發起選路,查詢內核流表,匹配;報文轉發,結束。
總結
OVS 為了方便用戶操作,提供了很多管理工具,我們平常在使用過程中只需記住每個工具的作用,具體的命令可以使用 -h 或 --help 查看。
我的公眾號 「Linux雲計算網絡」(id: cloud_dev) ,號內有 10T 書籍和視頻資源,后台回復 「1024」 即可領取,分享的內容包括但不限於 Linux、網絡、雲計算虛擬化、容器Docker、OpenStack、Kubernetes、工具、SDN、OVS、DPDK、Go、Python、C/C++編程技術等內容,歡迎大家關注。