標籤:雲端運算 openvswitch 虛擬化 linux網路通訊協定棧
雲端運算是現在IT行業比較流行的,但真正什麼是雲端運算業界也沒有個什麼統一的定義(很多公司都是根據自己的利益狹隘的定義雲端運算),更別說什麼標準規範了。所以現在就有很多人說雲端運算只不過是個幌子,是個噓頭,沒點實用的,嘴上說說而已,雖然我也不太清楚什麼叫做雲端運算,雲端運算的定義究竟是什麼,但我根據我公司現在做的雲端運算產品來說,對於雲端運算服務還是懂些的。我覺得那並不是什麼幌子、噓頭,但如果說這雲端運算技術還不太成熟,我倒還勉強認可的。若把雲端運算比作一個人的話,我個人覺得現在它正是二十歲的樣子,到三十多歲就算是比較成熟了,所以大概就能想象的到雲端運算現在的境況了。下面就來簡介下實現雲端運算的一些技術,我對雲端運算並沒有什麼研究,也沒能達到從全域的角度來分析雲端運算技術,更別說從一些更高的位置來分析問題,我所能介紹的僅僅是我一個小程式員在工作中所遇到的一些和雲端運算有關的技術,日積月累,希望終有一天能成為雲端運算“磚家”。
雲端運算是個全世界的話題,所以也有全世界的能人異士來為實現這個雲端運算而奮鬥。我現階段遇到的有關雲端運算的技術就是openVswitch和docker技術。那就先從openVswitch開始介紹起,我會用一系列blog來分析openVswitch的相關資料結構和工作流程,以及各個重要模組的分析。所有的介紹都是基於源碼的分析,希望對初學著有點用。
openVswitch,根據其名就可以知道這是一個開放的虛擬交換器(open virtual switch);它是實現網路虛擬化SDN的基礎,它是在開源的Apache2.0許可下的產品級品質的多層虛擬交換標準。設計這個openVswitch的目的是為瞭解決物理交換器存在的一些局限性:openVswitch較物理交換器而言有著更低的成本和更高的工作效率;一個虛擬交換器可以有幾十個連接埠來串連虛擬機器,而openVswitch本身佔用的資源也非常小;可以根據自己的選擇靈活的配置,可以對資料包進行接收分析處理;同時還支援標準的管理介面和協議,如NetFlow, sFlow, SPAN, RSPAN等。
Open vSwtich模組介紹
當前最新程式碼封裝主要包括以下模組和特性:
ovs-vswitchd 主要模組,實現switch的daemon,包括一個支援流交換的Linux核心模組;
ovsdb-server 輕量級資料庫伺服器,提供ovs-vswitchd擷取配置資訊;
ovs-brcompatd 讓ovs-vswitch替換Linux bridge,包括擷取bridge ioctls的Linux核心模組;
ovs-dpctl 用來配置switch核心模組;
一些Scripts and specs 輔助OVS安裝在Citrix XenServer上,作為預設switch;
ovs-vsctl 查詢和更新ovs-vswitchd的配置;
ovs-appctl 發送命令訊息,運行相關daemon;
ovsdbmonitor GUI工具,可以遠程擷取OVS資料庫和OpenFlow的流表。
ovs-openflowd:一個簡單的OpenFlow交換器;
ovs-controller:一個簡單的OpenFlow控制器;
ovs-ofctl 查詢和控制OpenFlow交換器和控制器;
ovs-pki :OpenFlow交換器建立和管理公開金鑰架構;
ovs-tcpundump:tcpdump的補丁,解析OpenFlow的訊息;
上面是網上提到的一些openVswitch的主要模組。其實openVswitch中最主要的還是datapath目錄下的一些檔案。有連接埠模組vport等,還有關鍵的邏輯處理模組datapath等,以及flow等流表模組,最後的還有action動作響應模組,通道模組等等。
下面來介紹下其工作流程:
一般的資料包在linux網路通訊協定棧中的流向為黑色箭頭流向:從網卡上接受到資料包後層層往上分析,最後離開核心態,把資料傳送到使用者態。當然也有些資料包只是在核心網路通訊協定棧中操作,然後再從某個網卡發出去。
但當其中有openVswitch時,資料包的流向就不一樣了。首先是建立一個橋接器:ovs-vsctl add-br br0;然後是綁定某個網卡:綁定網卡:ovs-vsctl add-port br0 eth0;這裡預設為綁定了eth0網卡。資料包的流向是從網卡eth0上然後到openVswitch的連接埠vport上進入openVswitch中,然後根據key值進行流表的匹配。如果匹配成功,則根據流表中對應的action找到其對應的操作方法,完成相應的動作(這個動作有可能是把一個請求變成應答,也有可能是直接丟棄,也可以自己設計自己的action);如果匹配不成功,則執行預設的動作,有可能是放回核心網路通訊協定棧中去處理(在建立橋接器時就會相應的建立一個連接埠串連核心協議棧的)。
其大概工作流程就是這樣了,在工作中一般在這幾個地方來修改核心代碼以達到自己的目的:第一個是在datapath.c中的ovs_dp_process_received_packet(struct vport *p, struct sk_buff *skb)函數內添加相應的代碼來達到自己的目的,因為對於每個資料包來說這個函數都是必經之地;第二個就是自己去設計自己的流表了;第三個和第二個是相關聯的,就是根據流表來設計自己的action,完成自己想要的功能。
若有不正確之處,望指正!謝謝!!
OpenVswitch(OVS)原始碼分析之簡介