一提到SDN,大家就會(huì)想到南北向接口,南向接口負(fù)責(zé)和交換機(jī)的交互,北向接口負(fù)責(zé)和各種應(yīng)用的交互,SDN控制器穩(wěn)坐中間,運(yùn)籌帷幄,決勝千里。在博主看來(lái),這只是SDN的冰山一角。對(duì)這個(gè)問(wèn)題比較全面的闡述出現(xiàn)在OpenStack Silicon Valley上Martin Casado的一次演講。雖然這次演講的主題是數(shù)據(jù)中心的策略管理(Policy for the Cloud Frontier),但Martin在演講中定義的三個(gè)方面卻實(shí)實(shí)在在是所有SDN系統(tǒng)需要解決的最基本的三個(gè)問(wèn)題。
1. 南向接口
這個(gè)方面很好描述,交換機(jī)來(lái)自不同的廠家,控制器來(lái)自不同的廠家,如何讓它們互聯(lián)互通?本質(zhì)上,這不是一個(gè)技術(shù)問(wèn)題,而是不同廠商的利益問(wèn)題。ONF的OpenFlow和OF-Config,Cisco的OpFlex,甚至有些廠家使用XML/Json + REST API。根據(jù)目前的情況,要建立南向接口標(biāo)準(zhǔn)困難重重。
OpenFlow + OF-Config是目前最好的選擇,標(biāo)準(zhǔn)相對(duì)而言最完善,開(kāi)源的實(shí)現(xiàn)最完整并且已經(jīng)有廠家開(kāi)始開(kāi)始支持OpenFlow1.3和1.4了?;贠penFlow的系統(tǒng)已經(jīng)在Google得到了部署[link]。
對(duì)于OpFlex和ACI,博主還呈觀望態(tài)度。如果沒(méi)有Cisco之外的其他交換機(jī)廠商支持,用戶仍然會(huì)陷入vendor lock-in的窘境,希望通過(guò)SDN節(jié)省成本可能會(huì)比較困難。
對(duì)于采用XML/Json + REST API作為南向接口,博主并沒(méi)有特別強(qiáng)烈的偏好。不少云服務(wù)提供商的網(wǎng)絡(luò)就是用REST API從控制器向交換機(jī)推送配置的。唯一的問(wèn)題是:這種集中的配置管理其實(shí)只是包裝在傳統(tǒng)網(wǎng)絡(luò)上面的一個(gè)feature,交換機(jī)之間仍然通過(guò)傳統(tǒng)的二層三層協(xié)議互聯(lián)互通。這種方案不會(huì)節(jié)省網(wǎng)絡(luò)部署和運(yùn)維的成本,相反,由于這個(gè)新的feature,企業(yè)可能還要購(gòu)買額外的軟件,聘請(qǐng)額外的工程師圍繞這個(gè)新feature進(jìn)行開(kāi)發(fā)和維護(hù)。這也從一個(gè)側(cè)面解釋了為什么有些企業(yè)部署所謂的SDN之后,成本反而增加:它們SDN的不徹底。
2. 分布式的狀態(tài)管理
也許大家會(huì)問(wèn):SDN都集中控制了,哪里需要分布式的狀態(tài)管理呢?但事實(shí)上,這是一個(gè)非常棘手的問(wèn)題。博主會(huì)在之后的文章里詳細(xì)討論這個(gè)問(wèn)題,這里給大家舉個(gè)例子先:試想在SDN網(wǎng)絡(luò)中的一條link突然斷了,交換機(jī)將這個(gè)事件通知了SDN控制器。SDN控制器決定將所有經(jīng)過(guò)這條link的流轉(zhuǎn)移到另外一條路徑上,換言之,僅僅斷掉一條link,新舊路徑上的每一個(gè)交換機(jī)都需要做出相應(yīng)的更新。更復(fù)雜的問(wèn)題是:SDN控制器應(yīng)該以怎樣的順序來(lái)更新眾多的交換機(jī)呢?由于SDN控制器和各個(gè)交換機(jī)的通信延時(shí),控制平面的擁塞狀況,交換機(jī)CPU的負(fù)載不同,SDN控制器發(fā)給各個(gè)交換機(jī)的Flow_Mod會(huì)無(wú)序的生效。那么,在流表被更新的這段時(shí)間,網(wǎng)絡(luò)便處于一個(gè)完全無(wú)法描述的狀態(tài)。擁塞丟包,路由黑洞都可能在這段時(shí)間發(fā)生。如果這段時(shí)間足夠的短,整個(gè)網(wǎng)絡(luò)馬上從上一個(gè)穩(wěn)定的狀態(tài)進(jìn)入到下一個(gè)穩(wěn)定的狀態(tài),大家也需可以接受。但是如果由于某些原因,這次狀態(tài)變化失敗,我們是否允許網(wǎng)絡(luò)處于一個(gè)未知的中間狀態(tài)?我們是否需要像數(shù)據(jù)庫(kù)那樣支持網(wǎng)絡(luò)狀態(tài)的回滾?通過(guò)這個(gè)簡(jiǎn)單的例子,我們已經(jīng)發(fā)現(xiàn),要維持SDN控制器和網(wǎng)絡(luò)中所有交換機(jī)的狀態(tài)保持同步是一件非常困難的事情。如何解決這個(gè)問(wèn)題,博主會(huì)在稍后的博文中分享一些教訓(xùn)。
3. 用戶模型到轉(zhuǎn)發(fā)模型的映射
正如Martin所說(shuō),這個(gè)問(wèn)題是SDN中最難也是最容易被忽略的一個(gè)問(wèn)題。我們不妨集體腦補(bǔ)一個(gè)場(chǎng)景,看看這究竟是一個(gè)什么樣的問(wèn)題:博主我剛剛用最高大上的SDN技術(shù)搭建了一個(gè)支持多租戶的數(shù)據(jù)中心(multi-tenancy datacenter)。我很開(kāi)心的迎來(lái)了第一個(gè)租戶(tenant),這個(gè)租戶的要求是建立一個(gè)擁有2 臺(tái)web服務(wù)器和1臺(tái)數(shù)據(jù)庫(kù)服務(wù)器的網(wǎng)站。web 服務(wù)器和數(shù)據(jù)庫(kù)屬于不同的子網(wǎng),在web服務(wù)器之前需要部署一個(gè)防火墻。web和數(shù)據(jù)庫(kù)之間只允許在TCP端口1234上進(jìn)行通訊。要命的是,這個(gè)租戶希望自己能夠一站式的完成所有以上的配置。我們仔細(xì)想想這個(gè)要求意味著什么。首先,SDN控制器要允許不同的租戶登錄,并且每個(gè)租戶僅僅能夠看到和配置自己的網(wǎng)絡(luò)及服務(wù)。其次,SDN控制器需要定義一套配置語(yǔ)言,并且這套語(yǔ)言僅僅需要描述業(yè)務(wù)邏輯,和底層網(wǎng)絡(luò)沒(méi)有絲毫的關(guān)系。再次,在租戶定義完成之后,不論實(shí)際網(wǎng)絡(luò)的拓?fù)涫鞘裁礃幼樱琒DN控制器都需要把租戶的配置轉(zhuǎn)變?yōu)榫W(wǎng)絡(luò)中實(shí)實(shí)在在的流表。在上面的這個(gè)例子中,SDN控制器甚至需要部署防火墻等網(wǎng)絡(luò)服務(wù)。有些數(shù)據(jù)中心是使用專門(mén)的硬件來(lái)履行這些網(wǎng)絡(luò)服務(wù)的,那么SDN控制器就一定要準(zhǔn)確的計(jì)算和更新流表,確認(rèn)網(wǎng)絡(luò)流量會(huì)沿著正確的路徑經(jīng)過(guò)這些硬件服務(wù)節(jié)點(diǎn)。
在設(shè)計(jì)SDN系統(tǒng)時(shí),還存在一些更難的問(wèn)題,比如高可靠性(high availability),自動(dòng)化部署(zero-touch provisioning),無(wú)丟包升級(jí)(hit-less upgrade)等等。之后的博文中會(huì)陸續(xù)涉及。在這里博主只想強(qiáng)調(diào):要設(shè)計(jì)一個(gè)最最基本的SDN系統(tǒng),這里所提到的三個(gè)方面是一定要仔細(xì)斟酌,設(shè)計(jì)和施工的。