李心舒(南京師范大學(xué),江蘇南京210023)
經(jīng)過幾年的探索,軟件定義網(wǎng)絡(luò)(SDN)已經(jīng)從概念逐步走向?qū)嵱?。特別是近年來由于開源社區(qū)的貢獻(xiàn),SDN 的應(yīng)用得到了迅速發(fā)展。本文將介紹當(dāng)前主要的開源SDN開發(fā)資源,并探討編程實現(xiàn)SDN控制器的思路。
SDN是在服務(wù)器虛擬化和云計算技術(shù)逐步成熟的基礎(chǔ)上提出的,以平臺化思想提供網(wǎng)絡(luò)業(yè)務(wù)的技術(shù)。SDN 采用將網(wǎng)絡(luò)控制邏輯和數(shù)據(jù)轉(zhuǎn)發(fā)功能分離的思路,并保證網(wǎng)絡(luò)控制邏輯的可編程性和開放架構(gòu),實現(xiàn)通過軟件對網(wǎng)絡(luò)業(yè)務(wù)的靈活控制和快速提供。
SDN架構(gòu)包括應(yīng)用層、控制層和基礎(chǔ)設(shè)備層(見圖1)。
SDN 應(yīng)用層提供具體的業(yè)務(wù)功能和操作界面,它通過調(diào)用SDN控制器的北向接口API實現(xiàn)對網(wǎng)絡(luò)設(shè)備的控制。
SDN 控制層的核心是SDN 控制器,它負(fù)責(zé)接收應(yīng)用層的服務(wù)請求,并對各網(wǎng)絡(luò)服務(wù)進(jìn)行處理,然后通過控制器的南向接口向下傳達(dá)給基礎(chǔ)設(shè)備層。同時SDN控制層為應(yīng)用層提供一個關(guān)于物理網(wǎng)絡(luò)的抽象視圖,對應(yīng)用層屏蔽具體的設(shè)備實現(xiàn)細(xì)節(jié)。
基礎(chǔ)設(shè)備層由網(wǎng)絡(luò)中的物理設(shè)備組成,實現(xiàn)控制器下發(fā)的控制命令,完成具體的轉(zhuǎn)發(fā)任務(wù)。
圖1 SDN架構(gòu)
SDN的快速發(fā)展和各個開源社區(qū)有著不可分割的緊密聯(lián)系,而且隨著各類開源社區(qū)的不斷發(fā)展,開源項目也在不斷增多。目前開源控制器資源主要有Open?Daylight、ONOS、Floodlight等。
a)OpenDaylight是Linux基金會的協(xié)作項目,是一個開放的平臺,可以通過網(wǎng)絡(luò)編程實現(xiàn)SDN并為NFV提供一個穩(wěn)固的基礎(chǔ)。
b)ONOS 是由ON.Lab 使用Java 及Apache 實現(xiàn)的主要面向服務(wù)提供商的高可靠性開源架構(gòu)。
c)Floodlight 是由包括來自Big Switch Networks 的工程師實現(xiàn)的Apache 許可、基于Java 語言的企業(yè)級OpenFlow控制器。
其中以設(shè)備提供商為代表的OpenDaylight 和以服務(wù)提供商為首的ONOS 發(fā)展勢頭強勁,成為兩大主流控制器開發(fā)資源,故下文僅對這兩者作一簡單比較。
OpenDaylight架構(gòu)共分為3個層次,分別是網(wǎng)絡(luò)應(yīng)用與業(yè)務(wù)流程(即應(yīng)用層)、控制平臺(即控制層)和物理與虛擬網(wǎng)絡(luò)設(shè)備(即基礎(chǔ)設(shè)備層),其中核心的模塊化、可添加功能插件的平臺直接由自帶的Java 虛擬機實現(xiàn),可以運行在任何操作系統(tǒng)上,實現(xiàn)功能模塊的靈活加載和屏蔽下層協(xié)議的差異性。
ONOS 是由ON.Lab 推出的開放網(wǎng)絡(luò)操作系統(tǒng),它的設(shè)計理念是能夠在任何硬件上靈活地創(chuàng)建服務(wù)并且大規(guī)模部署,同樣提供一個SDN 控制平面(南向和北向API),以及一系列的管理、控制和服務(wù)應(yīng)用程序。
OpenDaylight與ONOS所面向的對象不同,前者由廠商主導(dǎo),后者由運營商主導(dǎo)。而最大的不同在于OpenDaylight增加了服務(wù)抽象層SAL,它負(fù)責(zé)南向連接多種協(xié)議,即除了支持OpenFlow 協(xié)議之外,還能夠處理不同的標(biāo)準(zhǔn)協(xié)議,屏蔽不同協(xié)議之間的差異性,為上層模塊提供一致性服務(wù)。
OpenDaylight 可以使用戶通過在服務(wù)抽象層上編寫運行在不同硬件設(shè)備和南向協(xié)議上的應(yīng)用,方便地進(jìn)行網(wǎng)絡(luò)部署,故下文中主要介紹OpenDaylight 的主要組成和用法。
OpenDaylight 控制器是純軟件并且可以運行在任意操作系統(tǒng)上,它的結(jié)構(gòu)如圖2所示。
圖2 OpenDaylight結(jié)構(gòu)
OpenDaylight控制器平臺中的服務(wù)抽象層SAL,能夠支持多種標(biāo)準(zhǔn)協(xié)議、控制模塊間數(shù)據(jù)交互、數(shù)據(jù)存儲讀取和API 調(diào)用,是控制器平臺中最核心的模塊。在OpenDaylight 控制器的南向平面中可以支持多種協(xié)議,這些協(xié)議作為南向Plugin 動態(tài)連接在抽象服務(wù)層(SAL)中。SAL向上提供服務(wù)而不考慮在控制器和網(wǎng)絡(luò)設(shè)備之間使用的協(xié)議,這在協(xié)議變化的情況下向應(yīng)用提供了有價值的保護(hù)。
控制器為了管理設(shè)備,將設(shè)備的容量、可達(dá)性等信息存儲在拓?fù)浣Y(jié)構(gòu)管理模塊中,其他的組件如ARP處理模塊、交換機管理模塊等幫助生成拓?fù)浣Y(jié)構(gòu)數(shù)據(jù)。
OpenDaylight 控制器提供應(yīng)用可使用的開放的北向API,它支持OSGi 框架和REST,和控制器運行在同一地址空間的應(yīng)用使用OSGi框架。
在進(jìn)行開發(fā)時,根據(jù)分析得到的設(shè)計目標(biāo)進(jìn)行不同層次的開發(fā)。當(dāng)所需要的服務(wù)已由SAL提供而只需要修改數(shù)據(jù)顯示等時,可以直接調(diào)用OpenDayligt REST API進(jìn)行開發(fā),而不關(guān)注底層的功能實現(xiàn)。但當(dāng)現(xiàn)有的OpenDaylight 沒有提供所需要的特定功能時,就要進(jìn)行OpenDaylight 控制器組件的開發(fā),即借助已經(jīng)實現(xiàn)的功能或模塊在服務(wù)抽象層(SAL)上開發(fā)Plu?gin 實現(xiàn)具體的服務(wù)。本章先介紹開發(fā)相關(guān)的基本概念,接著重點介紹開發(fā)的基本步驟。
OpenDaylight 控制器平臺中的核心模塊——服務(wù)抽象層SAL,又分為AD-SAL(API Driven-SAL)和MDSAL(Model Driven-SAL),但因在AD-SAL 中南北向API 是一一映射關(guān)系,同一API 無法被復(fù)用,造成SAL模塊復(fù)雜化,而MD-SAL 可使南北向接口和SDN 控制器中服務(wù)或組件用到的數(shù)據(jù)結(jié)構(gòu)統(tǒng)一,前者逐漸被后者取代。
Plugin 是通過SAL 實現(xiàn)的ODL 控制器的功能模塊,南向Plugin 向SAL 提供管理南向設(shè)備或服務(wù)的操作接口,應(yīng)用可以通過北向API 查詢需要使用的南向Plugin并和網(wǎng)絡(luò)設(shè)備交互來實現(xiàn)統(tǒng)一的抽象服務(wù)。
根據(jù)Plugin 和MD-SAL 的關(guān)聯(lián)方式,Plugin 分為BA(Binding-Aware)和BI(Binding-Independent),前者指使用根據(jù)Yang Model 定義而自動生成的Java Bind?ings 的Plugin,后者指使用DOM 格式編程接口的API。Yang是一種數(shù)據(jù)模型語言,被用來定義ODL中全部的API,相比而言更加抽象、具有更好的可擴展性和更高的開發(fā)效率。故本文僅介紹BA 類的MD-SAL Plugin開發(fā)。
開發(fā)過程主要分為3個步驟,首先用Yang語言對需要的功能進(jìn)行建模,然后實現(xiàn)Plugin 所要提供的服務(wù),最后定義REST API接口使得能夠通過北向接口調(diào)用服務(wù)。
首先要定義能夠從Yang 建模文件自動生成API的Yang項目。需要創(chuàng)建Yang項目并在項目目錄下創(chuàng)建Yang建模文件定義北向數(shù)據(jù)模型,指定該模塊的命名空間,導(dǎo)入需要使用的其他Yang 模塊,定義RPC 調(diào)用方法和輸入輸出信息及相應(yīng)的數(shù)據(jù)類型。若新創(chuàng)建的Yang 模型和已存在的Yang 模型位于同一目錄下,則只需繼承最上層的pom.xml并配置編譯打包的形式和編譯工具信息,否則還需要創(chuàng)建最上層的Maven pom.xm l,在其中配置自動生成的Java 源文件的路徑、配置文件的目錄路徑、OSGI Bundle的依賴關(guān)系和編譯工具信息,并指定關(guān)聯(lián)創(chuàng)建的其他模塊。編譯Yang模型文件,并根據(jù)pom.xml中的配置信息自動生成API和OSGI Bundle。
接下來要實現(xiàn)Plugin所提供的具體服務(wù)。因為配置子系統(tǒng)能夠?qū)Ψ?wù)的生命周期進(jìn)行管理,所以利用它來將實現(xiàn)的服務(wù)實例化并和MD-SAL 連接。為此,首先需要創(chuàng)建Yang 文件描述所實現(xiàn)服務(wù)的配置信息和需要的其他服務(wù),并設(shè)定該模塊的識別字符和對應(yīng)的分支操作。implementation模塊的pom.xml文件中除需和上述類似的配置信息外,還要指定依賴已定義的model 模塊。根據(jù)pom.xm l 中的配置將該模塊自動生成Java Bindings,并在其中創(chuàng)建Impl.java文件實現(xiàn)Plu?gin的具體服務(wù)。Impl類需要實現(xiàn)由Yang建模文件生成的Service接口,并且根據(jù)建模中定義的輸入輸出信息在操作中接收和返回數(shù)據(jù)。然后為了在MD-SAL喚醒bundle時能夠?qū)嵗?wù),需要在自動生成的Mod?ule.java文件中添加一個logger和Impl服務(wù)的實例并用配置變量賦值然后寫入到MD-SAL。打開karaf 控制器,將生成的2 個jar 文件(model and provider)復(fù)制到karaf 的配置目錄下,創(chuàng)建配置文件描述注入對象Plu?gin的信息,定義注入數(shù)據(jù)。
以上2 個步驟所有的設(shè)置都完成后,就可以通過自動生成的Rest API調(diào)用定義的服務(wù)。
所以基于OpenDaylight 可以輕松地實現(xiàn)擴展SDN控制器的功能模塊,只需要專注于提供北向服務(wù)的Yang model 的設(shè)計實現(xiàn),南向可直接調(diào)用已經(jīng)實現(xiàn)的功能或模塊,主要是南向?qū)Σ煌瑓f(xié)議的支持,如已經(jīng)實現(xiàn)的OPENFLOW 可以用于LAN 控制器的開發(fā)、PCEP可以用于WAN控制器的開發(fā)等。
可編程的、靈活的SDN是現(xiàn)今網(wǎng)絡(luò)技術(shù)發(fā)展的重要方向。目前,在許多開源資源的支持下,已經(jīng)可以比較快速地開發(fā)SDN 控制器。在目前的眾多開源項目中,OpenDaylight利用易于掌握的服務(wù)抽象層(SAL)編程思想和已實現(xiàn)的實用功能模塊,提供了簡單易用的開發(fā)工具。希望本文介紹的開發(fā)方法,能給SDN控制器的開發(fā)者帶來有益的幫助。
[1] SDN Defined[EB/OL].[2015-06-11].https://www.opennetworking.org/sdn-resources/sdn-definition.
[2] Software-defined networking[EB/OL].[2015-06-11]. https://en.wikipedia.org/wiki/Software-defined_netWorking.
[3] 張朝昆,崔勇,唐翯祎,等.軟件定義網(wǎng)絡(luò)(SDN)研究進(jìn)展[J].軟件學(xué)報,2015,26(1):62-81.
[4] SDN 你必須知道的十大問題——SDN 有哪些開源項目[EB/OL].[2015-06-11].http://www.sdnlab.com/8091.htm l.
[5] 左青云,陳鳴,趙廣松,等.基于OpenFlow的SDN技術(shù)研究[J].軟件學(xué)報,2013(5).
[6] OpenDaylight Controller:MD-SAL:Toaster Stop-By-Step[EB/OL].[2015-06-11].https://www.opendaylight.org/.
[7] Controller Projects′Modules/bundles and Interfaces[EB/OL].[2015-06-11]. https://wiki.opendaylight.org/view/GettingStarted:Develop?er_Main.
[8] ONOS 預(yù)熱篇之ONOS 與OpenDaylight 比較[EB/OL].[2015-06-11].http://www.sdnlab.com/4309.htm l.
[9] ODL MD-SAL APP 架 構(gòu) 入 門-Final[EB/OL].[2015-06-11].http://pan.baidu.com/s/1c0ddUW4.
[10]郝鵬. 淺談OpenDaylight 的二次開發(fā)[EB/OL].[2015-06-11].http://www.sdnlab.com/11587.html.
[11]OpenDaylight 學(xué)習(xí)文檔及開發(fā)初級教程[EB/OL].[2015-06-11].http://www.sdnap.com/sdnap-post/4370.htm l.
[12]基于OpenDayLight 的SDN 網(wǎng)絡(luò)轉(zhuǎn)發(fā)機制研究[EB/OL].[2015-06-11].http://network.51cto.com/art/201312/422938.htm.
[13]OpenDaylight 學(xué)習(xí)[EB/OL].[2015-06-11]. http://blog.csdn.net/quqi99/article/details/9156497.
[14]源碼解讀ODL 與OpenFlow 交換機建立過程[EB/OL].[2015-06-11].http://www.sdnlabcom/12035.htm l.
[15]ODL 應(yīng)用開發(fā)之MD-SAL 中級教程[EB/OL].[2015-06-11].http://www.sdnlab.com/11995.htm l.
[16]ODL學(xué)習(xí)筆記基礎(chǔ)之模塊開發(fā)篇[EB/OL].[2015-06-11].http://www.sdnlab.com/11456.htm l.
李心舒,現(xiàn)就讀于南京師范大學(xué)計算機科學(xué)與技術(shù)專業(yè)。