在ZStack的網(wǎng)絡(luò)模型中,OSI第4~7層網(wǎng)絡(luò)服務(wù)被實現(xiàn)為來自不同服務(wù)提供模塊的小插件。默認(rèn)提供模塊,稱為虛擬路由,采用定制的Linux虛擬機作為虛擬設(shè)備,為每一個L3網(wǎng)絡(luò)提供包括DHCP、DNS、NAT、EIP和端口轉(zhuǎn)發(fā)在內(nèi)的網(wǎng)絡(luò)服務(wù)。使用虛擬機作為虛擬路由器的方式的優(yōu)點有:沒有單點故障、對物理設(shè)備沒有特殊要求,因此用戶無需購買昂貴的硬件,就可以在商用設(shè)備上實現(xiàn)各種網(wǎng)絡(luò)服務(wù)。
概述
正如“ZStack--網(wǎng)絡(luò)模型1:L2和L3網(wǎng)絡(luò)”中提到的,ZStack以小插件的方式設(shè)計網(wǎng)絡(luò)服務(wù),供應(yīng)商可以通過創(chuàng)建網(wǎng)絡(luò)服務(wù)提供模塊的方式,選擇性地實現(xiàn)他們的硬件或軟件支持的網(wǎng)絡(luò)服務(wù)。默認(rèn)情況下,ZStack帶有一個虛擬路由,它負(fù)責(zé)使用一個應(yīng)用虛擬機(Virtual Router VM)實現(xiàn)所有網(wǎng)絡(luò)服務(wù)。
注:事實上ZStack有另一個提供模塊稱為安全組提供模塊,它提供了分布式防火墻功能。我們稱虛擬路由為默認(rèn)的提供模塊,因為它提供了最常見的,一個云需要的網(wǎng)絡(luò)服務(wù)。
在IaaS軟件中,實現(xiàn)網(wǎng)絡(luò)服務(wù)有幾種方法
- 一種方式是使用中心的、功能強大的網(wǎng)絡(luò)節(jié)點,它們通常是一些物理服務(wù)器;通過聚集來自不同租戶的流量,網(wǎng)絡(luò)節(jié)點將負(fù)責(zé)流量隔離并使用類似Linux網(wǎng)絡(luò)命名空間的技術(shù)來提供網(wǎng)絡(luò)服務(wù)。
- 另一種方法是使用專用的網(wǎng)絡(luò)硬件,例如,可編程的物理交換機、物理防火墻、物理負(fù)載平衡器,它會要求用戶去購買特定的硬件。
- 最后一個方法是使用網(wǎng)絡(luò)功能虛擬化(NFV)技術(shù),像ZStack的虛擬路由虛擬機,就是在商用x86服務(wù)器上虛擬化網(wǎng)絡(luò)服務(wù)。
每種方法都有優(yōu)點和缺點;我們選擇NFV作為我們的解決方案是出于如下考慮:
- 需要最少的基礎(chǔ)設(shè)施:解決方案應(yīng)該對用戶的物理基礎(chǔ)設(shè)施需求很少甚至為零;也就是說,用戶不應(yīng)該改變現(xiàn)有的基礎(chǔ)設(shè)施或購買特殊的基礎(chǔ)設(shè)施來迎合IaaS軟件的網(wǎng)絡(luò)模型。我們不想強迫用戶購買特定的硬件或要求他們在一組主機前放置一些特殊的功能服務(wù)器。
- 沒有單點故障:解決方案應(yīng)該是采用沒有單點故障的分布式的方式。一個網(wǎng)絡(luò)節(jié)點崩潰應(yīng)該只能影響擁有它的租戶,不應(yīng)該影響任何其他租戶。
- 無狀態(tài):網(wǎng)絡(luò)節(jié)點應(yīng)該是無狀態(tài)的,這樣IaaS軟件在發(fā)生無法預(yù)料的錯誤后,可以輕易摧毀并重新創(chuàng)建它們。
- 利于高可用性(HA):解決方案應(yīng)該易于實現(xiàn)高可用,這樣租戶可以要求部署富余的網(wǎng)絡(luò)節(jié)點。
- 不依賴虛擬機管理程序:解決方案不應(yīng)該依賴于Hypervisor,并且應(yīng)該和主流的Hypervisor完美結(jié)合工作,包括KVM、XEN、VMWare和Hyper-V。
- 較好的性能:解決方案應(yīng)該為大多數(shù)使用場景提供合理的網(wǎng)絡(luò)性能。
基于虛擬路由的NFV解決方案滿足上述所有考慮。我們選擇它作為默認(rèn)的實現(xiàn),同時也為開發(fā)人員提供了采用其他解決方案的可能。
虛擬路由
應(yīng)用虛擬機(Appliance VMs)是一種特別的虛擬機,運行著定制的Linux操作系統(tǒng),以及特別的幫助管理云的agents。虛擬路由虛擬機是應(yīng)用虛擬機概念的第一個實現(xiàn)。這個想法,簡單的說,在用戶虛擬機第一次被創(chuàng)建的時候,去創(chuàng)建一個為某個L3網(wǎng)絡(luò)提供全部網(wǎng)絡(luò)服務(wù)的虛擬路由虛擬機,只要這個L3網(wǎng)絡(luò)上開啟了虛擬路由提供的網(wǎng)絡(luò)服務(wù)。每個虛擬路由虛擬機包含一個Python agent,它通過HTTP協(xié)議接收來自ZStack管理節(jié)點的命令,并在同一L3網(wǎng)絡(luò)給用戶虛擬機提供包括DHCP、DNS、NAT、EIP和端口轉(zhuǎn)發(fā)的網(wǎng)絡(luò)服務(wù)。

