網絡虛擬化(Network Virtualization)對于很多網絡工程師尤其是剛入行的新手常常有一種懵懵懂懂,不甚了然的神秘感覺,雖然常常為之想入非非,最終還是似是而非。在這篇BLOG里面,除了舉例,不涉及具體的技術和實現,盡量展現網絡虛擬化背后的最基本的原理(Rationale)和思想(Idea)。可能很多人都發現,理解網絡技術和協議背后的原理和思想比具體配置操作這些技術和協議更重要,這就是說,知其然當然很好,但更好的是知其所以然。毫無疑問,這一原則同樣地適用于其他計算機科學領域。
虛擬網絡也是網絡
一般地,一個虛擬網絡是在物理網絡或在其他虛擬網絡之上,用軟件的方法構造出的邏輯網絡(Logic Network),以實現用戶定義的網絡拓撲(Networking Topology)并滿足用戶特定的需求。主要應用的場景是多租戶云計算數據中心,在下文中,我們還要展開討論。上面的定義其實沒有真正揭示虛擬網絡的內涵,實際上,虛擬網絡也是網絡,如果從網絡是什么這個簡單得常常被忽略的問題出發,來探討虛擬網絡的具體內涵,似乎更容易抓住這一概念的本質。我們可以從靜態和動態兩個角度來審視網絡:
從靜態的角度來看,網絡可表示為數據結構中的圖(Graph),網絡的節點(如交換機和路由器,一些文獻把他們統稱為Datapath)是為圖的頂點(Vertex),而鏈接(Link)就是圖的邊(Edge),這就是網絡的拓撲視圖。對于每一個網絡節點,其數據(Data Traffic)轉發行為由一系列的查詢表(Lookup Table)如二層MAC表(L2 MAC Table)、三層路由表(L3 FIB Table),ACL(Access Control Lists)表來定義。當從某個端口收到一個數據報文(Packet)或數據幀(Frame)時,轉發引擎(Forwarding Engine)通過解析,查表,應用策略(如 QoS),最后,將報文或幀從另一個端口轉出。這里只是給出非常粗略的描述,實際的情況要復雜很多,其實這也就是我們平常所說的網絡的數據平面(Data Plane),對應于物理交換機的交換芯片的轉發引擎的功能。當然,也可以看做SDN模式下,由Controller控制的數據轉發設備(如OpenFlow交換機)。
從動態的角度來看,網絡把數據流(Data Traffic)從一個和網絡連接的主機(Host)送到另一個和網絡連接的主機,這里,主機可以是物理服務器,也可以是虛擬計算機(Virtual Machine)。為此,事先要有一個定義好的地址空間,每個主機和網絡節點都被分配(動態的或靜態的)一個唯一標識自己的地址,如IP地址。這樣,根據地址就能夠識別出每個主機在網絡中的位置,即接入網絡的入口節點。兩個主機要交換數據,首先要計算出他們之間的數據流的通路,上文把網絡比作數據結構的圖,這里的通路當然相當于圖中的路徑(Path)了,可表示為一個向量,其中的每個元素代表一個網絡節點/頂點,兩個相鄰的網絡節點/頂點之間有鏈路/邊相連接,向量的頭元素和尾元素分別與通信的主機相連。數據流透過這一通路,經過中間網絡節點的中轉,就從源主機到達目的主機。幾乎所有的L3路由協議,無論是距離矢量(distance-vector)路由協議如BGP還是鏈路狀態(link-state)路由協議如OSPF,顧名思義,都有一個簡單的目標,就是計算并生成主機或子網之間的路由,即通路,并最終將具體的Route Entries安裝到網絡節點的FIB中。本質上,L2的網絡也有自己的機制來計算通路,轉發數據,如Ethernet交換機通過MAC地址學習(MAC Learning)來獲取數據幀的Egress端口,從而將數據流轉發到目的主機。上述的這一動態過程是由網絡的控制平面(Control Plane)來管理的,網絡操作員(Network Operator)通過控制平面配置L2/L3的路由和轉發協議,達到數據在主機之間交換的目的。對應于交換機,控制平面就是運行在CPU之上的操作系統;而對于SDN的模式來說,控制平面是由Controller及上面的應用來實現的。更通俗地講,在兩個主機交換數據之前,網絡的控制平面需要回答三個問題:第一,你是誰?(目的主機的地址是什么?);第二,你在哪里?(目的主機和網絡的哪個節點連接?);第三,如何找到你?(到達目的主機的通路如何建立?)。
簡單總結一下,網絡有兩部分構成:第一,由網絡節點(datapath)作為頂點和網絡鏈接作為邊構成的靜態的拓撲圖;第二,由各種網絡協議構成的動態的數據流路由轉發機制。若是忘掉那些枯燥繁雜的各式各樣的系統、設備、協議的配置細節,網絡其實就是這點事兒,看起來并不復雜。虛擬網絡作為邏輯意義上的網絡,具備網絡的所有組成要素,包括網絡拓撲,如網絡節點、鏈接、網絡節點中的查詢表等,相對于物理網絡,這些只不過是虛擬的,邏輯的,軟件實現的。同樣地,虛擬網絡也可以是L2網絡或L3網絡,分別使用不同的控制平面管理,因此也是可配置的。
文獻1在討論SDN(Software Defined Networking)編程語言Pyretic的拓撲抽象(Topology Abstraction)時,使用了一種叫做Network Object的機制,實際上就是給編程用戶提供了一個虛擬網絡。上圖是Network Object的一個多對一(many-to-one)的示例,對于用戶而言,可見的(Visible)是上面的一個虛擬交換機連接三個主機的虛擬網絡,而不是下面的由三個交換機組成的物理網絡。這一虛擬網絡對于實現某些應用提供了極大的方便,假設給定一個SDN的Controller,使用OpenFlow實現一個類似L2網絡的MAC-Learning模塊時,開發者就只需面對單獨的一個虛擬交換機,而不必考慮物理網絡的復雜的拓撲結構,也無須考慮如何用spanning tree來避免循環回路的細枝末節,從而只要把相關的Flow Entries安裝在這一個假設支持OpenFlow的虛擬交換機上,何等簡單快捷。而對于虛擬交換機到物理交換機的映射,則由Pyretic的runtime系統來完成,它還要把用戶安裝到虛擬交換機上面的Flow Entries轉換成各個物理交換機的Flow Entries并安裝到物理交換機上。具體的細節可閱讀文獻1。
實際上,虛擬網絡也并不是什么新概念。目前廣泛使用的VLAN技術就是把一個物理的L2網絡變身為多個邏輯的虛擬L2網絡,與此同時,也把一個廣播域(broadcast domain)分隔成多個廣播域。而VRF(VPN Routing/Forwarding)之于L3就如同VLAN之于L2,VRF可以使一個物理路由器(Router)擁有多個FIB,從而把單一的路由器分隔成多個“虛擬”的路由器,以支持不同的VPN實例(Instance)。這是兩個一對多(one-to-many)的虛擬網絡的例子。
虛擬網絡所為何事
虛擬網絡的興起不是偶然的,這要從云計算說起。云應用模式下,存在著多個云資源的租賃者(Tenant),所有的租戶共享云服務商的物理基礎設施,包括服務器,存儲,網絡,這就形成了多租戶模式(Muti-Tenancy)。這種方式特別地受到資金并不富裕的互聯網創業公式的青睞。租戶希望云服務商提供的網絡作為自身企業網絡自然的延伸和擴展,所謂“自然”就是不需要改變自身網絡配置的情況下和云服務商提供的網絡資源無縫的集成在一起。與此同時,也能夠把自身企業網絡承載的應用和服務自然地遷移部署到云服務商的網絡上。對云服務商的數據中心來說,傳統的L2/L3的網絡技術很難適應這個難度很高的技術挑戰,必須改變已有的網絡管理的模式和向租戶提供網絡資源(provision)的方式。
租戶希望快速的把自己的應用部署到云服務商提供的網絡、計算和存儲的資源,而且這些資源要具有高度的可擴展性和可伸縮性。比如某租戶在云端的數據中心部署一個典型的Web應用,一般地,Web應用有表示層(Presentation Tier)、業務層(Business Tier)和數據層(Data Storage Tier)構成,各層之間相互隔離,由復雜的網絡連接完成數據交換,如下圖所示。聯通這些服務器或虛擬機,需要網絡管理員一個設備一個設備的配置,這是極其瑣碎且很容易出錯的工作,需要耗費很長的時間反復調試。另外,這樣的Web應用對計算和存儲資源的需求是可擴展的和可伸縮的,意味著連接這些計算和存儲資源的網絡拓撲也要隨之變大變小,無疑更加重了配置的工作。更加不幸的是,云服務提供商的數據中心要承載成千上萬的倏興倏滅的不同租戶的應用,這些應用對部署的時間往往有苛刻的要求。并且,出于安全的考慮,不同應用之間的網絡還要實施嚴格的隔離,不允許有數據交換。所以必須以更加高效的靈活的可靠的方式向租戶的應用提供動態變化的網絡服務。
一方面,租戶能夠快速的獲取虛擬的計算和存儲資源,另一方面,卻需要較長時間等待網絡資源配置的完成。面對云模式下新的應用需求,網絡陷入了疲于奔命的尷尬的窘境,等待著虛擬化的救贖。計算存儲資源的虛擬化通過hypervisor的技術已趨成熟,云計算虛擬化的最后一里路就是網絡的虛擬化。這意味著,云服務商給租戶的網絡是虛擬網絡,盡管使用相同的底層物理網絡的基礎設施,每個租戶得到的虛擬網絡(包括控制平面和數據平面)卻是相互獨立的,完全隔離的,通過云服務商提供的控制平面,租戶可任意的配置管理自己的虛擬網絡。更為重要的是,在軟件的幫助下,虛擬網絡可以很快地交付給租戶。加上虛擬的計算和存儲資源,每個租戶的虛擬資源形成一個完整的VPC(Virtual Private Cloud)。虛擬網絡隔離的特性使得每個虛擬網絡可以使用重疊的甚至相同的地址空間,而不必擔心相互干擾。如兩個L3的虛擬網絡都可以使用10.0.0.0/8作為自己的地址空間,一個L2的虛擬網絡不可能看到或學到另外一個L2虛擬網絡的設備的MAC地址,更不可能通過L2協議交換數據。對于混合云(Hybrid Cloud)的租戶,這是極大的方便,因為云端的虛擬網絡可以使用租戶自身網絡的地址空間,而不用考慮這一地址空間是如何定義的。
如果我們把這種計算、存儲和網絡資源的租賃模式看做云,那么,正是虛擬技術把計算的云裝扮成云卷云舒的曼妙世界。
Overlay助力虛擬網絡
從現有的產品和解決方案來看,虛擬網絡大多是借助于Overlay的技術實現的,如VMware的NSX。Overlay網絡也是一個網絡,不過是建立在Unerlay網絡之上的網絡。Overlay網絡的節點通過虛擬的或邏輯的鏈接進行通信,每一個虛擬的或邏輯的鏈接對應于Underlay網絡的一條路徑(Path),由多個前后銜接的鏈接組成。需要注意的是,Overlay網絡和Underlay網絡是相互獨立的,Overlay網絡使用Underlay網絡點對點(peer-to-peer)的傳遞報文,而報文如何傳遞到Overlay網絡的目的節點完全取決于Underlay網絡的控制平面和數據平面,報文在Overlay網絡Ingress和Egress節點的處理(如拋棄,轉發)則完全由Overlay網絡的封裝協議來決定。Overlay/Underlay既不新鮮,也不神秘,比如在TCP/IP的Layer模型中,L3的IP網絡可以看做L2的Ethernet網絡的Overlay網絡,而L2的Ehernet網絡就是L3的IP網絡的Underlay網絡。
由此不難看出,在向租戶提供虛擬資源租賃服務時,每個租戶的虛擬網絡就實現為以云服務商數據中心IP網絡為Underlay網絡的Overlay網絡。上圖給出了云服務數據中心虛擬網絡功能模塊的簡單示意圖,省略了許多細節。假設每個物理服務器中裝有多個不同租戶的虛擬機,如Tenant A,Tenant B和Tenant C,圖中分別以不同的顏色來標識。租戶的虛擬機通過物理的或邏輯的鏈接接入IP網絡(即Underlay網絡)的虛擬邊緣設備(NVE, Network Virtualization Edge)。NVE是實現虛擬網絡的關鍵模塊,它可以實現為Hypevisor的虛擬交換機的功能,也可以在物理交換機或路由器中實現。對于一個給定租戶的虛擬網絡,NVE幫助建立終端節點到終端節點的邏輯鏈接,即隧道。要完成這一任務,在每個NVE中維護一個可達信息(Reachability Information)的MAP表,結合我們的例子,其內容如下。根據實現技術和隧道封裝協議的不同,可達信息的內容和形式也會大相徑庭,這里只是為了說明的方便,給出一個簡化的版本。在表中,Address指的是NVE的地址,VNID(Virtual Network Identifier)是虛擬機VM所屬的虛擬網絡的全局唯一ID,每個租戶可以有一個或多個虛擬網絡,VAP(Virtual Access Point)是VM接入NVE的虛擬接口,NVE可用它來判斷報文來之哪個VM。假設Tenant A的虛擬機VM_A1向VM_A2發送一個報文,NVE 1得到這個報文后,就可以進行隧道封裝,具體如何封裝由隧道的封裝協議來定義,一般地,封裝之后,外層的封裝協議的協議頭中必定包括如下信息:虛擬網絡的ID,源IP地址和目的IP地址,外層的源IP地址就是NVE 1(Ingress)的IP地址,外層的目的IP地址就是NVE 2(Egress)的IP地址。這些封裝信息都可以從關鍵的可達信息MAP表中獲取。封裝后的報文就可以作為普通的IP報文在Underlay的IP網絡中從一個NVE傳遞到另一個NVE。NVE 2收到報文后,解封裝,根據VNID及報文本身的地址信息,將報文轉給VM_A2。
NVE是如何獲取可達信息MAP表的呢?這由虛擬網絡或Overlay網絡的控制平面完成,有兩種方法:第一種方式可稱為分布式的方法,NVE首先得到和其直接相關的可達信息,即直連的VM和VM的VNID,然后NVE之間直接對話,相互交換可達信息,VM和NVE之間以及NVE和NVE之間要有定義好的標準的對話協議,這和傳統的路由協議的原理完全一樣,其缺點是需要就這些對話協議單獨配置每個NVE;第二種方式是集中式的方法,也就是SDN的方法,SDN的三個顯著特征就是數據平面與管理平面隔離,集中式管理和可編程,因此,可達信息可通過類似于OpenStack的Orchestration系統配置計算和存儲資源時自動生成,再由控制器(Controller)中轉到每個參與的NVE,這是一個自動配置的過程(Automatic Configuration),可快速向租戶交互云端的網絡虛擬資源。SDN的方法的最大優點就是一個字,快!因此,這會是云計算數據中心部署SDN解決方案的最大動力。可達信息MAP表還是支持VM動態遷移的秘密所在,一個VM無論遷移到哪個物理服務器上,只要通過上述兩種方式使得每個NVE的可達信息MAP表及時更新,就能夠保持該VM與外界的正常通信。
VXLAN:看個例子吧
目前,數據中心實現虛擬網絡最為看好的封裝協議就是VXLAN,背后有Cisco和VMware的支持。VXLAN是以IP網絡作為Underlay網絡,向租戶提供L2的虛擬網絡,當然也是Overlay網絡。VXLAN把租戶的Ethernet數據幀(Frame)封裝到UDP報文中,如下圖(來自文獻6)。然后,在Underlay的IP網絡中通過隧道從一個VTEP(VXLAN Tunnel End Point)傳遞到另一個VTEP,不難理解,VTEP相當于上文中的NVE,而VXLAN ID就相當于上文的VNID,VXLAN ID有24位的編碼空間,大大超過VLAN的12位編碼空間。
VXLAN的可達信息MAP表有兩個表:VTEP L2 Table和VLAN to VXLAN ID MAP, 如下圖所示(來自文獻6)。Ingress VTEP封裝時,從VLAN ID查詢到VXLAN ID,然后根據MAC和VXLAN ID得到遠端的Egress VTEP的IP地址;Egress VTEP解封裝時,其過程與之相反。
文獻6和文獻7是非常好的有關VXLAN的技術文檔,有興趣了解VXLAN更多細節的朋友可參考這兩篇文檔。其他類似的協議還有STT(Stateless Transport Tunneling)和NVGRE,請參考文獻8。
參考文獻
1. Composing Software-Defined Networks.
2. Network Virtualization in Multi-tenant Datacenters.
3. Cloud computing.
4. Framework for Data Center (DC) Network Virtualization.
5. Problem Statement: Overlays for Network Virtualization.
6. VXLAN Deep Dive.
7. VXLAN Deep Dive – Part II.
8. Tunneling for Network Virtualization.