從逐台機器打字,到描述整個網路
退一步,回想這一級的弧線。你把控制平面(做決策的大腦)與資料平面(只負責轉送封包的快速肌肉)分了開來,接著把那個大腦集中到一支擁有全網視野、可程式化的控制器裡。你看見控制器透過像 OpenFlow 這樣的南向介面把規則往下推,填滿每台交換器的比對—動作表,使一個封包靠比對其標頭欄位、再執行動作來被處理。現在問個實際的問題:如果一支握有全網地圖的程式能決定一切,為什麼人類還在用手逐台登入交換器去設定它?
舊方法對任何管過網路的人都熟悉得令人心痛:打開終端機、登入一台路由器、用那家廠商特有的方言敲入一行行設定、存檔,然後到下一台、再下一台、再下一台重複。它很慢、撐不到數千台裝置的規模,而且錯得殘酷——凌晨兩點在某一台機器上打錯一個子網,就可能讓一項服務癱瘓。SDN 的承諾從來不只是為了集中而集中大腦;而是一旦大腦成了程式,你就能停止逐台敲打機器,改成用程式碼描述「你想要整個網路做什麼」,再讓軟體去讓每台機器服從。
NETCONF 與 YANG:一套乾淨地與裝置對話的方式
在你能把設定自動化之前,你需要一個讓程式去讀取與更改裝置設定的合理方式——而那個為人類敲打而設計的舊命令列介面,是個糟糕透頂的 API。敲入一條給人看的指令,你會收回一段給人看的文字:讀起來漂亮,要可靠地解析卻苦不堪言。網路自動化的第一塊拼圖,就是用一個真正的機器介面取代它。NETCONF 是一種協定,讓程式透過一條安全通道連上裝置,把它的設定當成結構化資料來取得、編輯與替換,並具備真正的交易特性——一次改好幾樣東西,要嘛全部提交、要嘛全都不提交,於是你永遠不會留下一台設定到一半的機器。
但一個用來搬運設定的協定只是答案的一半;你還需要一個對設定形狀的共同約定,好讓程式知道有哪些欄位存在、哪些值合法。那就是 YANG,一種建模語言,把裝置的設定描述成一棵帶型別的樹——介面有名稱與 IP 位址、位址是某種已知格式的字串、VLAN 編號是落在固定範圍內的數字。把 YANG 想成綱要(schema)、NETCONF 想成快遞:YANG 精確地說出「一份有效的設定長什麼樣」,NETCONF 則把那份結構化的設定送進、送出機器。兩者合起來,就把「設定路由器」從自由格式的打字,變成一個經過驗證、可程式化的資料操作。
基礎設施即程式碼:放進 Git 倉庫裡的網路
一旦裝置會說一套乾淨的機器介面,一個更深的轉變就成為可能:把整個網路「應有的設定」當成檔案,保存在版本控制倉庫裡,就像軟體團隊保存他們的程式碼那樣。這就是基礎設施即程式碼。你不再登入去改一台交換器;你編輯一個說明「這台交換器該是什麼樣」的文字檔,提交它,再讓工具把每台裝置調和到與之相符。設定成為唯一的真相來源,像任何程式碼變更一樣被審查、被合併。
回報既巨大又具體。因為網路的狀態現在是 Git 裡的一個檔案,每一次變更都有作者、時間戳與理由;你能在變更上線前審查它,就像審查程式碼那樣;當凌晨兩點有東西壞掉時,你能用一次回退(revert),把設定還原到昨天那份管用的、一模一樣的設定。你能用同一批檔案拉起一個一模一樣的測試網路,也能用一個小範本描述一千台交換器,而不必手動編輯一千次。這正是基礎設施即程式碼當年為伺服器與雲端所做的同一步棋,如今套用到網路上——而它之所以可能,純粹因為裝置底下終於有了一個可程式化的介面。
再往上爬一級,你就抵達意圖導向網路:你不再書寫底層規則,而是陳述目標——「這兩項服務可以對話、那一項被隔離、這個流量類別享有優先權」——再由軟體把你的意圖編譯成達成它所需的每台裝置設定與流規則。控制器的全網視野,正是讓這件事變得務實的關鍵:唯有一個看得見整個拓樸的大腦,才能把一個高階的願望,翻譯成每台機器上一致的低階行為,並持續查核現實是否仍與意圖相符。
白盒交換器:便宜的硬體,自選的軟體
還有一塊拼圖,讓這一切在規模上負擔得起。數十年來,一台網路交換器是一個密封的家電:同一家廠商把硬體與軟體鎖在一起賣給你,而你只能跑他們的作業系統,因為你別無選擇。控制平面/資料平面的拆分改變了經濟結構。如果大腦可以住在任何地方、機器只需要快速轉送封包,那麼這台機器就可以是樸素、通用的硬體。一台白盒交換器正是如此——圍繞一顆標準交換晶片打造的裸轉送硬體,你在上面安裝你喜歡的任何網路作業系統,往往是開源的。
把這些線索收攏起來,現代的圖像就浮現了。資料平面是便宜的白盒硬體,跑著一條快速的轉送管線(有時是你用上一篇的 P4 自己定義的那一條)。控制平面是你選擇的軟體,可能是一個中央控制器。通往每台機器的介面是 NETCONF 與 YANG,或是 OpenFlow,而非某家廠商的私有命令列。而整個網路的期望狀態,以程式碼的形式住在一個倉庫裡,像任何軟體一樣被部署、被回退。這就是完整的 SDN 與自動化願景:網路是一個可程式化的系統,而非一櫃手工微調、被廠商鎖死的機器。
那個陷阱:當大腦在一處時,你交換掉了什麼
現在來到誠實的部分,因為每一個強大的觀念都要付出代價。你一直在歌頌的彈性與全網能見度,來自集中大腦——而集中大腦製造出一個點,整個網路如今都仰賴它。如果控制器當機、過載,或與交換器之間被切斷,你就遇上一個舊設計從來沒有過的問題:每台機器的決策能力,突然失去了它的決策者。控制器成了一個潛在的瓶頸與單點故障,而這正是整個這一級的核心取捨。
誠實的答案是:好的 SDN 設計正面迎擊這個問題,而非假裝它不存在。控制器以「邏輯上集中、實體上分散」的叢集來運行,於是單一台機器的故障不會把大腦弄垮。交換器被賦予足夠的自主權,即使在控制器一時聯絡不上時,也能繼續轉送既有的流,於是一次控制平面的中斷,不會立刻變成一次資料平面的中斷。容量的規劃要讓控制器不致被建流請求淹沒。這一切都不是免費的——你把舊世界那套分散、自癒的路由,換成了一個更強大、更有彈性,卻必須被謹慎設計、好讓它的中心不致成為它的弱點的集中模型。
帳本的另一邊還有第二個、較安靜的好處,緩和了這筆交易:因為流量穿過一個向中央大腦回報的可程式化資料平面,你便得到舊那套逐台機器的世界根本無法提供的全網能見度。一個中央視野能一次看見整個流量矩陣、發現一個熱點,並在軟體中繞過它重新路由——這種診斷與反應,要是靠人逐台機器登入,得花上好幾天。所以這筆交易在兩邊都是真實的:你接受一個必須對抗故障而設計的集中式依賴,作為交換,你獲得分散的舊世界永遠給不了你的能見度與可程式性。