近年來,隨著全球云計算領(lǐng)域的不斷發(fā)展與業(yè)務(wù)的不斷增長,促使網(wǎng)絡(luò)技術(shù)也不斷發(fā)展,SDN技術(shù)應(yīng)運而生个扰,從最初的基于Openflow的轉(zhuǎn)發(fā)與控制分離的核心思想,人們不斷的去擴展SDN的外延葱色,目前递宅,人們可以達成一個共識,Openflow不再是必備條件(但轉(zhuǎn)發(fā)與控制分離依然是核心條件)冬筒,網(wǎng)絡(luò)可編程能力慢慢地成為衡量一套SDN架構(gòu)的重要標準之一恐锣。
傳統(tǒng)的網(wǎng)絡(luò)設(shè)備進行可編程操作茅主,一般是基于CLI與SNMP協(xié)議去進行的舞痰,腳本也好,網(wǎng)管軟件也罷诀姚,都是在此基礎(chǔ)上去進行開發(fā)响牛,實現(xiàn)我們今天要談的廣義范圍上的網(wǎng)絡(luò)可編程能力,進而實現(xiàn)很多場景的自動化赫段。有些設(shè)備支持一些web界面的配置呀打,通過xml進行整體配置的替換,此類極少糯笙,本篇不做贅述贬丛。
? ? ? ?CLI
CLI(Command-line Interface),通過命令行的方式實現(xiàn)人機交互给涕,是網(wǎng)工必備的熟練豺憔,人們每天打開軟件ssh或者Telnet到設(shè)備,然后貼入一段配置够庙,保存生效恭应。有一天人們厭倦了這種重復(fù),通過程序自動生成配置腳本耘眨,批量登錄到設(shè)備下發(fā)配置生效昼榛,實現(xiàn)自動化,這是一種網(wǎng)絡(luò)可編程的方式剔难。說說優(yōu)點胆屿,非常符合人的思維奥喻、思路與既有的技術(shù)體系。但是說到底莺掠,這種方式更傾向于人衫嵌,而非網(wǎng)絡(luò)設(shè)備。它有著以下一些缺點:
廠商之間的命令集存在巨大差異彻秆,何止是廠商楔绞,同型號不同軟件版本可能差異都非常大。
開發(fā)人員必須熟知命令集及其使用方法唇兑,從配置層面存在安全風(fēng)險酒朵。比如手一瓢,想開端口變成了關(guān)閉端口...
對傳輸協(xié)議不強制要求(SSH與Telnet)扎附,存在生產(chǎn)安全風(fēng)險
解析與生成配置的過程及其復(fù)雜蔫耽,很多時候?qū)懙恼齽t只能是無限接近“真相”,而不是全部“真相”留夜。
沒有事務(wù)性匙铡,一次配置可能部分生效,部分不生效
沒有自動化的檢查機制碍粥,完全依賴人鳖眼。比如我想測試一下這段生成的腳本對不對,有辦法嚼摩,但是很困難钦讳,很多時候難以簡單實現(xiàn)。
沒有數(shù)據(jù)建模的思想
? ? ? CLI始終是人機交互的方式枕面,可以通過程序可以賦予網(wǎng)絡(luò)一定的可編程能力愿卒,但它畢竟不是天生面向網(wǎng)絡(luò)可編程的一種方式。在當(dāng)今云計算與SDN的浪潮之下潮秘,不適用于網(wǎng)絡(luò)中的大規(guī)模自動化部署琼开,可編程能力有限,這其中的開發(fā)難度難以為外人道也枕荞。
?SNMP
? ? ? ?SNMP(SNMP柜候,Simple Network Management Protocol),該協(xié)議能夠支持網(wǎng)絡(luò)管理系統(tǒng)买猖,用以監(jiān)測連接到網(wǎng)絡(luò)上的設(shè)備是否有任何引起管理上關(guān)注的情況改橘。它由一組網(wǎng)絡(luò)管理的標準組成,包含一個應(yīng)用層協(xié)議(application layer protocol)玉控、數(shù)據(jù)庫模式(database schema)飞主,和一組數(shù)據(jù)對象。
?維基百科里的一段內(nèi)容,我們劃下重點碌识,網(wǎng)絡(luò)管理碾篡,監(jiān)測,數(shù)據(jù)對象筏餐。它是用來管理網(wǎng)絡(luò)的开泽,能配置能采集,主要用于監(jiān)測魁瞪,它有數(shù)據(jù)建模穆律,將網(wǎng)絡(luò)設(shè)備的一些模塊、特征导俘、狀態(tài)數(shù)據(jù)結(jié)構(gòu)化峦耘。主要是用于網(wǎng)管系統(tǒng)(劃重點,多是監(jiān)控)旅薄。那我們也來說說它的缺點:
可讀性差辅髓。它偏向人機中的“機”,用起來可讀性差少梁,建模數(shù)據(jù)也可讀性低洛口,用的是一個ASN.1的超集。
安全性受限凯沪,有v1 v2c v3三個版本第焰,安全性依次提高,但是目前最通用的是v2c著洼,安全性有限樟遣。v3版本從設(shè)計上很安全而叼,但是普及性身笤。。葵陵。
無備份及恢復(fù)回滾等機制液荸。命令行我們還有show run等方式備份,但snmp脱篙。娇钱。。
極少的寫操作绊困。讀很多文搂,寫很少,多用于監(jiān)控秤朗。
能采集的數(shù)據(jù)項有限煤蹭,無法獲取整臺設(shè)備的配置。很多時候我們發(fā)現(xiàn)能用cli采集出來,但是無法用snmp采集硝皂。
性能有瓶頸常挚,采集數(shù)據(jù)上限64K,采集顆粒度過大稽物,在大型復(fù)雜網(wǎng)絡(luò)中可能是分鐘級或者更久奄毡。這個也劃下重點,我們對于顆粒度的要求也非常嚴格贝或,很多時候希望幾秒鐘采集一次端口流量吼过。大型網(wǎng)絡(luò)中,傳統(tǒng)的網(wǎng)管軟件咪奖,我覺得是...多展開一句那先,現(xiàn)在的方式是Telemetry(比如gRPC)可以實現(xiàn)微秒級,有的需要軟硬件結(jié)合才行赡艰,目前還未普及售淡,但未來一定是趨勢,至于這個未來什么時候來..
SNMP自誕生之日慷垮,極大地被應(yīng)用在了網(wǎng)絡(luò)監(jiān)控領(lǐng)域揖闸,用于獲取數(shù)據(jù)進行監(jiān)控,配置能力的缺失與復(fù)雜導(dǎo)致人們對其在網(wǎng)絡(luò)配置方面使用甚少料身。只有讀的網(wǎng)絡(luò)可編程...
? ? ? ?Netconf協(xié)議與YANG Model
? ? ??
? ? ? 面向下一代網(wǎng)絡(luò)汤纸,我們需要什么樣的網(wǎng)絡(luò)管理協(xié)議去更好地實現(xiàn)網(wǎng)絡(luò)可編程能力,提高自動化的水平芹血?
IETF于2002年在RFC3535提出了以下幾點設(shè)想(實際有33條之多贮泞,結(jié)合網(wǎng)上資料與筆者認知,寫了以下幾條):
1幔烛、有對網(wǎng)絡(luò)配置的可編程接口
2啃擦、同樣的配置可以跨廠商型號
3、需要統(tǒng)一可讀性良好的建模語言
4饿悬、完整的錯誤檢查及恢復(fù)功能
5令蛉、事務(wù)性
? ? ? 有了想法,那就去實現(xiàn)狡恬,在2006年IETF提出了Netconf協(xié)議珠叔,基于RFC3535提出的問題進行了解決。最初的Netconf只規(guī)定了協(xié)議的基本框架和操作弟劲,定義考慮RFC3535的一些問題的解決方法祷安,沒有規(guī)定統(tǒng)一的建模語言,所以早期部分廠商的設(shè)備只是支持Netconf的一些基本操作兔乞,底層沒有使用統(tǒng)一的數(shù)據(jù)建模語言汇鞭。
? ? 在2010年發(fā)布了RFC6020撇眯, 提出了YANG Model建模語言,以及和NETCONF 的結(jié)合方法虱咧。一個定義的是數(shù)據(jù)建模的語言統(tǒng)一各廠商之間的底層資源邏輯熊榛,一個定義的是對配置數(shù)據(jù)、狀態(tài)數(shù)據(jù)的操作統(tǒng)一各廠商的命令集腕巡,YANG模型創(chuàng)建的數(shù)據(jù)實例包裹在Netconf協(xié)議之中傳輸玄坦,二者相互結(jié)合,構(gòu)建了一套新的基于YANG模型的使用Netconf協(xié)議驅(qū)動的新時代的通用網(wǎng)絡(luò)可編程接口绘沉。
? ? ?在2016年之后煎楣,Netconf協(xié)議與YANG Model緊密結(jié)合并流行開來。至此我們再去看一些SDN架構(gòu)軟件層面的時候车伞,多多少少聽到了這兩個名詞择懂。
YANG 與Netconf,一個是靜另玖,一個動困曙,就好比陰陽,二者衍生出了下一個時代的網(wǎng)絡(luò)可編程世界谦去。(當(dāng)我們?nèi)タ磄ithub上慷丽,YANG的倉庫時也會發(fā)現(xiàn),它的圖標是太極鳄哭,包括它名字中與“陽”的關(guān)聯(lián)也多少透露出當(dāng)初設(shè)計者的設(shè)計思想)
? ? ? ?我們接下來就簡單講講YANG Model與Netconf協(xié)議要糊,我們先來講數(shù)據(jù)建模語言YANG,看看它是如何描述這個網(wǎng)絡(luò)世界的數(shù)字孿生妆丘。
?YANG Model
? ? ??
? ? ?在RFC6020的文檔中锄俄,開篇明義,YANG勺拣,A Data Modeling Language for the Network Configuration Protocol奶赠。是Yet Another Next Generation (Yang) Data Modeling Language的縮寫。
支持定義列表宣脉、字典车柠、甚至更復(fù)雜的數(shù)據(jù)結(jié)構(gòu)剔氏,支持約束塑猖、枚舉、引用導(dǎo)入谈跛,版本管理羊苟、命名空間。由于篇幅感憾,我們做簡單講解蜡励,詳細信息大家可以參考:
官方文檔:https://tools.ietf.org/html/rfc6020
互聯(lián)網(wǎng)博文:http://www.reibang.com/p/ca7f5fe11fae
它可以非常簡單的用結(jié)構(gòu)化語言描述出這個網(wǎng)絡(luò)設(shè)備。比如對于一個端口的定義:
作為一個專業(yè)的運維人員,有點網(wǎng)絡(luò)基礎(chǔ)和一點點編程基礎(chǔ)就可比較清晰的了解端口的定義凉倚,它是一個list結(jié)構(gòu)的兼都,可以有多個,它的一個屬性是interface-name(同時是key稽寒,唯一扮碧,不可重復(fù)),還有speed屬性和duplex屬性杏糙,他們都是字符串慎王。
一個網(wǎng)絡(luò)設(shè)備的很多屬性都以YANG Model去描述,包括配置狀態(tài)和運行狀態(tài)宏侍。
就這樣赖淤,YANG Model用結(jié)構(gòu)化語言描述了這個網(wǎng)絡(luò)世界。有興趣額的可以看看上面的那個互聯(lián)網(wǎng)博文谅河,有非常深入的描述咱旱。
它可以很好的轉(zhuǎn)換成XML數(shù)據(jù),包裹在Netconf協(xié)議之中進行傳輸(我們后續(xù)會講解):
同時為了拉平廠商之間的差異绷耍,谷歌牽頭的Openconfig對數(shù)據(jù)模型就行了標準化莽龟,從官網(wǎng)中我們看到這樣一行標語“Vendor-neutral, model-driven network management designed by users”,由用戶設(shè)計的、跨廠商通用的锨天、模型驅(qū)動的網(wǎng)絡(luò)編程(我么先這么翻譯吧)毯盈。簡單點說它是為了讓各廠商之間的建模是相同的,大家再去配置某些數(shù)據(jù)的時候就不用一個個去翻看各廠商的私有的yang model了病袄。但是網(wǎng)絡(luò)總有私有協(xié)議搂赋,不同廠商總會為了“更好的用戶體驗”和“更好的商業(yè)戰(zhàn)略”去創(chuàng)造新的、更牛的私有協(xié)議(這真的是網(wǎng)絡(luò)廠商的原罪耙娌)脑奠。圖中是一些比較常用openconfig的yang model實現(xiàn)。
從圖中來看幅慌,我覺得還是挺多的宋欺,常用的配置比較齊全。但是實際中要看廠商是否也支持這些yang model胰伍。某科的一些高版本的設(shè)備基本都是支持的齿诞。國產(chǎn)的我暫時沒去細看。
網(wǎng)絡(luò)是不可能完全相同的骂租,能做到大同祷杈,對于一個做網(wǎng)絡(luò)運維開發(fā)的工程師來說,已經(jīng)是謝天謝地了渗饮!
openconfig可以在
https://github.com/openconfig/public/tree/master/release/models
查找但汞。私有的yang model 大家可以去各個官網(wǎng)查找宿刮。
Netconf協(xié)議
說完了yang model,我們來聊聊Netconf協(xié)議私蕾,yang model定義了網(wǎng)絡(luò)世界的數(shù)字描述僵缺,Netconf定義了對數(shù)據(jù)的獲取(get)與調(diào)整(config)踩叭。
Netconf對yang model描述的世界的數(shù)據(jù)yang data封裝操作谤饭,實現(xiàn)對網(wǎng)絡(luò)世界的管理。
yang data封裝在xml中懊纳,然后通過Netconf協(xié)議進行管理揉抵。它是一個分層思想很棒的協(xié)議,有層次的描述了這個協(xié)議的一些細節(jié)嗤疯。我們看看上圖冤今。
傳輸:Netconf是通過SSH協(xié)議傳輸,面向連接茂缚,且有安全保障戏罢。
消息:通過RPC進行對網(wǎng)絡(luò)設(shè)備的遠端調(diào)用,網(wǎng)管發(fā)出rpc請求脚囊,網(wǎng)絡(luò)設(shè)備恢復(fù)rpc-reply龟糕。
操作:這是Netconf的靈魂所在,它支持get(配置及運行數(shù)據(jù))悔耘、get-config(獲取配置數(shù)據(jù)讲岁,且一個設(shè)備可以有多個配置數(shù)據(jù),一個running衬以,一個startup缓艳,多個candidate候選)、edit-config(配置網(wǎng)絡(luò)設(shè)備的參數(shù)看峻,支持增刪改)這些常用的阶淘,還有delete-config、copy-config(復(fù)制配置到目的地互妓,目的地可以是ftp溪窒、文件或者是正在running的配置等等)、lock\unlock(對配置進行鎖定冯勉,防止多進程操作導(dǎo)致的配置沖突或者失敗等情況)等等澈蚌。
數(shù)據(jù):data就是xml包裹的yang data,如上圖我們所描述的那個端口一樣珠闰,結(jié)構(gòu)化數(shù)據(jù)易于編程惜浅。用來描述要配置或者刪除或者獲取的數(shù)據(jù)。
這就是Netconf的四個layer伏嗜,控制端與網(wǎng)絡(luò)設(shè)備端通過Netconf溝通坛悉,通過傳統(tǒng)的ssh協(xié)議,用Netconf子系統(tǒng)承绸,默認端口是830裸影。如下圖:
這個圖用原始的ssh演示了交互,但是實際上我們是通過編程去實現(xiàn)這個過程的军熏。編程的實現(xiàn)方式我后續(xù)會演示給大家轩猩。
Netconf配置網(wǎng)絡(luò)設(shè)備,交互過程大致如下:
這個圖荡澎,如此low均践,大家也可以看出來,是我自己畫的... 我對Netconf的理解如上摩幔,網(wǎng)上很多圖彤委,是從網(wǎng)絡(luò)視角去解讀的。我是從開發(fā)者的程序去解讀這個過程或衡。這個是我登錄設(shè)備所直觀感受的焦影,當(dāng)然也和官方文檔是一一對應(yīng)的。
我們可以看看一些Netconf的例子:
hello封断,建鏈斯辰。
我們看到了幾個關(guān)鍵字,Netconf的版本坡疼,支持的YANG Model彬呻,session id。同時hello中表明我們是在什么樣的命名空間下操作柄瑰,此例中是Netconf對應(yīng)版本废岂。
獲取配置
get-cofig有一個參數(shù)是source,即獲取哪里的配置數(shù)據(jù)(running狱意、startup 或者其他)湖苞。還有一個參數(shù)是filter,即在哪個yang model描述的數(shù)據(jù)模型獲取哪個數(shù)據(jù)详囤。這個對應(yīng)的是網(wǎng)絡(luò)設(shè)備當(dāng)初發(fā)送的capability中的财骨。如果成功會回復(fù)對應(yīng)的配置數(shù)據(jù)。
獲取配置或者運行數(shù)據(jù)
類似get-config藏姐,但是獲取的是running配置(個人理解)或者運行數(shù)據(jù)隆箩。可以指定filter羔杨。
復(fù)制配置
復(fù)制操作兩個參數(shù)捌臊,源與目的。成功回復(fù)的是ok標簽兜材。
編輯配置
編輯配置的時候指定編輯的數(shù)據(jù)項理澎,capability的命名空間及對應(yīng)標簽逞力,比如這個是配置dhcp的,它是有http://tail-f.com/ns/example/dhcp這個yang model所描述糠爬。
優(yōu)雅的關(guān)閉session
在ssh里來回傳輸?shù)木褪沁@種報文寇荧,我們只是把報文部分摘出來,方便大家理解执隧。
然后簡單補充一些內(nèi)容揩抡,供參考。
Netconf是基于session的镀琉,每次成功都會有一個session id峦嗤。
每次請求都有message id,只要是逐漸變大即可屋摔。
對數(shù)據(jù)配置可以鎖定烁设,獨占,通過lock操作凡壤。
Netconf是事務(wù)性的署尤,操作要么全部實現(xiàn),要么全部不實現(xiàn)亚侠。同時根據(jù)官網(wǎng)文檔曹体,這個事務(wù)性是針對N臺網(wǎng)絡(luò)設(shè)備的配置,即一次配置多態(tài)都可以支持事務(wù)性硝烂。不過我沒操作過...
Netconf支持訂閱箕别,看設(shè)備性能而言,數(shù)量級大概是5個session左右,我可以訂閱某數(shù)據(jù)項,當(dāng)發(fā)生變化的時候岖瑰,設(shè)備會告知我。
capability母截,我是這樣理解的,網(wǎng)絡(luò)設(shè)備發(fā)送的是Netconf的版本和YANG Model橄教,控制端發(fā)送的是Netconf的版本清寇,二者對的上Netconf版本才能繼續(xù)。這條是我的直觀感受护蝶。歡迎指教华烟。
get edit等操作會指定要改的數(shù)據(jù),用filter可以過濾持灰。
copy-config支持把一個配置全集從某處復(fù)制到某處盔夜,某處可以是FTP File,設(shè)備上的running、startup喂链、candidate配置返十。
Netconf還支持對配置的驗證,使用validate操作衩藤。
? ? 本文還是希望做到科普吧慢,具體細節(jié)不做贅述涛漂,大家可以去看看RFC的相關(guān)協(xié)議赏表,其實不是很長。
? ? ? 在實際中基于一些開源的軟件匈仗,比如python的ncclient瓢剿,我們可以非常方便的對網(wǎng)絡(luò)設(shè)備進行自動化配置,實現(xiàn)網(wǎng)絡(luò)可編程悠轩。這就是Netconf與YANG Model的使命所在间狂。
? ? ? 網(wǎng)絡(luò)人員閱讀格式良好的YANG Model定義,基于Netconf定義的操作火架,使用相關(guān)的編程語言對網(wǎng)絡(luò)設(shè)備進行可編程操作鉴象。通過這種方式鑄就網(wǎng)絡(luò)可編程的道路。
? ? ? 我們再去擴展的想象一下何鸡,YANG Model已經(jīng)定義了網(wǎng)絡(luò)設(shè)備的數(shù)據(jù)結(jié)構(gòu)纺弊,我們可以通過Netconf去操作,那是不是也可以通過其他協(xié)議去操作呢骡男?
答案是肯定的淆游,實際上后續(xù)也從Netconf衍生出了很多其他的協(xié)議,比如RESTConf隔盛。如下圖犹菱,
YANG Model(public與native)定義了數(shù)據(jù)結(jié)構(gòu),之上是新的網(wǎng)管協(xié)議吮炕,Netconf腊脱、RESTCon、gRPC等等龙亲。這樣我們可以通過基于HTTP RESTful API的RESTConf對網(wǎng)絡(luò)設(shè)備操作陕凹,也可以通過基于SSH的Netconf對網(wǎng)絡(luò)設(shè)備操作,也可以通過基于HTTP2.0的gRPC對網(wǎng)絡(luò)設(shè)備操作俱笛,他們都是基于數(shù)據(jù)結(jié)構(gòu)良好的YANG Model捆姜,編寫對應(yīng)的data,封裝到xml或者json當(dāng)中對網(wǎng)絡(luò)設(shè)備編程迎膜,這就是未來的網(wǎng)絡(luò)可編程之路泥技,準確點說,是Model Driven Program磕仅,基于模型的網(wǎng)絡(luò)可編程珊豹。網(wǎng)工逐步的關(guān)注于設(shè)備的參數(shù)簸呈,而不是命令集,通過閱讀對應(yīng)的數(shù)據(jù)模型店茶,對網(wǎng)絡(luò)進行參數(shù)配置蜕便。
寫在最后,我為什么要開這個公眾號贩幻。本人上學(xué)期間學(xué)的是計算機科學(xué)與技術(shù)轿腺,步入職場后,進行的是網(wǎng)絡(luò)運維工作丛楚,想想分團隊原因可能是我研究生是網(wǎng)絡(luò)技術(shù)研究院導(dǎo)致的(手動滑稽)族壳,從最開始的網(wǎng)絡(luò)運維到后期通過工具基于CLI去簡化工作,提高效率趣些,后逐步將工具開發(fā)成BS架構(gòu)的web應(yīng)用仿荆,不斷接觸新技術(shù),后續(xù)不斷豐富新功能坏平,有幸趕上了開源技術(shù)與SDN的發(fā)展拢操,逐步轉(zhuǎn)型做了NetDevOps方面的工作,用自己的編程能力為團隊提高運維能力舶替,自己也樂于這一行行代碼的編寫中令境。隨著編寫的不斷深入,逐步發(fā)現(xiàn)坎穿,NetDevOps應(yīng)該是一個未來每個網(wǎng)工應(yīng)該具備的技能(眾人拾柴火焰高)展父,這樣才能即高屋建瓴又可快速實現(xiàn)。反觀網(wǎng)絡(luò)上的一些資料玲昧,說實話國內(nèi)非常少栖茉,國內(nèi)的氛圍也不是很強,國內(nèi)的很多軟件都是基于老的CLI后者snmp孵延,大家工作還是在用文本工具和SSH工具吕漂。于是希望自己能夠授人以漁,將自己的經(jīng)驗(坑)和技能分享給更多的網(wǎng)絡(luò)運維工程師尘应,盡自己的一點綿薄之力惶凝。小處說,你能學(xué)點東西減少自己的工作量犬钢,著眼遠處苍鲜,國內(nèi)的網(wǎng)絡(luò)運維能真正向自動化方向演進。
后續(xù)會錄一些視頻和編寫一些文章玷犹,寫一個文檔混滔,感覺真費勁,歡迎訂閱收藏點擊喜歡在看之類的。
附錄:
Netconf常見的operation