上圖,顯示了在客戶L3網(wǎng)絡(luò)上啟用了所有網(wǎng)絡(luò)服務(wù)的網(wǎng)絡(luò)拓?fù)浣Y(jié)構(gòu)。一個虛擬路由通常有三種L3網(wǎng)絡(luò):
- 一個L3管理網(wǎng)絡(luò)指的是ZStack管理節(jié)點和在虛擬路由虛擬機內(nèi)的Python agent通過HTTP協(xié)議進(jìn)行通信的網(wǎng)絡(luò),是一個必須的網(wǎng)絡(luò),每個虛擬路由都有。
- 一個公有L3網(wǎng)絡(luò)是一個可以連接互聯(lián)網(wǎng)的可選網(wǎng)絡(luò),它在虛擬路由虛擬機內(nèi)提供了默認(rèn)的路由。如果省略,L3管理網(wǎng)絡(luò)將同時被作為管理網(wǎng)絡(luò)和公有網(wǎng)絡(luò)使用。
公有網(wǎng)絡(luò)不需要允許公開訪問:把用戶虛擬機和外部世界(數(shù)據(jù)中心的其他網(wǎng)絡(luò)或互聯(lián)網(wǎng))相連的公有網(wǎng)絡(luò)不需要允許公開訪問。例如,當(dāng)橋接被VLAN和數(shù)據(jù)中心的其他網(wǎng)絡(luò)(10.x.x.x/x)隔離的客戶L3網(wǎng)絡(luò)(192.168.1.0 / 24)時,網(wǎng)絡(luò)10.0.1.0/24可以是一個公有網(wǎng)絡(luò),即使它不能被互聯(lián)網(wǎng)訪問。
- 一個客戶L3網(wǎng)絡(luò)是用戶虛擬機連接的網(wǎng)絡(luò);和網(wǎng)絡(luò)服務(wù)相關(guān)的流量在用戶虛擬機和虛擬路由虛擬機內(nèi)流動。
對不同的網(wǎng)絡(luò)服務(wù)組合,L3網(wǎng)絡(luò)數(shù)量是可變的。例如,如果DHCP和DNS被啟用,網(wǎng)絡(luò)的拓?fù)浣Y(jié)構(gòu)變?yōu)椋?/li>

