1.SDN服務(wù)鏈基本概述
由于Overlay網(wǎng)絡(luò)的發(fā)展,使得虛擬網(wǎng)絡(luò)和物理網(wǎng)絡(luò)分離,讓數(shù)據(jù)中心的網(wǎng)絡(luò)控制變得更加靈活,更具有擴(kuò)展性。然而,在數(shù)據(jù)中心中,還存在很多介于虛擬網(wǎng)絡(luò)和物理網(wǎng)絡(luò)之間的中間件,如防火墻,QoS,負(fù)載均衡器等。這些中間件提供了必要的業(yè)務(wù)處理功能,即Service Function。靈活、便捷、高效、安全地調(diào)配流量到Service Function上處理,形成服務(wù)鏈(Service Function Chaining),這就是SFC項(xiàng)目要解決的問(wèn)題。服務(wù)鏈可以理解為一種業(yè)務(wù)形式。
過(guò)去也有服務(wù)鏈的概念,但傳統(tǒng)的網(wǎng)絡(luò)服務(wù)鏈往往和網(wǎng)絡(luò)拓?fù)渚o密耦合、部署復(fù)雜,在服務(wù)鏈變更、擴(kuò)容時(shí),都需要改動(dòng)網(wǎng)絡(luò)拓?fù)?,重新進(jìn)行網(wǎng)絡(luò)設(shè)備的配置。而云計(jì)算環(huán)境廣泛使用虛擬化技術(shù),具有動(dòng)態(tài)性、高流動(dòng)性、規(guī)模易變化、多租戶等特點(diǎn),傳統(tǒng)網(wǎng)絡(luò)的服務(wù)鏈無(wú)法滿足這些需求,SDN的出現(xiàn)讓服務(wù)鏈又煥發(fā)了生機(jī)。因此,當(dāng)前再談及服務(wù)鏈時(shí),默認(rèn)指的是SDN服務(wù)鏈。
與傳統(tǒng)DC中配置的網(wǎng)絡(luò)服務(wù)鏈相比,基于SDN的SFC具有如下的優(yōu)勢(shì):
- 傳統(tǒng)的網(wǎng)絡(luò)服務(wù)鏈往往基于手工配置,很大程度上依賴于具體的網(wǎng)絡(luò)拓?fù)?,以至于網(wǎng)絡(luò)設(shè)備之間的耦合性很大。而基于SDN的配置,可以動(dòng)態(tài)的添加或者刪除鏈表上的服務(wù)節(jié)點(diǎn),不僅方便使用,而且解耦了網(wǎng)絡(luò)設(shè)備之間的關(guān)聯(lián)。
- 在數(shù)據(jù)流量經(jīng)過(guò)鏈表的過(guò)程中,SFC還支持分類器與服務(wù),服務(wù)與服務(wù)之間的上下文信息共享。
- 在傳統(tǒng)的數(shù)據(jù)服務(wù)鏈中,數(shù)據(jù)包往往要經(jīng)過(guò)過(guò)次分類,即多次解包、封包的過(guò)程。而在SFC中,這個(gè)過(guò)程大大縮減,一般只需在分類一次即可,使得整個(gè)過(guò)程更便捷、更高效。2.基于OpenDaylight的服務(wù)鏈項(xiàng)目
2.1 Service Function Chaining 的架構(gòu)及組件
OpenDaylight的SFC項(xiàng)目是整個(gè)控制器平臺(tái)內(nèi)部的一個(gè)功能模塊。用戶可以通過(guò)控制器提供的北向API來(lái)使用的SFC的功能,例如創(chuàng)建、更新或者刪除Service Chain,還可以通過(guò)配置非透明的metadata數(shù)據(jù)段用來(lái)在Service Function的節(jié)點(diǎn)間實(shí)現(xiàn)數(shù)據(jù)共享。
同時(shí),項(xiàng)目可以向Controller的DataStore中注冊(cè)、配置服務(wù)節(jié)點(diǎn),并獲取拓?fù)?。南向也支持Netconf,Openflow12等協(xié)議。
SFC核心組件如下:
- Classification:根據(jù)初始化的(配置好的)policy匹配數(shù)據(jù)流進(jìn)行封裝,然后轉(zhuǎn)入到Service Function Chain中。
- Service Function(SF): 負(fù)責(zé)對(duì)收到的數(shù)據(jù)包進(jìn)行特定功能的處理。作為一個(gè)邏輯上的組件,SF在具體實(shí)現(xiàn)的上可以是一個(gè)虛擬的元素,或者是嵌入在具體網(wǎng)絡(luò)設(shè)備上的某種功能。常見(jiàn)的SF有:防火墻(firewall),WAN設(shè)備加速器,深層報(bào)文檢測(cè)(Deep Packet Inspection,DPI),NAT等等。
- Service Function Forwarder(SFF):主要負(fù)責(zé)Service Function Chaining上的流量轉(zhuǎn)發(fā)控制。
- Service Function Chain(SFC): SFC定義了一個(gè)抽象的Service Function有序集合。經(jīng)過(guò)分類后的包要依次去遍歷集合中的Service Function。比如:用戶可以配置firewall->qos->dpi三種服務(wù)來(lái)構(gòu)建一條SFC。
- Rendered Service Path(RSP) : 數(shù)據(jù)包實(shí)際行走的路徑。
- Service Function Path(Service Function Path): SFP是一個(gè)邏輯概念,
它是介于SFC和RSP之間的一層抽象,有時(shí)候會(huì)將SFP與SFC等同。
2.2 ODL的SFC項(xiàng)目工作流原理
那么,SFC項(xiàng)目是怎么綜合起上述的組件進(jìn)行工作的呢?
一種基于NSH封裝頭的機(jī)制是,使用ODL配置并下發(fā)一條Service Function Chain,每條Chain都有自己的標(biāo)識(shí)。當(dāng)host1發(fā)送數(shù)據(jù)包給host2,數(shù)據(jù)包首先會(huì)到分類器中進(jìn)行篩選。分類出需要經(jīng)過(guò)Service Function Chaining的數(shù)據(jù)包會(huì)進(jìn)行封裝,并打上NSH頭。頭中包含了很多信息,包括走哪一條服務(wù)鏈,服務(wù)鏈有幾跳等。接著數(shù)據(jù)包會(huì)依次經(jīng)過(guò)SFF,由SFF將數(shù)據(jù)包傳遞給SF或者下一跳的SFF,直到鏈的最后。
3.實(shí)驗(yàn)
本篇文章旨在通過(guò)基本概念的介紹和一個(gè)SFC的實(shí)驗(yàn),幫助大家了解SFC是什么,在OpenDaylight中如何去配置基本的SFC。通過(guò)對(duì)SFC有個(gè)大致的了解,有興趣的同學(xué)可以繼續(xù)深入地去研究NSH,SFC架構(gòu)及應(yīng)用等知識(shí)。
3.1 實(shí)驗(yàn)準(zhǔn)備
Python導(dǎo)入包包括:requests,flask,netifaces,paramiko等
在Ubuntu14.04下搭建ODL環(huán)境參考:https://wiki.opendaylight.org/view/Install_On_Ubuntu_14.04
在Ubuntu下安裝Python3.4及所需包如下:
如果沒(méi)有Python3.4:
安裝一個(gè)Python3.4-pip安裝器
安裝flask包,其他包安裝類似,根據(jù)版本不同,安裝方法或者指令不一定與這里相同:
3.2 術(shù)語(yǔ)簡(jiǎn)表:
- SF : Service Function
- SFF : Service Function Forwarder
- SFP : Service Function Path
- RSP : Rendered Service Path
- ODL : OpenDaylight
- SFC Agent: Service Function Chaining Agent.
3.3 基本配置和安裝:
ifconfig查看本地機(jī)器的ip,我這邊是:192.168.2.134
安裝ODL的sfc項(xiàng)目:git clone http://git.opendaylight.org/gerrit/sfc
樓主使用的SFC是5月份的版本:
可以git reset –-hard cd12dda6回到那個(gè)版本。
如果讀者在實(shí)驗(yàn)的時(shí)候,用的是最新版本的SFC,在sfc/sfc-py/sfc/nsh/service.py腳本有很多bug,要做適當(dāng)修改。這里為方便,就使用之前版本演示。
用maven構(gòu)建一下項(xiàng)目:
mvn clean install –DskipTests
啟動(dòng)ODL:
過(guò)一會(huì)兒,就可以用瀏覽器進(jìn)入SFC的ui界面了:http://localhost:8181/sfc/index.html 用戶名和密碼都是:admin
剛開(kāi)始進(jìn)來(lái)都是空的,點(diǎn)擊System Info會(huì)有404也不要緊張,因?yàn)槭裁炊紱](méi)有配置。另外,在ODL中創(chuàng)建SFC有兩種方式:第一,用北向的RESTAPI;第二,用UI來(lái)創(chuàng)建。本次實(shí)驗(yàn)用將基于UI,這樣看起來(lái)比較直觀,方便理解。后續(xù)有興趣用REST來(lái)配置的參見(jiàn)SFC 101文檔。
3.4 開(kāi)始實(shí)驗(yàn)
3.4.1 啟動(dòng)SFC Agent
SFC Agent是用Python腳本寫的一個(gè)仿真工具,位于SFC項(xiàng)目的sfc-py目錄下。在實(shí)驗(yàn)的過(guò)程中,ODL在南向通過(guò)REST與Agent進(jìn)行通信,即ODL通過(guò)REST將配置的信息下發(fā)給Agent,Agent根據(jù)這些信息,在數(shù)據(jù)平面仿真出相應(yīng)的元素組件。使用Agent的好處就是在實(shí)驗(yàn)中,簡(jiǎn)化南向接口,易于實(shí)現(xiàn)實(shí)驗(yàn)。
進(jìn)入到sfc/sfc-py目錄下,打開(kāi)start_agent.sh文件,修改默認(rèn)的ip地址為本地主機(jī)ip:
也可以將127.0.0.1改成192.168.2.134。
啟動(dòng)Agent:
根據(jù)上圖可以直到Agent運(yùn)行的端口是5000。
3.4.2 創(chuàng)建Service Functiont
點(diǎn)擊導(dǎo)航欄的Service Function標(biāo)簽,再點(diǎn)擊”Add Service Function”,填寫表格如下:
點(diǎn)擊Submit,在Agent端,有如下信息輸出:
表明Agent已經(jīng)成功為我們創(chuàng)建好了SF1(firewall)。
這里有幾個(gè)地方要注意:
1.NSH頭的使用。我們這里是基于Agent的仿真實(shí)驗(yàn),沒(méi)有對(duì)分類器做配置。選True 和False都沒(méi)有關(guān)系,但是實(shí)際情況下會(huì)根據(jù)NSH頭的信息來(lái)選擇具體的路徑。具體可以研究:http://datatracker.ietf.org/doc/draft-ietf-sfc-nsh/
2.數(shù)據(jù)平面的通信方式一定要選,這里選vxlan-gpe。要不然Agent收不到請(qǐng)求。
3.SFF1暫時(shí)還沒(méi)有創(chuàng)建,可以先填入SFF1,后面創(chuàng)建SFF的名字要與這里一致。
3.4.3 創(chuàng)建SFF
在導(dǎo)航菜單中點(diǎn)擊Service Function Forwarder,點(diǎn)擊”Add Service Function Forwarder”,填寫表單信息如下:
右下角的SFF dictionary“Remove”掉,后面的版本也沒(méi)有這個(gè)directory了。如下圖:
submit以后,在Agent端,SFF創(chuàng)建成功信息打印如下:
3.4.4 目前拓?fù)浜凸ぷ髁?/p>
3.4.5 創(chuàng)建Service Function Chain
在導(dǎo)航欄點(diǎn)擊Service Function Chain標(biāo)簽:
- 點(diǎn)擊創(chuàng)建Service Function Chain
- 填入名字“Chain-1”,提交
- 將”firewall”的SF拖拽到右邊的Chain-1中
- 保存一下,點(diǎn)擊deploy,生成一條Service Function Path,命名為“Chain-1-Path-1”,這樣就創(chuàng)建好了Service Function Paht。
3.4.6 創(chuàng)建Rendered Function Path
導(dǎo)航欄中點(diǎn)擊”Service Function Paths” ,將會(huì)看到我們剛創(chuàng)建的SFP。
根據(jù)SFP,點(diǎn)擊上圖按鈕,可以生成一條RSP。如果勾上了”Symmetric path”就會(huì)另外生成一條對(duì)稱反向的RSP。
成功以后,記住RSP的兩個(gè)重要屬性“Path-ID”為63,“starting-index”為255。
這個(gè)時(shí)候我們可以看到Agent里面打印的消息:
通過(guò)從SFC 的創(chuàng)建到SFP,再到RSP的創(chuàng)建,是一個(gè)由抽象到具體的過(guò)程。從應(yīng)用的角度來(lái)理解,SFC是對(duì)Service Function的一層抽象,這里的SFP是具體化每個(gè)Service Function到其對(duì)應(yīng)的配置的SF(SF1),而RSP的生成代表包具體穿過(guò)的路徑將是怎樣的。
3.4.7 發(fā)送數(shù)據(jù)包
我們將發(fā)送數(shù)據(jù)包來(lái)遍歷這條簡(jiǎn)單的SFC,“Path-ID”為63,“starting-index”為255。打開(kāi)sfc/sfc-py/sfc/目錄,運(yùn)行如下命令:
python3.4 sff_client.py --remote-sff-ip 192.168.2.134 --remote-sff-port 4789 --sfp-id 63 --sfp-index 255
Agent獲取結(jié)果如下:
從上圖可以看到客戶端(Client192.168.2.134:4790)發(fā)送包到SFF,SFF然后再將包發(fā)送給SF進(jìn)行處理。SF處理完再轉(zhuǎn)回給SFF,SFF再尋找下一跳,如果沒(méi)找到,判斷為鏈表末尾。
3.4.8 實(shí)驗(yàn)總結(jié)
以上我們簡(jiǎn)單的演示了一個(gè)SFC的使用實(shí)驗(yàn),只包含了一個(gè)SFF和SF。通過(guò)在ODL中使用北向UI接口配置SF的信息,配置SFF的信息并關(guān)聯(lián)相應(yīng)的SF下發(fā)給Agent。在這個(gè)過(guò)程里,我們還可以刪除,修改這些節(jié)點(diǎn)信息,充分體現(xiàn)了基于SDN的服務(wù)鏈的靈活性、拓?fù)洫?dú)立性。
用戶需要配置服務(wù)鏈的時(shí)候,只需要通過(guò)控制器的北向接口自由組合節(jié)點(diǎn)成有序序列。然后使用的時(shí)候,生成一條數(shù)據(jù)包路徑,并下發(fā)即可。同時(shí),用戶也可以配置多條服務(wù)鏈。
注意,在不修改原始python腳本的情況下,在南向使用Agent可以創(chuàng)建多SF掛到一個(gè)SFF上,但只能創(chuàng)建一個(gè)SFF。
審核編輯:郭婷
評(píng)論
查看更多