上一節(jié)我們說到,使用原生的 VLAN 和 Linux 網(wǎng)橋的方式來進(jìn)行云平臺的管理,但是這樣在靈活性、隔離性方面都顯得不足,而且整個網(wǎng)絡(luò)缺少統(tǒng)一的視圖、統(tǒng)一的管理。 可以這樣比喻,云計(jì)算就像大家一起住公寓,要共享小區(qū)里面的基礎(chǔ)設(shè)施,其中網(wǎng)絡(luò)就相當(dāng)于小區(qū)里面的電梯、樓道、路、大門等,大家都走,往往會常出現(xiàn)問題,尤其在上班高峰期,出門的人太多,對小區(qū)的物業(yè)管理就帶來了挑戰(zhàn)。 物業(yè)可以派自己的物業(yè)管理人員,到每個單元的樓梯那里,將電梯的上下行速度調(diào)快一點(diǎn),可以派人將隔離健身區(qū)、景色區(qū)的柵欄門暫時打開,讓大家可以橫穿小區(qū),直接上地鐵,還可以派人將多個小區(qū)出入口,改成出口多、入口少等等。等過了十點(diǎn)半,上班高峰過去,再派人都改回來。 軟件定義網(wǎng)絡(luò)(SDN)這種模式就像傳統(tǒng)的網(wǎng)絡(luò)設(shè)備和普通的 Linux 網(wǎng)橋的模式,配置整個云平臺的網(wǎng)絡(luò)通路,你需要登錄到這臺機(jī)器上配置這個,再登錄到另外一個設(shè)備配置那個,才能成功。 如果物業(yè)管理人員有一套智能的控制系統(tǒng),在物業(yè)監(jiān)控室里就能看到小區(qū)里每個單元、每個電梯的人流情況,然后在監(jiān)控室里面,只要通過遠(yuǎn)程控制的方式,撥弄一個手柄,電梯的速度就調(diào)整了,柵欄門就打開了,某個入口就改出口了。 這就是軟件定義網(wǎng)絡(luò)(SDN)software define network。它主要有以下三個特點(diǎn)。
OpenFlow 和 OpenvSwitchSDN 有很多種實(shí)現(xiàn)方式,我們來看一種開源的實(shí)現(xiàn)方式。 OpenFlow 是 SDN 控制器和網(wǎng)絡(luò)設(shè)備之間互通的南向接口協(xié)議,OpenvSwitch 用于創(chuàng)建軟件的虛擬交換機(jī)。OpenvSwitch 是支持 OpenFlow 協(xié)議的,當(dāng)然也有一些硬件交換機(jī)也支持 OpenFlow 協(xié)議。它們都可以被統(tǒng)一的 SDN 控制器管理,從而實(shí)現(xiàn)物理機(jī)和虛擬機(jī)的網(wǎng)絡(luò)連通。
SDN 控制器是如何通過 OpenFlow 協(xié)議控制網(wǎng)絡(luò)的呢?
在 OpenvSwitch 里面,有一個流表規(guī)則,任何通過這個交換機(jī)的包,都會經(jīng)過這些規(guī)則進(jìn)行處理,從而接收、轉(zhuǎn)發(fā)、放棄。 那流表長啥樣呢?其實(shí)就是一個個表格,每個表格好多行,每行都是一條規(guī)則。每條規(guī)則都有優(yōu)先級,先看高優(yōu)先級的規(guī)則,再看低優(yōu)先級的規(guī)則。
對于每一條規(guī)則,要看是否滿足匹配條件。這些條件包括,從哪個端口進(jìn)來的,網(wǎng)絡(luò)包頭里面有什么等等。滿足了條件的網(wǎng)絡(luò)包,就要執(zhí)行一個動作,對這個網(wǎng)絡(luò)包進(jìn)行處理??梢孕薷陌^里的內(nèi)容,可以跳到任何一個表格,可以轉(zhuǎn)發(fā)到某個網(wǎng)口出去,也可以丟棄。 通過這些表格,可以對收到的網(wǎng)絡(luò)包隨意處理。
具體都能做什么處理呢?通過上面的表格可以看出,簡直是想怎么處理怎么處理,可以覆蓋 TCP/IP 協(xié)議棧的四層。 對于物理層:
對于 MAC 層:
對于網(wǎng)絡(luò)層:
對于傳輸層:
總而言之,對于 OpenvSwitch 來講,網(wǎng)絡(luò)包到了我手里,就是一個 Buffer,我想怎么改怎么改,想發(fā)到哪個端口就發(fā)送到哪個端口。 OpenvSwitch 有本地的命令行可以進(jìn)行配置,能夠?qū)嶒?yàn)咱們前面講過的一些功能。我們可以通過 OpenvSwitch 的命令創(chuàng)建一個虛擬交換機(jī)。然后可以將多個虛擬端口 port 添加到這個虛擬交換機(jī)上。 ovs-vsctl add-br ubuntu_br
實(shí)驗(yàn)一:用 OpenvSwitch 實(shí)現(xiàn) VLAN 的功能 下面我們實(shí)驗(yàn)一下通過 OpenvSwitch 實(shí)現(xiàn) VLAN 的功能,在 OpenvSwitch 中端口 port 分兩種。 第一類是 access port:
第二類是 trunk port:
我們通過以下命令創(chuàng)建如下的環(huán)境: ovs-vsctl add-port ubuntu_br first_br ovs-vsctl add-port ubuntu_br second_br ovs-vsctl add-port ubuntu_br third_br ovs-vsctl set Port vnet0 tag=101 ovs-vsctl set Port vnet1 tag=102 ovs-vsctl set Port vnet2 tag=103 ovs-vsctl set Port first_br tag=103 ovs-vsctl clear Port second_br tag ovs-vsctl set Port third_br trunks=101,102 另外要配置禁止 MAC 地址學(xué)習(xí)。 ovs-vsctl set bridge ubuntu_br flood-vlans=101,102,103
創(chuàng)建好了環(huán)境以后,我們來做這個實(shí)驗(yàn)。
通過這個例子,我們可以看到,通過 OpenvSwitch,不用買一個支持 VLAN 的交換機(jī),你也能學(xué)習(xí) VLAN 的工作模式了。 實(shí)驗(yàn)二:用 OpenvSwitch 模擬網(wǎng)卡綁定,連接交換機(jī) 接下來,我們來做另一個實(shí)驗(yàn)。在前面,我們還說過,為了高可用,可以使用網(wǎng)卡綁定,連接到交換機(jī),OpenvSwitch 也可以模擬這一點(diǎn)。 在 OpenvSwitch 里面,有個 bond_mode,可以設(shè)置為以下三個值:
我們搭建一個測試環(huán)境。
我們使用下面的命令,建立 bond 連接。 ovs-vsctl add-bond br0 bond0 first_br second_br ovs-vsctl add-bond br1 bond1 first_if second_if ovs-vsctl set Port bond0 lacp=active ovs-vsctl set Port bond1 lacp=active 默認(rèn)情況下 bond_mode 是 active-backup 模式,一開始 active 的是 first_br 和 first_if。 這個時候我們從 192.168.100.100 ping 192.168.100.102,以及從 192.168.100.101 ping 192.168.100.103 的時候,tcpdump 可以看到所有的包都是從 first_if 通過。 如果把 first_if 設(shè)成 down,則包的走向會變,發(fā)現(xiàn) second_if 開始有流量,對于 192.168.100.100 和 192.168.100.101 似乎沒有收到影響。 如果我們通過以下命令,把 bond_mode 設(shè)為 balance-slb。然后我們同時在 192.168.100.100 ping 192.168.100.102,在 192.168.100.101 ping 192.168.100.103,我們通過 tcpdump 發(fā)現(xiàn)包已經(jīng)被分流了。 ovs-vsctl set Port bond0 bond_mode=balance-slb ovs-vsctl set Port bond1 bond_mode=balance-slb 通過這個例子,我們可以看到,通過 OpenvSwitch,你不用買兩臺支持 bond 的交換機(jī),也能看到 bond 的效果。 那 OpenvSwitch 是怎么做到這些的呢?我們來看 OpenvSwitch 的架構(gòu)圖。
OpenvSwitch 包含很多的模塊,在用戶態(tài)有兩個重要的進(jìn)程,也有兩個重要的命令行工具。
在內(nèi)核態(tài),OpenvSwitch 有內(nèi)核模塊 OpenvSwitch.ko,對應(yīng)圖中的 Datapath 部分。在網(wǎng)卡上注冊一個函數(shù),每當(dāng)有網(wǎng)絡(luò)包到達(dá)網(wǎng)卡的時候,這個函數(shù)就會被調(diào)用。 在內(nèi)核的這個函數(shù)里面,會拿到網(wǎng)絡(luò)包,將各個層次的重要信息拿出來,例如:
在內(nèi)核中,有一個內(nèi)核態(tài) Flow Table。接下來內(nèi)核模塊在這個內(nèi)核流表中匹配規(guī)則,如果匹配上了,則執(zhí)行操作、修改包,或者轉(zhuǎn)發(fā)或者放棄。如果內(nèi)核沒有匹配上,則需要進(jìn)入用戶態(tài),用戶態(tài)和內(nèi)核態(tài)之間通過 Linux 的一個機(jī)制 Netlink 相互通信。 內(nèi)核通過 upcall,告知用戶態(tài)進(jìn)程 vswitchd 在用戶態(tài) Flow Table 里面去匹配規(guī)則,這里面的規(guī)則是全量的流表規(guī)則,而內(nèi)核 Flow Table 里面的只是為了快速處理,保留了部分規(guī)則,內(nèi)核里面的規(guī)則過一陣就會過期。 當(dāng)在用戶態(tài)匹配到了流表規(guī)則之后,就在用戶態(tài)執(zhí)行操作,同時將這個匹配成功的流表通過 reinject 下發(fā)到內(nèi)核,從而接下來的包都能在內(nèi)核找到這個規(guī)則。 這里調(diào)用 openflow 協(xié)議的,是本地的命令行工具,也可以是遠(yuǎn)程的 SDN 控制器,一個重要的 SDN 控制器是 OpenDaylight。 下面這個圖就是 OpenDaylight 中看到的拓?fù)鋱D。是不是有種物業(yè)管理員在監(jiān)控室里的感覺?
我們可以通過在 OpenDaylight 里,將兩個交換機(jī)之間配置通,也可以配置不通,還可以配置一個虛擬 IP 地址 VIP,在不同的機(jī)器之間實(shí)現(xiàn)負(fù)載均衡等等,所有的策略都可以靈活配置。 如何在云計(jì)算中使用 OpenvSwitch? OpenvSwitch 這么牛,如何用在云計(jì)算中呢?
我們還是討論 VLAN 的場景。 在沒有 OpenvSwitch 的時候,如果一個新的用戶要使用一個新的 VLAN,還需要創(chuàng)建一個屬于新的 VLAN 的虛擬網(wǎng)卡,并且為這個租戶創(chuàng)建一個單獨(dú)的虛擬網(wǎng)橋,這樣用戶越來越多的時候,虛擬網(wǎng)卡和虛擬網(wǎng)橋會越來越多,管理非常復(fù)雜。 另一個問題是虛擬機(jī)的 VLAN 和物理環(huán)境的 VLAN 是透傳的,也即從一開始規(guī)劃的時候,就需要匹配起來,將物理環(huán)境和虛擬環(huán)境強(qiáng)綁定,本來就不靈活。 而引入了 OpenvSwitch,狀態(tài)就得到了改觀。 首先,由于 OpenvSwitch 本身就是支持 VLAN 的,所有的虛擬機(jī)都可以放在一個網(wǎng)橋 br0 上,通過不同的用戶配置不同的 tag,就能夠?qū)崿F(xiàn)隔離。例如上面的圖,用戶 A 的虛擬機(jī)都在 br0 上,用戶 B 的虛擬機(jī)都在 br1 上,有了 OpenvSwitch,就可以都放在 br0 上,只是設(shè)置了不同的 tag。 另外,還可以創(chuàng)建一個虛擬交換機(jī) br1,將物理網(wǎng)絡(luò)和虛擬網(wǎng)絡(luò)進(jìn)行隔離。物理網(wǎng)絡(luò)有物理網(wǎng)絡(luò)的 VLAN 規(guī)劃,虛擬機(jī)在一臺物理機(jī)上,所有的 VLAN 都是從 1 開始的。由于一臺機(jī)器上的虛擬機(jī)不會超過 4096 個,所以 VLAN 在一臺物理機(jī)上如果從 1 開始,肯定夠用了。 例如在圖中,上面的物理機(jī)里面,用戶 A 被分配的 tag 是 1,用戶 B 被分配的 tag 是 2,而在下面的物理機(jī)里面,用戶 A 被分配的 tag 是 7,用戶 B 被分配的 tag 是 6。 如果物理機(jī)之間的通信和隔離還是通過 VLAN 的話,需要將虛擬機(jī)的 VLAN 和物理環(huán)境的 VLAN 對應(yīng)起來,但為了靈活性,不一定一致,這樣可以實(shí)現(xiàn)分別管理物理機(jī)的網(wǎng)絡(luò)和虛擬機(jī)的網(wǎng)絡(luò)。好在 OpenvSwitch 可以對包的內(nèi)容進(jìn)行修改。例如通過匹配 dl_vlan,然后執(zhí)行 mod_vlan_vid 來改進(jìn)進(jìn)出出物理機(jī)的網(wǎng)絡(luò)包。 盡管租戶多了,物理環(huán)境的 VLAN 還是不夠用,但是有了 OpenvSwitch 的映射,將物理和虛擬解耦,從而可以讓物理環(huán)境使用其他技術(shù),而不影響虛擬機(jī)環(huán)境,這個我們后面再講。
小結(jié)
|
|