因為沒有NAT相關(guān)的服務(wù)(例如SNAT,EIP),用戶的虛擬機不需要一個單獨的、隔離的客戶L3網(wǎng)絡(luò),但可以直接連接到公共網(wǎng)絡(luò)。
注意:當(dāng)然,你可以創(chuàng)建一個只有DHCP和DNS服務(wù)的、隔離的客戶L3網(wǎng)絡(luò),該網(wǎng)絡(luò)上的虛擬機可以獲得IP,但不能訪問外部網(wǎng)絡(luò),因為缺失了SNAT服務(wù)。
如果我們省略了上圖中的L3公有網(wǎng)絡(luò),那么網(wǎng)絡(luò)拓?fù)鋵⒆兂桑?/p>

用戶可以使用一個虛擬路由計算規(guī)格來配置一個虛擬路由虛擬機的L3管理網(wǎng)絡(luò)、L3公有網(wǎng)絡(luò)、CPU速度、以及內(nèi)存大小。當(dāng)創(chuàng)建一個虛擬路由虛擬機的時候,ZStack將會嘗試去找到一個合適的虛擬路由計算規(guī)格。一個系統(tǒng)標(biāo)簽guestL3Network::{l3NetworkUuid},
可以被用于為一個L3客戶網(wǎng)絡(luò)指定一個虛擬路由計算規(guī)格,如果沒有指定的規(guī)格被找到,將會使用一個默認(rèn)的規(guī)格。
注意:關(guān)于系統(tǒng)標(biāo)簽,請參閱The Tag System。
在這個ZStack版本中(0.6),一個L3客戶網(wǎng)絡(luò)可以含有并只能含有一個虛擬路由虛擬機,對于一個多層網(wǎng)絡(luò)的環(huán)境,不同的虛擬路由虛擬機將會服務(wù)不同的層:

ZStack管理節(jié)點將會向處于一個虛擬路由虛擬機內(nèi)部的Python agent發(fā)送命令,當(dāng)用戶虛擬機啟動會停止的時候。以通過dnsmasq和iptables實現(xiàn)網(wǎng)絡(luò)服務(wù)。Iptables規(guī)則的一小段像這樣:

