由於想做Opensync,所以決定由基本的核心開始研讀,這核心就是Open vSwitch (簡寫為OVS)。
如果說硬體的Ethernet Switch大家都懂,OVS就是軟體的交換器(switch),所以所有硬體交換器的功能,OVS都有支援。
那有甚麼好處? 那就是說Switch功能可以不斷更新。因為硬體買了就買了,如果有新的功能出來,就只能丟掉,買新的硬體。但是軟體Switch只要更新軟體,便有新功能了。
此外目前在雲端的環境之中,VM的使用是常見的,雖然作業系統早就可以虛擬化了,但是實體網路介面還是有許多介面,因此OVS也可以輕易地提供許多有彈性地應用。下面這張由Wiki抄過來的圖,可以極大化的說明OVS的功能。
但雖然OVS是設計給分散式網路使用,但是更多的應用是利用OVS來在一個機器上建立一堆虛擬機器,然後便可以透過OVS這虛擬的交換器,用標準的網路協定來進行溝通。
下面列一下OVS的功能:
- 使用通用路由封裝(GRE: Generic Routing Encapsulation)協定,在虛擬機之中的端口之間,建立通道,支援NetFlow、sFlow、IP流信息導出(IPFIX: IP Flow Information Export)、交換端口分析器(SPAN: Switched Port Analyzer )、遠程交換端口分析器(RSPAN: Remote Switched Port Analyzer )等功能。
- 支援LACP( Link Aggregation Control Protocol, IEEE 802.1AX -2008):就是Switch可以把兩個Ethernet Port與電腦的兩片網卡,分別連接起來,當成一條Ethernet來使用。
- 支援802.1q VLAN網路,同時支援穿透功能(Trucking)。
- 支持IGMP 1、2和3,進行multicast snooping。
- 支援 Shortest Path Bridging Media Access Control (SPBM)及Link Layer Discovery Protocol (LLDP)的相關基本支援。
- 支持Bidirectional Forwarding Detection (BFD)和802.1ag Link監視。
- 支持Spanning Tree Protocol(STP, IEEE 802.1D -1998) 和 Rapid Spanning Tree Protocol (RSTP,IEEE 802.1D-2004)。
- 針對不同應用程序、使用者或數據流的QoS Control。
- 支援分層公平服務曲線(HFSC: hierarchical fair-service curve)的排隊規則(qdisc )
- 虛擬機接口上提供流量監管(Traffic policing)。
- 網卡(NIC)的綁定,通過MAC地址、活動備份和Layer 4 Hash進行負載平衡。Layer 4 Hash也許有些同事沒有聽說過,基本上負載平衡是用兩條網路一起送封包,來加快速度。但是如何決定哪個封包走哪條路? 就有下面的方法:
上圖當中,利用網路封包之中的 Ethernet Header + IP + L4 (Port #)來做出Hash Key,Switch便用Hash結果來決定封包要走哪一條網路介面。
- 支援OpenFlow通信協議,包括各種與虛擬化相關的擴充。
- 支援IPv6。
- 支持多種隧道協議,包括GRE、虛擬可擴展LAN (VXLAN)、無狀態傳輸隧道(STT)和Geneve,並額外支持IPsec上的分層
- 遠程配置協議,具有針對C和Python編程語言的現有綁定
- 數據包轉發引擎在內核空間或用戶空間中的實現,通過在不離開內核空間的情況下處理大多數轉發數據包以及使用多線程內核空間和用戶空間組件,提供了更大的靈活性並提供了性能改進。
- 具有流緩存引擎的多表轉發管道
- 轉發層抽象化界面(Forwarding layer abstraction),使其更容易將Open vSwitch移植到新的軟件和硬件平台。
下面是 OVS 的系統架構圖,接下來會逐一說明圖中各模組的功能。在此架構圖中,我們看到三個主要的橘色的方塊,這是主要的三個元件: Datapath、vswitchd、ovsdb。分別說明如下:
- Vswitchd: 這是一隻Linux daemon (常駐程式),他是OVS的主要模組,用以實現交換器的功能。由這架構可以了解,想要好好執行OVS,必須要有比較強力的CPU。
- Datapath:這是一個以Driver方式存在的Linux Kernel模組,主要用以接收來自網卡的封包。這是因為Switch原先的在網路協定堆疊之中,層次比較低。所以如果要拿出來處理,需要放一個Kernel Module到網卡的上層,才方便將封包送到User Space中的ovs-vswitchd 來處理。上圖中有一個有趣詞 promiscuous mode,大家也許沒有聽過,他中文可以直譯為”混雜模式”。這是指一台電腦的網卡接收所有經過它的封包,而不論其目的地址是否是本機。一般而言,網卡都工作在非混雜模式下,此時網卡只接受來自網路卡的目的地址指向自己的封包。當網卡工作在混雜模式下時,網卡將來自Etehrnet網路中的所有封包,全部接收下來,並交給上面的Datapath Module。有一個著名的封包分析程式 sniffer,就是典型使用”混雜模式”來工作的程式。
- Ovsdb: 這是一個Local Database,用以搭配 vswitchd,提供資料的暫存與設定。Ovsdb 也提供許多擴充的功能,可以存放系統的資料。
下面依照圖中數字,說明一下資料流程:
(1) 網路卡在混雜模式下,讀取所有來自Etehrnet的封包,送給 Datapath Module。
(2) Datapath Module檢查封包,將需要處理的封包送交 vswicthd deamon處理。
(3) OpenFlow 是數據鏈路層協定(Data Link Layer Protocol),主要控制Switch或Router的轉發原則(forwarding plane),藉此設定網路封包所走的網路路徑。OVS做為一個軟體Switch,vswitchd 同樣支援OpenFlow Protocol,用來設定路由。
(4) 發現需要處理的封包,vswitchd 會更新Flow table。
(5) 如果封包不需要處理,vswitchd 通知 Datapath。
(6) 考慮到如果每一次封包的傳導都要詢問一次 OpenFlow 將導致網路的延遲與沒有效率,已經得知的規則將記錄在 flow table 中,供之後的封包使用。Flow Table每次更新都會通知 Datapath Module。
(7) Datapath 可以根據更新的 flow table來傳導封包。
其他還有一些ovs的管理介面,有以下幾隻程式:
− ovs-dpctl: 用來配置 Datapath (OVS Kernel 模組)。
− ovs-ofctl: 查詢和控制 OpenFlow 的規則 (policy)。
− ovsdb-tool: ovsdb 的設定工具。
− ovs-vsctl: 查詢和更新 vswitchd 的配置。
上圖之中,還有一個方塊是sFlow,這是一個網路常常使用的流量分析工具,通常在L2 Switch上面會有SFlow Agent,就可以讓sFlow collectors 讀取資料,然後來做一些分析。OVS上面也有支援 sFlow agent的功能。詳細資料可以參考一下的連結:
https://docs.openvswitch.org/en/latest/howto/sflow/



沒有留言:
張貼留言