閱讀冗長(zhǎng)的NETCONF/YANG的RFC文檔是相當(dāng)乏味枯燥的,結(jié)合開發(fā)實(shí)踐,本文試圖刪其繁,撮其要,給出NETCONF/YANG的輪廓和要點(diǎn)。
引子
NETCONF和YANG的目的是以可編程的方式實(shí)現(xiàn)網(wǎng)絡(luò)配置的自動(dòng)化,從而簡(jiǎn)化和加快網(wǎng)絡(luò)設(shè)備和服務(wù)的部署,為網(wǎng)絡(luò)運(yùn)營(yíng)商和企業(yè)用戶節(jié)約成本。NETCONF和YANG對(duì)應(yīng)的RFC文檔分別是RFC6241和RFC6020,而RFC6244描述了一個(gè)實(shí)現(xiàn)NETCONF/YANG的參考架構(gòu)。
按照RFC6241的定義,NETCONF是安裝、編輯和刪除網(wǎng)絡(luò)設(shè)備配置的標(biāo)準(zhǔn)協(xié)議。RFC6020指出,YANG是一種數(shù)據(jù)模型語(yǔ)言(Data Modeling Language),用來描述NETCONF相關(guān)的網(wǎng)絡(luò)配置和網(wǎng)絡(luò)狀態(tài)的數(shù)據(jù)模型,包括NETCONF支持的RPC(Remote Procedure Call)消息和異步通知(Notification)。請(qǐng)注意,YANG本身不是數(shù)據(jù)模型,而是定義數(shù)據(jù)模型的語(yǔ)言。YANG和NETCONF是相伴而生的,雖然,原則上YANG也能夠用于其他的協(xié)議和不同的領(lǐng)域,但基本上可以認(rèn)為YANG就是為NETCONF量身定做的。
2002年,IAB(Internet Architecture Board)召集了一次關(guān)于網(wǎng)絡(luò)管理的專題工作會(huì)議(Workshop),最終形成了RFC3535。在這份文檔中,針對(duì)當(dāng)時(shí)網(wǎng)絡(luò)管理中存在的問題,提出了14項(xiàng)需求,我們不妨列出其中關(guān)鍵的幾項(xiàng):
簡(jiǎn)單好用。這何須說?!嚴(yán)格區(qū)分網(wǎng)絡(luò)可配置的數(shù)據(jù)和運(yùn)行時(shí)的狀態(tài)數(shù)據(jù)。可配置的數(shù)據(jù)如靜態(tài)IP地址和VLAN,用來改變?cè)O(shè)備的行為;狀態(tài)數(shù)據(jù)如接收、丟棄、轉(zhuǎn)發(fā)的數(shù)據(jù)包的計(jì)數(shù)統(tǒng)計(jì),用來監(jiān)控設(shè)備的行為。PicOS的Cli就有Operational模式和Configure模式,分別用于輸出系統(tǒng)狀態(tài)和改變系統(tǒng)配置。可以將整個(gè)網(wǎng)絡(luò)作為配置的對(duì)象,而不僅僅是單獨(dú)的設(shè)備。所謂SDN的集中式管理不就是這樣嗎?很多SDN的Controller平臺(tái)如OpenDaylight本身也是基于整個(gè)網(wǎng)絡(luò)視圖的開發(fā)平臺(tái)。支持多個(gè)網(wǎng)絡(luò)設(shè)備配置的transaction機(jī)制。比如,給定一個(gè)網(wǎng)絡(luò),利用Dijkstra算法得到兩個(gè)主機(jī)之間的最短路徑,將正確路由配置到這一路徑上的每個(gè)交換設(shè)備。若某個(gè)交換設(shè)備配置失敗,那么所有的交換設(shè)備都應(yīng)該恢復(fù)到原來狀態(tài)。這個(gè)說起來簡(jiǎn)單,做起來恐怕并不容易。網(wǎng)絡(luò)設(shè)備可保留多份配置拷貝,不同配置之間可以自由切換,以適配不同的應(yīng)用場(chǎng)景。這樣,交換機(jī)就可以切換到特殊的配置來應(yīng)對(duì)流量高峰期的到來。另外,更為重要的是,是否支持可編程配置的API不是問題,問題是以怎樣的方式來支持。這也是自動(dòng)化配置的基礎(chǔ)。顯然,已有的網(wǎng)絡(luò)管理協(xié)議SNMP和上述的需求比較起來就大大的力所不逮了:盡管具有一些配置的功能,但SNMP本身并不是面向配置的協(xié)議,也不適合開發(fā)用于配置的客戶端應(yīng)用,更談不到Transaction機(jī)制的支持。要滿足這些需求,設(shè)計(jì)新的替代的網(wǎng)絡(luò)管理協(xié)議就不可避免了。于是NETCONF和YANG的1.0版本分別于2006年和2010年正式發(fā)布。
總的來說,NETCONF/YANG并不規(guī)范配置的內(nèi)容,支持NETCONF/YANG的設(shè)備供應(yīng)商可保留自己的特有的配置內(nèi)容,但需要轉(zhuǎn)換成用YANG定義的數(shù)據(jù)模型。然后,NETCONF通過定義標(biāo)準(zhǔn)的操作接口,必須用統(tǒng)一的方法來安裝、編輯、刪除配置內(nèi)容,獲取設(shè)備運(yùn)行的狀態(tài)數(shù)據(jù)。也就是說,數(shù)據(jù)內(nèi)容可以不同,但定義數(shù)據(jù)(YANG)和操作數(shù)據(jù)(NETCONF)的方法必須一致統(tǒng)一。
相對(duì)來講,NETCONF和YANG都不是很新的東西。SDN(Software Defined Network)在學(xué)術(shù)界和工業(yè)界的發(fā)展和影響賦予了這兩項(xiàng)技術(shù)老樹吐新芽,迎來第二春的機(jī)會(huì)。大家都知道,SDN不能僅僅停留在抽象的概念層面上,必須找到應(yīng)用的切入點(diǎn), 并向更廣泛的領(lǐng)域逐漸展開,才會(huì)具有真正的生命力。目前來看,虛擬網(wǎng)絡(luò)和自動(dòng)化配置是SDN應(yīng)用的兩個(gè)重要支柱。自動(dòng)化配置讓人們重新發(fā)現(xiàn)了NETCONF和YANG的價(jià)值。
NETCONF和YANG相互交織纏繞在一起,剪不斷,理還亂,很難把它們分開來一一描述清楚。所以本文從自動(dòng)化網(wǎng)絡(luò)設(shè)備配置的功能為切入點(diǎn),用實(shí)際的用例,來說明NETCONF/YANG是如何相互配合完成這些功能的。
組成和交互
NETCONF的自動(dòng)化配置系統(tǒng)采用Client/Server架構(gòu)。Client和Server之間由面向連接的傳輸協(xié)議建立會(huì)話。SSH(Secure Shell)是NETCONF強(qiáng)制支持的傳輸協(xié)議,其他的傳輸協(xié)議如TLS和SOAP也能滿足NETCONF的要求。Client和Server通信的內(nèi)容是NETCONF定義的雙向的XML格式的RPC(Remote Procedure Call)消息,包括從Client發(fā)送到Server的請(qǐng)求消息,以及Server的響應(yīng)消息。這樣,Client就可以獲取并修改Server的配置數(shù)據(jù)(configuration datastore)。
下圖描述了NETCONF配置系統(tǒng)的結(jié)構(gòu)。NETCONF Server是要配置的網(wǎng)絡(luò)設(shè)備,除了硬件之外,NETCONF引擎是和NETCONF Client建立會(huì)話的軟件模塊,當(dāng)然,Server上面還會(huì)運(yùn)行自身設(shè)備的軟件系統(tǒng)。配置數(shù)據(jù)由NETCONF引擎維護(hù)并傳遞給Server的軟件系統(tǒng),最終應(yīng)用到硬件的芯片。正如上文所述,配置數(shù)據(jù)的語(yǔ)法結(jié)構(gòu)是用YANG語(yǔ)言定義的數(shù)據(jù)模型來描述的,包括數(shù)據(jù)類型和數(shù)據(jù)結(jié)構(gòu)。這和XML的Schema與對(duì)應(yīng)的應(yīng)用域數(shù)據(jù)的關(guān)系完全類似。YANG分層的樹狀結(jié)構(gòu)非常適用于網(wǎng)絡(luò)設(shè)備的配置數(shù)據(jù)的定義。YANG的另外一個(gè)優(yōu)點(diǎn)是沒有晦澀的內(nèi)容,簡(jiǎn)單易懂。用戶拿到Y(jié)ANG的數(shù)據(jù)模型文件,即可明白如何寫NETCONF Client程序來配置網(wǎng)絡(luò)設(shè)備。YANG語(yǔ)言的數(shù)據(jù)模型可以無信息丟失的轉(zhuǎn)換為XML的格式,稱為YIN(YANG Independent Notation),主要是為了利用隨手可得的標(biāo)準(zhǔn)的XML解析器。開源的NETCONF工具庫(kù)libnetconf提供了轉(zhuǎn)換的工具lnctool。NETCONF引擎和Client程序用YIN檢查配置數(shù)據(jù)的合法性。下文將用一個(gè)簡(jiǎn)單的例子來說明YANG是如何定義配置數(shù)據(jù)的數(shù)據(jù)模型。
一般地,Client和Server經(jīng)過如下的步驟來完成配置的獲取和改變:
由此可見,用戶能夠以任何編程語(yǔ)言實(shí)現(xiàn)遠(yuǎn)端網(wǎng)絡(luò)設(shè)備的定制化配置的需求,所做的無非是與Server建立會(huì)話連接,封裝發(fā)送請(qǐng)求消息,接收解析消息。重要的是,用戶可以通過這種簡(jiǎn)單的交互模式,實(shí)現(xiàn)自己的業(yè)務(wù)邏輯,比如,可根據(jù)網(wǎng)絡(luò)的負(fù)載和設(shè)備的狀態(tài),應(yīng)用不同的配置。這也許就是可編程的自動(dòng)化配置的內(nèi)涵,也是YANG和NETCONF設(shè)計(jì)的目標(biāo)。
模型和數(shù)據(jù)
METCONF Server上面的配置叫做配置存儲(chǔ)。配置存儲(chǔ)是設(shè)備完整的合法的一份配置數(shù)據(jù)拷貝,使能某個(gè)配置存儲(chǔ)可以把設(shè)備從缺省的初始狀態(tài)轉(zhuǎn)換到特定的運(yùn)行狀態(tài)。在同一個(gè)設(shè)備上,NETCONF可支持三種配置存儲(chǔ),包括:
運(yùn)行時(shí)配置(running configuration datastore)是設(shè)備當(dāng)前激活狀態(tài)的運(yùn)行中的配置,和運(yùn)行的狀態(tài)完全一致。重啟時(shí)配置(startup configuration datastore)是系統(tǒng)下次重啟時(shí)的配置,可以和運(yùn)行時(shí)配置不一樣。可選配置(candidate configuration datastore)是沒有生效的候選配置,可使用commit命令將可選配置應(yīng)用到設(shè)備,從而,可選配置變?yōu)楫?dāng)前的運(yùn)行時(shí)配置。無論是運(yùn)行時(shí)配置,重啟時(shí)配置還是可選配置的數(shù)據(jù),都是用YANG定義的數(shù)據(jù)模型來描述的。下面給出一個(gè)關(guān)于網(wǎng)絡(luò)設(shè)備接口的極度簡(jiǎn)化的例子。
YANG語(yǔ)言是非常直觀的模型語(yǔ)言,理解了上面代碼中YANG語(yǔ)言的一些關(guān)鍵詞,如module,container,list,leaf等,就基本可以清楚的知道代碼的含義了。解釋如下:
配置和操作
上文已說明,NETCONF Client和NETCONF Server通過RPC交互完成網(wǎng)絡(luò)設(shè)備的配置。下面給一個(gè)具體的例子,NETCONF Client向NETCONF Server發(fā)送一個(gè)xml編碼的請(qǐng)求(1),在Server的運(yùn)行時(shí)配置(2)上通過操作(operation)create新建一個(gè)網(wǎng)絡(luò)接口(3)。
如果操作成功,NETCONF Server將返回。
異步通知(notification)
通知類似于SNMP的trap機(jī)制,當(dāng)NETCONF Client訂閱(subcribe)通知時(shí),通知所對(duì)應(yīng)的事件發(fā)生之后,NETCONF Client就可以得到事件的信息。如下面的例子,NETCONF Client從NETCONF Server那里得到一個(gè)網(wǎng)絡(luò)接口的link-up事件。
參考文獻(xiàn)
Network Configuration Protocol (NETCONF)
https://tools.ietf.org/html/rfc6241
YANG - A Data Modeling Language for the Network Configuration Protocol
https://tools.ietf.org/html/rfc6020
An Architecture for Network Management Using NETCONF and YANG
https://tools.ietf.org/html/rfc6244
Network Configuration Management with NETCONF and YANG
https://www.ietf.org/edu/documents/2012-ietf-84-netconf-yang.pdf
NETCONF toolset Netopeer
https://github.com/cesnet/netopeer
Overview of the 2002 IAB Network Management Workshop
http://www.rfc-base.org/txt/rfc-3535.txt
作者簡(jiǎn)介:賈彥民,2008年畢業(yè)于中科院軟件所,曾供職于IBM和AVOS從事軟件開發(fā)工作,目前是Pica8 Inc.高級(jí)網(wǎng)絡(luò)軟件工程師。