ZZ:SDNLAB技术分享(一):ODL的SFC入门和Demo
在網(wǎng)絡(luò)通信過(guò)程中,包含各式各樣的網(wǎng)絡(luò)服務(wù)功能。既可以包含傳統(tǒng)的像防火墻,NAT等功能,也有包含特定的網(wǎng)絡(luò)應(yīng)用功能(Service Function)。將特定的網(wǎng)絡(luò)應(yīng)用功能有序地組合起來(lái),接著讓流量通過(guò)這些服務(wù)功能就構(gòu)成了網(wǎng)絡(luò)服務(wù)鏈(Network Service Chain)。一般在數(shù)據(jù)中心環(huán)境下,往往會(huì)有網(wǎng)絡(luò)服務(wù)鏈(Network Service Chaining)的部署需求,使得報(bào)文在數(shù)據(jù)中心傳遞的時(shí)候,能夠經(jīng)過(guò)各種各樣的服務(wù)節(jié)點(diǎn),保證安全、快速、穩(wěn)定的網(wǎng)絡(luò)服務(wù)。
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ù)洌匦逻M(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(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ù)洹D舷蛞仓С諲etconf,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)備
系統(tǒng)需要是Ubuntu 14.04(Mac也可以)
Java 7
Mave 3.4
git OpenDaylight SFC項(xiàng)目到本地
Python3.4
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及所需包如下:
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)目:
Shell
mvn clean install –DskipTests
|
1 |
mvncleaninstall–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 Function
點(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ù)浜凸ぷ髁?/h3>
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)行如下命令:
Shell
python3.4 sff_client.py --remote-sff-ip 192.168.2.134 --remote-sff-port 4789 --sfp-id 63 --sfp-index 255
|
1 |
python3.4sff_client.py--remote-sff-ip192.168.2.134--remote-sff-port4789--sfp-id63--sfp-index255 |
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。
4.參考文檔及后續(xù)閱讀
網(wǎng)絡(luò)服務(wù)鏈ppt:
http://wenku.baidu.com/link?url=kiiof5kXtwNnNM9xGDF6VboASaKnKw48Cz6fxW92JMgyTqsbR5c1CsWLzQp4idt6d-zDjiihHt6MsBeURiJt0kSD8DHyTcrnl6eSIan5Xay
本實(shí)驗(yàn)基于SFC 101文檔,具體英文原版參見(jiàn):
https://drive.google.com/file/d/0BzS_qWNqsnQbUnEzU3BqVzdueTQ/view?usp=sharing
SFC架構(gòu):
http://datatracker.ietf.org/doc/draft-ietf-sfc-architecture/
SFC ppt:
https://wiki.opendaylight.org/view/Service_Function_Chaining:Presentations
http://network.51cto.com/art/201312/425928.htm
相關(guān)資料:http://packetpushers.net/service-chaining/
Q&A
Q:服務(wù)鏈與業(yè)務(wù)編排的區(qū)別是什么?
A:這里的SFC也是一種業(yè)務(wù)形式,我認(rèn)為這里服務(wù)鏈應(yīng)該是業(yè)務(wù)編排的子集。
Q:補(bǔ)充一下問(wèn)題,如果SF不支持NSH,那么SF設(shè)備的回包,SFF設(shè)備如何判斷它屬于哪條鏈呢?問(wèn)這個(gè)問(wèn)題主要是因?yàn)槲覀児菊谧鲞@塊的解決方案,我還沒(méi)有搞清楚怎么和傳統(tǒng)的設(shè)備進(jìn)行配合。其實(shí)整個(gè)SDN領(lǐng)域里面都存在和傳統(tǒng)設(shè)備配合這種頭疼的問(wèn)題。
A:這個(gè)要看具體classify的policy了。基于nsh的數(shù)據(jù)平面識(shí)別rsp是看classifier打的path-id,識(shí)別與sf無(wú)關(guān)。但是對(duì)于基于nsh的sfc,sf只需要在處理完以后,將nsh的index字段減1,將數(shù)據(jù)包回傳給sff就可以了。如果你要是新設(shè)備和老設(shè)備一起,是不是可以考慮l2,用mac來(lái)實(shí)現(xiàn)?詳細(xì)見(jiàn)參考資料service function chain.pdf/p18。
Q:各個(gè)SF節(jié)點(diǎn)間數(shù)據(jù)共享?如何實(shí)現(xiàn)的,謝謝
A:基于nsh的數(shù)據(jù)之間共享是通過(guò)metadata字段來(lái)共享的。
Q:個(gè)人比較習(xí)慣看數(shù)據(jù)包,能不能展示一下NSH的數(shù)據(jù)包呢,現(xiàn)在看NSH的文檔只能看協(xié)議字段,感謝。
A:nsh數(shù)據(jù)包,看rfc。實(shí)現(xiàn)可以看sfc/sfc-py下源碼。
Q:同上,還有ODL控制器控制器流量經(jīng)過(guò)SF是用OpenFlow流表嗎,流表是怎么匹配NSH頭?謝謝~
A:openflow13也是sfc的l2另一種實(shí)現(xiàn)方式,這個(gè)可以不需要配置nah。詳細(xì)見(jiàn)參考資料service function chain.pdf/p18。這種我沒(méi)有實(shí)現(xiàn)過(guò),不好意思。
Q:控制器怎么知道各個(gè)sf的具體掛在哪個(gè)交換機(jī)的哪個(gè)端口上,是由誰(shuí)告訴他的?包括物理的sf(此時(shí)掛在物理交換機(jī)上)和虛機(jī)方式的sf(此時(shí)掛在虛擬交換機(jī)上,并且可能是sf虛機(jī)是動(dòng)態(tài)創(chuàng)建出來(lái)的)分別怎么知道的?
A:在odl配置的時(shí)候會(huì)指定sf的data plane。
Q:sf 設(shè)備可以是物理設(shè)備吧?
A:sf是一個(gè)邏輯上的概念。
Q:如果SF是NAT設(shè)備怎么辦?傳統(tǒng)的NAT設(shè)備可以正常識(shí)別到NSH的頭么?還有,nat之后的包地址端口都有可能發(fā)生變化,ODL是怎樣重新識(shí)別的?
A:odl只負(fù)責(zé)控制平面,跟具體功能無(wú)關(guān)。nsh頭是附加在報(bào)文上的,在最后要remove掉的。
Q:?jiǎn)杺€(gè)小白問(wèn)題,上面提到的支持南向各種協(xié)議,特意提出了openflow12,現(xiàn)在of13支持嗎?
A:源代碼里面寫的是op12,不過(guò)坑也很多。
Q:我記得SFF最后一條是發(fā)回給classifier 應(yīng)該不會(huì)自己去nsh吧?
A:這個(gè)我看到過(guò)在最后一個(gè)sff去掉nsh的。
Q:我記得是傳給classifier或者proxy解,以前看odl的sff發(fā)的過(guò)包。你有時(shí)間看下也幫我確認(rèn)下。可能我看錯(cuò)了。
A:之前在做的時(shí)候,一般也設(shè)計(jì)sff只負(fù)責(zé)轉(zhuǎn)發(fā)。但是rfc中也提到過(guò)可以由最后一個(gè)sff來(lái)去除封裝。
Q:最后一個(gè)問(wèn)題多SFF你做過(guò)test么?這個(gè)總是SP SI conflict,一直沒(méi)做成過(guò)。
A:多SFF,可以起多個(gè)agent,每個(gè)agent負(fù)責(zé)一個(gè)sff。不過(guò)代碼可能要調(diào)試一下。
作者:泡芙小超人
總結(jié)
以上是生活随笔為你收集整理的ZZ:SDNLAB技术分享(一):ODL的SFC入门和Demo的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。
- 上一篇: 数据库设计新手容易掉进的陷阱(不断更新中
- 下一篇: 极氪预告旗下第三款车型:定位小型 SUV