注意:在未來的ZStack版本中,網(wǎng)絡(luò)服務(wù):負(fù)載均衡,VPN,GRE隧道,也將會通過虛擬路由虛擬機來實現(xiàn)。另外虛擬路由虛擬機也將會成為虛擬專用云VPC的核心實現(xiàn)元素。
虛擬路由虛擬機是怎樣滿足以下考慮的
讓我們回顧下我們先前提到的一些考慮,然后看下虛擬路由虛擬機如何能滿足它們。
- 最小的基礎(chǔ)設(shè)施需求:虛擬路由虛擬機,對數(shù)據(jù)中心的物理設(shè)備沒有任何特別需要。它們只是一些類似于用戶虛擬機的虛擬機,可以在物理機上被創(chuàng)建。因為使用它們,管理員不必去為復(fù)雜的硬件互聯(lián)做規(guī)劃。
- 沒有單點故障:對每一個L3網(wǎng)絡(luò)都有一個虛擬路由虛擬機,如果它因為某種原因崩潰了,只有對應(yīng)的L3網(wǎng)絡(luò)上的用戶虛擬機會被影響,而不會對其他L3網(wǎng)絡(luò)產(chǎn)生任何影響。在大多數(shù)的使用場景中,一個L3網(wǎng)絡(luò)只屬于一個租戶,這就是說,只有一個租戶會遭受到一個虛擬路由虛擬機的失敗。當(dāng)L3網(wǎng)絡(luò)遭到惡意工具的時候,這特別有用。例如,DDOS。攻擊者不能通過攻擊一個租戶而摧毀整個云內(nèi)的網(wǎng)絡(luò)。
- 無狀態(tài):虛擬路由虛擬機是無狀態(tài)的,所有的配置,來自于ZStack管理節(jié)點,可以在任何時間被重建。用戶有各種各樣的選擇,用于重建虛擬路由虛擬機中的配置。例如,關(guān)閉、啟動它們,刪除、重建他們,或調(diào)用重連API(ReconnectVirtualRouter API)。
- 易于實現(xiàn)高可用(HA):可以部署兩個虛擬路由虛擬機,使用虛擬路由冗余協(xié)議在主備模式下工作,以實現(xiàn)HA。一旦主要的虛擬路由失效了,備用的會自動接管,使得網(wǎng)絡(luò)的宕機時間微不足道。
注意:這個冗余虛擬路由虛擬機的特性在當(dāng)前版本中不支持(0.6). - Hypervisor無關(guān):虛擬路由虛擬機不依賴于Hypervisor。ZStack有一個腳本,用于為主流的Hypervisor構(gòu)建虛擬路由虛擬機的模板。
- 合理的性能:因為使用了Linux,虛擬路由虛擬機能夠?qū)崿F(xiàn)該Liunx能夠提供的合理的性能。用戶可以配置一個虛擬路由計算規(guī)格,通過更多的CPU和更大的內(nèi)存來為虛擬路由虛擬機提供足夠的計算能力,以應(yīng)對沉重的網(wǎng)絡(luò)流量。性能上主要的關(guān)注點在于,虛擬路由虛擬機和用戶虛擬機上公有網(wǎng)卡間的流量,在虛擬
路由虛擬機提供NAT相關(guān)的服務(wù),包括SNAT、EIP、和端口轉(zhuǎn)發(fā)時。在大多數(shù)場景中,由于一個公網(wǎng)IP通常有幾十MB的帶寬,虛擬路由虛擬機足以勝任一個不錯的性能。
然而,當(dāng)通過虛擬路由虛擬機的流量需要一個極高的帶寬的時候,由于虛擬化導(dǎo)致的顯著的網(wǎng)絡(luò)性能下降時不可避免的;然而,有兩種技術(shù)可以緩解這個問題:
- LXC/Docker:由于ZStack支持多種Hypervisor,一旦LXC或Docker被支持,作為一種輕量級的虛擬化技術(shù),作為容器運行的虛擬路由虛擬機可以近乎原生的性能。
- SR-IOV:虛擬路由虛擬機可以通過SR-IOV被分配物理網(wǎng)卡,以達(dá)到原生的網(wǎng)絡(luò)性能。
注意:LXC/Docker和SR-IOV在當(dāng)前版本中不支持(0.6).
另外,用戶可以使用系統(tǒng)標(biāo)簽和虛擬路由計算規(guī)格來為虛擬路由虛擬機控制物理主機的分配;更進(jìn)一步,用戶甚至可以指派一個物理服務(wù)器給一個虛擬路由虛擬機;在LXC/Docker或SR-IOV的幫助下,虛擬路由虛擬機能接近一個Linux服務(wù)器能夠提供的原生的網(wǎng)絡(luò)性能。
不管怎樣,軟件的解決方案有著天生的性能缺陷;用戶可以選擇為了網(wǎng)絡(luò)的高性能而選擇混合的解決方案;例如,僅為DHCP和DNS使用虛擬路由虛擬機,將性能敏感的服務(wù)留給使用了物理設(shè)備的服務(wù)提供器。
總結(jié)
在這篇文章中,我們演示了ZStack的默認(rèn)網(wǎng)絡(luò)服務(wù)提供器:虛擬路由提供器。解釋了它怎么工作并詳細(xì)闡述了它是怎樣滿足了我們關(guān)于網(wǎng)絡(luò)服務(wù)的考慮。借助虛擬路由虛擬機,ZStack取得了一個理想的平衡,在靈活性和性能之間。我們相信90%的用戶可以輕松明確地在商業(yè)硬件上構(gòu)建他們的網(wǎng)絡(luò)服務(wù)。