OVS架構解析


轉載自:https://www.cnblogs.com/liuhongru/p/11006079.html

一:架構說明

(一)整體架構

OVS(openvswitch)是開源的虛擬交換機。也是當前市場上雲環境中部署份額最大的交換機。支持 openflow協議,ovsdb協議管理。

一個OVS實例包括,ovsdb-server、ovs-vswitchd、datapath快轉模塊(linux內核中實現,可選的。dpdk模式是在用戶態實現快轉,並不需要內核態的datapath模塊)

ovsdb-server:  作用是對ovsdb操作。
ovs-vswitchd:  核心模塊,作用是實現OpenFlow交換機、和controller通信、和db通信、實現用戶態轉發、和內核態快轉路徑通信。
datapath:     在內核空間實現報文快速轉發。

 

上圖從整體架構說明了ovs的工作方式。ovs包括ovsdb配置管理方式和openflow流表轉發控制方式。

ovsdb配置管理方式:
  管理者通過OVSDB管理協議管理OVS交換機。
  OVSDB管理協議的規范文件是RFC 7047(The Open vSwitch Database Management Protocol)。
  RFC7047主要包括,定義OVSDB的結構、交互協議(JSON-RPC)、DB的操作類型。 openflow流表控制方式:
  controller控制器通過OpenFlow協議給OVS交換機下發流表,控制交換機的轉發行為。
  controller不通過OVSDB,而是直接向OVS交換機下發流表。

(二)核心組件及其關聯

ovsdb-server和ovs-vswitchd之間是通過socket交互信息。

ovs-vswitchd通過netlink和內核態快轉模塊通信。

比如通過ovs-vsctl命令增加ovs交換機接口,ovs-vsctl會通過ovsdb-server向ovsdb更新數據,ovs-vswitchd監測到ovsdb變化時,會更新交換機配置,比如添加接口。

dpdk方式的ovs除了不使用內核模塊外,架構和圖中相同。

(三)內部模塊及其關聯關系

二:數據結構抽象關系

(一)分層抽象

ofproto  class

openflow交換機實現類,用來實現一個openflow交換機。主要包括創建、構造、操作openflowflow等相關方法。

dpif  class

datapath接口類,用來和datapath交互。主要包括datapath的open、run、端口操作、端口數據監聽等相關方法。datapath是數據面的一種抽象。

netdev  class

網絡設備抽象類,用來和網絡設備交互。主要包括網卡的設置、網卡結構的抽象、數據包發送接收等相關方法。

流程說明

bridge網橋通過ofproto  class構造一個openflow交換機。

再通過dpif  class打開(如果沒有對應類型的datapath,就創建一個)對應類型的datapath通路。

使用netdev  class構造一個抽象網絡設備,上層抽象為端口,然后對網絡設備收發包等操作。

(二)主要的數據結構關系

注:A  B,表示A是一個變量而非指針,它的結構和內容是B。

流程解釋如下:

1) bridge層

1.1    struct  bridge對應每個ovs網橋最上層的結構。它通過成員指針變量ofproto,聯系到struct  ofproto交換機結構內容。

2) ofproto層

2.1   由於聯系到的struct ofproto內容是struct ofproto_dpif結構的一個up成員變量。所以通過struct ofproto地址可以cast到struct ofproto_dpif結構內容,通過該內容和dpif層交互。
2.2   通過struct ofproto_dpif的成員指針變量dpif_backer,聯系到struct  dpif_backer結構內容。該結構是dpif操作的入口點。

3) dpif層

3.1   通過struct  dpif_backer的成員指針變量dpif,聯系到structdpif結構內容。 
3.2  由於struct dpif結構內容是struct  dpif_netdev結構的dpif成員變量,所以通過structdpif地址可以cast到struct dpif_netdev結構內容。
3.3   struct dpif_netdev結構內容中有指針成員變量dp,通過dp可以聯系到struct  dp_netdev結構內容。該內容是datapath的抽象結構內容。

4) datapath層

4.1  struct  dp_netdev的成員指針變量ports是一個表結構,它聯系着多個port端口內容。端口的結構是struct  dp_netdev_port。struct  dp_netdev另外一個成員指針變量netdev,聯系着dp層的struct  netdev結構內容,該結構內容是網卡的邏輯抽象。
4.2  struct  dp_netdev_port的指針成員變量rxqs也是一個表結構,它聯系着多個隊列內容。隊列的結構是struct  dp_netdev_rxq.它的成員變量core_id表示該隊列所在的core。
4.3   通過struct dp_netdev_rxq的成員指針變量rxq,聯系到dp層的struct  netdev_rxq結構內容。structdp_netdev_rxq的成員變量queue_id表示該隊列id。

5) netdev層

5.1   由於struct  netdev結構內容是struct  netdev_dpdk結構的一個up成員變量。所以通過struct  netdev地址可以cast到struct  netdev_dpdk結構內容。
5.2    通過struct  detdev_dpdk結構內容的成員指針變量netdev_class和dpdk類型網卡交互。
5.3   由於struct netdev_rxq結構內容是struct netdev_rxq_dpdk結構內容的一個up成員變量。所以通過struct netdev_rxq地址可以cast到struct netdev_rxq_dpdk結構內容。該內容是dpdk類型的netdev_rxq,它的成員變量port_id是dpdk網絡設備的port。

三: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 重新發起選路,查詢內核流表,匹配;報文轉發,結束。

五:更多詳細內容看原文 

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM