許逸飛
(中國電信系統集成公司 北京 100035)
在近年來飛速發展的數據中心技術中,虛擬化技術是一種底層的重要支撐技術。通過虛擬化,系統資源可以得到隔離,并且能夠彈性和動態分配。然而,很多年來虛擬化技術的熱點一直都在于計算機虛擬化,直到這兩年數據中心規模急劇增大,多租戶的問題更加嚴重,網絡虛擬化才得到足夠的重視。
傳統TCP/IP網絡經過30多年的發展已經過度僵化。同時,TCP/IP網絡也無法提供很好的資源劃分方法,這在當前的數據中心應用中都是十分嚴重的缺陷。【1】為了應對TCP/IP網絡的挑戰,學術界與工業界紛紛推出自己的標準來構建一種具備彈性、可操作的新型網絡,如可編程ASIC技術【2】,juniper公司提出的QFabric架構【3】等。
OpenFlow網絡是一種對于傳統TCP/IP網絡的升級與補充,是一種重要的SDN(軟件定義網絡)的解決方案【4】。它的基本思想是將網絡的控制平面與數據平面互相分離,來實現集中的轉發規則與網絡拓撲的控制。
由于該特性,OpenFlow被廣泛用于網絡虛擬化技術。然而,目前的OpenFlow虛擬化網絡仍然面臨很多問題。如同計算機虛擬化一樣,網絡虛擬化應當具備伸縮性、彈性地分配資源的能力,實現這種能力,一個必備的機制是遷移機制。本文接下來的部分就會介紹通過修改一種主流的OpenFlow虛擬化層模塊FlowVisor【5】來實現一種虛擬網絡的遷移機制。
OpenFlow在2008年由斯坦福大學的clean slate項目組提出,是當今主流的SDN解決方案。傳統的TCP/IP網絡將進入交換設備的包在交換設備上確定轉發規則。而OpenFlow由一個控制器決定轉發規則,所有交換設備都連接到這個控制器上,并且部署控制器所確定的轉發規則。
OpenFlow網絡將進入交換設備的包的所有的包頭進行通配。滿足一系列特定要求的包為一個流,區別一個流可以通過一到四層網絡的任何包頭項,即:mac地址、IP地址、TCP端口號等。對于一個流,控制器可以在交換設備上部署一條規則來決定它的轉發規則。此規則包含三部分:通配規則、轉發規則和統計數據。【6】
FlowVisor是一種OpenFlow網絡中的網絡虛擬化層實現。在IaaS云平臺中,不同租戶的隔離與資源分配問題一直是一個重要課題。租戶之間需要劃分的資源不僅僅是計算和存儲資源,也包括網絡資源。通過FlowVisor,一個完整的OpenFlow網絡可以劃分成多個邏輯網絡,每一個邏輯網絡被稱為一個分片(slice)。
FlowVisor對OpenFlow網絡進行分片的主要資源包括:帶寬,拓撲,流表項的個數,設備CPU。目前在系統中主要體現的是流表項個數和帶寬。
對分片的區別是用流空間的概念來實現的,每一個流空間是一系列統配規則。與流表項不同的是它并沒有轉發規則。
對于進入交換設備的數據包,FlowVisor首先要將其攔截并且確定它屬于哪一個分片。每一個分片都有其可見范圍和權限,這需要交換設備對每個分片內的包進行改寫。比如,一個分片內進行廣播的包,離開交換設備時需要將廣播域從整個網絡改為該分片。
正如虛擬機的遷移,虛擬網絡分片的遷移其本質是在透明與平滑的過程中,將在一定的物理設備上運行的系統遷移到新的設備上運行。在虛擬機的遷移過程中,我們需要遷移的包括CPU、虛擬內存、虛擬網卡等等資源【7】,與此類似,在進行更深入的研究之前,首先要明確需要遷移的資源包括哪些。
如前所述,FlowVisor對一個網絡的如下幾種資源進行了劃分:①帶寬。②最大流表項個數。③拓撲結構。④設備CPU占有率。
其中,帶寬和最大流表項個數是通過一個叫做sliceLimits的數據結構規定的,拓撲結構是自然的,設備CPU的限制在當前版本中體現得并不明顯。
我們的目標就是將一個虛擬網絡分片在不修改其流量帶寬和最大流表項個數的情況下,從原本的物理拓撲遷移到新的物理拓撲上。
另外,我們的遷移機制必須滿足一些要求,包括:①遷移對每個網絡分片的管理員必須是透明的。②遷移過程必須是安全的,保證遷移前后拓撲結構和物理帶寬相同。③必須判斷哪些節點是可遷移的,哪些節點是不可遷移的。
對于第一個要求,我們通過擴展FlowVisor的API來實現。只有FlowVisor管理員有權限進行遷移。遷移過程中,需要重寫流空間,而不要求修改每個網絡分片上運行的網絡操作系統(NOX,floodlight等)的轉發規則。
對于第二個和第三個要求,自動選擇一個合法的網絡分片進行遷移需要非常復雜的算法。當前我們采用比較簡單的手工指定的方法,如果選擇的新的分片無法滿足要求則拋出異常。
FlowVisor是一個事件驅動的系統,它對交換機和控制器之間的消息進行攔截和處理,分為兩個模塊,FVSlicer負責對進出控制器的消息進行處理,FVClassifier對進出交換設備的消息進行處理。他們的目的是讓一個對用戶來說全局可見的消息最終精確改寫并發送到特定的分片交換機二元組上。
FVClassifier和FVSlicer都實現了兩個函數,handleIOEvent和sendMsg。handleIOEvent是每次收到一條消息時觸發,在進行改寫之前,由它來確定如何改寫,往往是調用調用classifyFromSwitch和sliceFromController兩個函數進行改寫,返回后調用sendMsg發送到交換設備或控制器上。FlowVisor對事件的處理流程如下:

圖1 FlowVisor控制器與交換設備的事件處理邏輯
我們通過修改FlowVisor的代碼來擴展出虛擬分片的遷移規則。需要實現兩個功能:
1、把一個slice上的所有已經部署的規則遷移到另一個slice上。
2、保證新的分片可以與控制器交互,也就是說,控制器對自己原有拓撲結構的所有操作,都會被透明地重新定向到新的分片上。
由以上,虛擬分片遷移主要經過如下步驟:
1、新建一個分片,資源分配與之前的分片相同。
2、將新建的分片與原有分片各個交換設備一一匹配(也包括端口號和flow space的匹配),建立三個哈希表,key和value分別是源分片的所有交換設備和與之對應的新分片的資源。這一步驟主要是為之后復制流表項和鏈接提供條件。
3、將原有分片上所有的流表項復制到新分片上。在這里,需要實現一個通過FVClassifier和FVSlicer來獲取一個交換機上屬于一個分片的所有流表項的函數,我們在FVClassifier中實現,它返回一個FVFlowStatisticsReply列表,表示所有的流表項。在將源分片的流表項復制到新分片的過程中,需要檢查所有匹配規則和操作所對應的資源是否需要用映射中的目的資源來取代。比如,在源分片中存在流表項:
在目的分片中要修改成:
其中,IPAddr_1和IPAddr_2是源分片與目的分片中對應的兩個IP地址。
4、需要在虛擬化層將底層新分片的交換設備對上層暴露的信息修改為源分片的信息,并且對控制器發送到源分片的信息進行IP地址和端口的改寫使他們對應到新分片的對應物理資源上。如之前的分析,在每一個message從源發送到目的地的過程中首先會被FVClassifier或FVSlicer攔截,并且調用handleIOEvent來確定是否需要進行改寫與如何改寫。所以,在我們的系統中,借鑒這種方法,在handleIOEvent中加入一個功能,判斷是否需要對目的地進行改寫。為了實現這個目的,設計了如下機制:
(1)在遷移完成后,不刪除源分片,而是刪除上面所有的流表項和流空間,并且在FVSlicer這一數據結構內加入一個字段,叫做isZombie。如果一個分片被遷移,則它所對應的所有FVSlicer將isZombie設置為true。另外加入一個字段redirection,指向在遷移過程中與其對應的新的FVSlicer。此外,我們還需要建立在該FVSlicer和遷移后的FVSlicer中的具體端口和兩個分片的對應關系。如之前所述建立三個哈希表,將規則按照哈希表中的對應關系復制到新的FVSlicer中。需要指出的是,這是一種暫行的低效方法,未來需要有一種徹底的改寫方式,而非僅僅依靠這種偽裝方法。
(2)在FVSlicer的handleIOEvent中加入代碼判斷它是否為zombie slicer,如果是,則需要調用其redirection的handleIOEvent。在調用之前對該信息進行改寫,改寫邏輯與之前的復制邏輯相同。改寫結束后調用其redirection的handleIOEvent。
(3)與FVSlicer類似,在FVClassifier中也設置一個isRedirectable字段,與FVSlicer中的isZombie對應。收到控制器發送的消息時處理過程與FVSlicer互逆,不再贅述。
為了驗證這套機制是否有效,本文設計了如下實驗:
首先,建立了一個簡單的OpenFlow網絡,其拓撲結構如下:

圖2 虛擬網絡分片遷移實驗拓撲
拓撲結構如上圖的網絡中,定義兩個分片,slice1包括S1,S2,S3,S6,slice2包括S1,S4,S5,S6。首先,S1向S6發送一個無終止的ping命令,我們在S1中預設一個流,并且關閉S4與S1的連接,保證ICMP包的鏈路路徑為:S1-S2-S3-S6,遷移后為S1-S4-S5-S6。在實驗過程中,我們用S1發送ping命令到S6,然后發送遷移指令,節點的對應關系為(S2,S4)和(S3,S5)。在S1上運行tcpdump,觀察遷移前后ICMP包的轉發路徑。此外,為了驗證新的規則能否正確部署到遷移后的分片上,在控制器端給S6增加一條規則,丟棄所有的源地址為S1的IP地址的包,驗證ping的ICMP流量是否停止。結果證明我們設計的遷移機制沒有停機時間,并且所有遷移都成功進行。并且新增丟棄原地址為S1的包的命令后,發現ping命令的流量停止。
通過上述方法,本文成功實現了OpenFlow網絡中基于FlowVisor網絡虛擬化層的虛擬網絡分片遷移。
在成文過程中,對于遷移后的廢棄分片,本文采用了對其進行標示并且進行重定向的方法,這是一種不完全并且相對低效的方法,在接下來的工作中,可以通過修改FlowVisor底層代碼實現對交換設備端口虛擬化的方式,來實現一種根本的重定向機制。
此外,由于缺少實際物理環境,本文的測試都在虛擬環境中完成,希望在未來的相關工作中能夠在生產環境下部署該應用并且測試結果。
在虛擬化數據中心中,網絡的劃分問題一直是一個十分關鍵的核心問題。SDN技術能夠給虛擬化數據中心網絡架構的部署提供彈性,對每一個用戶提供可自定義的安全可控的網絡。但是目前的數據中心中網絡架構一旦確定很難動態更改。如同虛擬機的動態遷移一樣,虛擬網絡的動態遷移可以帶來一系列好處,包括:物理資源升級無宕機時間、收到攻擊時保證業務連續性、新用戶加入時可以動態擴容等。本文中所討論的虛擬網絡遷移技術,在未來的數據中心組網中可以提供一種更加動態、安全的思路。
[1]Rodrigues H,Santos J R,Turner Y,et al.Gatekeeper: Supporting bandwidth guarantees for multi-tenant datacenter networks[J].USENIX WIOV,2011.
[2]Watkins D.Programmable ASIC: U.S.Patent 6,588,006[P].2003-7-1.
[3]Poellabauer C.Q-fabric: system support for continuous online quality management[J].2004.
[4]McKeown N,Anderson T,Balakrishnan H,et al.OpenFlow:enabling innovation in campus networks[J].ACM SIGCOMM Computer Communication Review,2008,38(2): 69-74.
[5]Sherwood R,Gibb G,Yap K K,et al.FlowVisor: A network virtualization layer[J].OpenFlow Switch Consortium,Tech.Rep,2009.
[6]OpenFlow Switch Consortium.OpenFlow Switch Specification Version 1.3.0[J].2012.
[7]Clark C,Fraser K,Hand S,et al.Live migration of virtual machines[C]//Proceedings of the 2nd conference on Symposium on Networked Systems Design & Implementation-Volume 2.USENIX Association,2005: 273-286.