【原理解析】OpenStack Neutron架構(gòu)指南
一.前言
由于OpenStack Neutron項(xiàng)目本身的高度復(fù)雜性和抽象性,加之我僅作為一名初學(xué)者,其理解能力有限。因此這里,闡述的僅是鳳毛麟角而已,其目的是幫助、引導(dǎo)和我一樣對(duì)Neutron又敬又畏的朋友們!如果本文中出現(xiàn)紕漏和錯(cuò)誤,懇請(qǐng)指正。接受教育,本身也是一種學(xué)習(xí)。
在這里,需要指出的是,本文僅從宏觀角度而言,起一個(gè)引導(dǎo)、拋磚引玉的作用。
——即實(shí)現(xiàn)Neutron的整體原理是什么。
好了,下面讓我們一起踏上Neutron這條不歸之路吧!
二.Neutron架構(gòu)
Neutron項(xiàng)目共由約1千多個(gè)文件構(gòu)成(k版)。
- # tree -l 1 neutron/
- 313 directories, 1224 files
一切,讓我們先從Neutron架構(gòu)圖說(shuō)起走吧,如下所示:
分析
1)位于最上層的Neutron Server充當(dāng)一個(gè)門(mén)派中的“掌門(mén)人”角色(RESTful Server),負(fù)責(zé)接受來(lái)自外部門(mén)派(項(xiàng)目)的API請(qǐng)求,比如Nova API創(chuàng)建網(wǎng)絡(luò)的請(qǐng)求。
2)位于中間層的Neutron plugin充當(dāng)一個(gè)門(mén)派中的“信使”角色,負(fù)責(zé)傳達(dá)最高層指令給下面的人。
3)位于下層的Neutron Agent充當(dāng)一個(gè)門(mén)派中“干活”角色,負(fù)責(zé)執(zhí)行一些具體的任務(wù)和操作。
類(lèi)似于各個(gè)計(jì)算、存儲(chǔ)節(jié)點(diǎn)被虛擬化為計(jì)算、存儲(chǔ)資源池,Openstack所在的整個(gè)物理網(wǎng)絡(luò)在Neutron中也被虛擬化為網(wǎng)絡(luò)資源池。通過(guò)對(duì)網(wǎng)絡(luò)資源的劃分和可擴(kuò)展性,Neutron能夠?yàn)槊總€(gè)租戶(hù)提供獨(dú)立的虛擬網(wǎng)絡(luò)環(huán)境。
Neutron分別提供了二層(L2)vSwitch交換和三層(L3)Router路由抽象的功能,對(duì)應(yīng)于物理網(wǎng)絡(luò)環(huán)境中的交換機(jī)和路由器實(shí)現(xiàn)。具體實(shí)現(xiàn)了如下功能:
- Router:為租戶(hù)提供路由、NAT等服務(wù)。
- Network:對(duì)應(yīng)于一個(gè)真實(shí)物理網(wǎng)絡(luò)中的二層局域網(wǎng)(VLAN),從租戶(hù)的的角度而言,是租戶(hù)私有的。
- Subnet:為網(wǎng)絡(luò)中的三層概念,指定一段IPV4或IPV6地址并描述其相關(guān)的配置信息。它附加在一個(gè)二層Network上,指明屬于這個(gè)network的虛擬機(jī)可使用的IP地址范圍。
1. Linux虛擬網(wǎng)絡(luò)
Neutron中最為核心的工作便是對(duì)二層物理網(wǎng)絡(luò)network的抽象與管理。
虛擬機(jī)的網(wǎng)絡(luò)功能由虛擬網(wǎng)卡(vNIC)提供,Hypervisor可以為每個(gè)虛擬機(jī)創(chuàng)建一個(gè)或多個(gè)vNIC,從虛擬機(jī)的角度出發(fā),這些vNIC等同于物理的網(wǎng)卡,為了實(shí)現(xiàn)與傳統(tǒng)物理網(wǎng)絡(luò)一樣的網(wǎng)絡(luò)功能,與物理網(wǎng)卡一樣,Switch也被虛擬化成虛擬交換機(jī)(OpenvSwitch),各個(gè)vNIC 連接在vSwitch的端口(br-int)上,最后這些vSwitch通過(guò)物理服務(wù)器的物理網(wǎng)卡訪問(wèn)外部的物理網(wǎng)絡(luò)。
對(duì)一個(gè)虛擬的二層網(wǎng)絡(luò)結(jié)構(gòu)而言,主要是完成兩種網(wǎng)絡(luò)設(shè)備的虛擬化,即物理網(wǎng)卡和交換設(shè)備。在Linux環(huán)境下網(wǎng)絡(luò)設(shè)備的虛擬化主要有以下幾種形式:
1)TAP/TUN/VETH
提到Neutron的虛擬網(wǎng)絡(luò)功能實(shí)現(xiàn),不得不先提基于Linux內(nèi)核級(jí)的虛擬設(shè)備。
TAP/TUN/VETH是Linux內(nèi)核實(shí)現(xiàn)的一對(duì)虛擬網(wǎng)絡(luò)設(shè)備,TAP工作在二層,收發(fā)的是 MAC 層數(shù)據(jù)幀;TUN工作在三層,收發(fā)的是 IP 層數(shù)據(jù)包。Linux 內(nèi)核通過(guò)TAP/TUN設(shè)備向綁定該設(shè)備的用戶(hù)程序發(fā)送數(shù)據(jù),反之,用戶(hù)程序也可以像操作硬件網(wǎng)絡(luò)設(shè)備一樣,通過(guò)TAP/TUN設(shè)備接收數(shù)據(jù)。
基于TAP設(shè)備,實(shí)現(xiàn)的是虛擬網(wǎng)卡的功能,當(dāng)一個(gè)TAP設(shè)備被創(chuàng)建時(shí),在Linux的設(shè)備文件目錄下將會(huì)生成一個(gè)對(duì)應(yīng)的字符設(shè)備文件(/dev/tapX文件),而運(yùn)行其上的用戶(hù)程序便可以像使用普通文件一樣打開(kāi)這個(gè)文件進(jìn)行讀寫(xiě)。
VETH設(shè)備總是成對(duì)出現(xiàn)的,接收數(shù)據(jù)的一端會(huì)從另一端發(fā)送出去,理解為一根虛擬的網(wǎng)線即可。
2)Linux Bridge
Linux Bridge(Linux內(nèi)核實(shí)現(xiàn)的網(wǎng)橋)是工作在二層的虛擬網(wǎng)絡(luò)設(shè)備,功能類(lèi)似于物理的交換機(jī)。
它的實(shí)現(xiàn)原理是,通過(guò)將其他Linux網(wǎng)絡(luò)設(shè)備綁定到自身的Bridge上,并將這些設(shè)備虛擬化為端口。為什么我們已經(jīng)有了OVS,還要有 Linux Bridge 呢?這是因?yàn)長(zhǎng)inux Bridge實(shí)現(xiàn)了qbrxxx設(shè)備,提供了OVS無(wú)法支持的安全組(Security Group)功能。
3)Open vSwitch
對(duì)于云計(jì)算中的虛擬網(wǎng)絡(luò)而言,交換設(shè)備的虛擬化是很關(guān)鍵的一環(huán),vSwitch負(fù)責(zé)連接vNIC與物理網(wǎng)卡,同時(shí)也橋接同一物理服務(wù)器內(nèi)的各個(gè)VM的vNIC。
因此,我們可以像配置物理交換機(jī)一樣,將接入到OpenvSwitch(需要指出的是在多個(gè)以上時(shí),vSwitch是分布式虛擬交換機(jī))上的各個(gè) VM分配到不同的VLAN中實(shí)現(xiàn)網(wǎng)絡(luò)隔離,并且,我們也可以在OVS端口上為VM配置QOS,同時(shí)OVS也支持包括NetFlow、sFlow等標(biāo)準(zhǔn)的管理接口和協(xié)議。從而,通過(guò)這些接口可以實(shí)現(xiàn)VM流量監(jiān)控的任務(wù)。
運(yùn)行在云環(huán)境中各種或相同虛擬化平臺(tái)上的多個(gè)vSwitch實(shí)現(xiàn)了分布式架構(gòu)的虛擬交換機(jī)。一個(gè)物理服務(wù)器上的vSwitch可以透明的與其他服務(wù)器上的vSwitch連接通信。
關(guān)于OVS更加詳細(xì)的內(nèi)容,請(qǐng)參閱其他資料。
2.Neutron RPC
RPC是neutron中跨模塊進(jìn)行方法調(diào)用的很重要的一種方式,主要包括client端和server端。client端用于發(fā)出rpc消息,server端用于監(jiān)聽(tīng)消息并進(jìn)行相應(yīng)處理。
1)Agent 端RPC
在dhcp agent、 l3 agent、 firewall agent以及metering agent的main函數(shù)中都能找到類(lèi)似的創(chuàng)建一個(gè)Agent rpc服務(wù)端的代碼。
2)plugin端的rpc
3)neutron-server端的rpc
具體的RPC實(shí)現(xiàn),請(qǐng)參閱源代碼和其他資料。
#p#
三.Neutron 虛擬網(wǎng)絡(luò)
1.Neutron網(wǎng)絡(luò)資源
通過(guò)對(duì)上面的了解,我們已經(jīng)知道了Neutron通過(guò)L3虛擬的Router提供路由器功能,通過(guò)L2(二層)虛擬的network/subnet /port 提供物理二層網(wǎng)絡(luò)的功能,并且其二層network分別由linux bridge和OpenvSwitch等共同實(shí)現(xiàn)。
在L2中,Neutron還提供了一個(gè)重要的網(wǎng)絡(luò)資源抽象Port,其作為虛擬交換機(jī)上的一個(gè)虛擬端口。當(dāng)一個(gè)port被創(chuàng)建時(shí),默認(rèn)情況下,會(huì)為它分配其指定subnet中可用的IP。
對(duì)于L2層虛擬network而言,Linux bridge 和OpenvSwitch只是實(shí)現(xiàn)了虛擬網(wǎng)絡(luò)的底層機(jī)制,并不能代表物理網(wǎng)絡(luò)的拓?fù)漕?lèi)型。而目前,neutron支持如下的網(wǎng)絡(luò)類(lèi)型來(lái)映射到真正的物理網(wǎng)絡(luò)中:
- Flat
- VLAN
- GRE
- VXLAN
除了上述的L2和L3層虛擬資源外,Neutron還提供了更高層次的一些服務(wù),主要有FWaaS、LBaaS和VPNaaS等。
2. Neutron Plugin
與其他項(xiàng)目服務(wù)不同,Neutron只有一個(gè)主要的服務(wù)進(jìn)程neutron-server,它運(yùn)行于網(wǎng)絡(luò)控制節(jié)點(diǎn)上,提供RESTful API作為訪問(wèn)Neutron的入口,neutron-server接收到的用戶(hù)HTTP請(qǐng)求最終由遍布于計(jì)算節(jié)點(diǎn)和網(wǎng)絡(luò)節(jié)點(diǎn)上的各種agent來(lái)完成。
Neutron提供的眾多API資源對(duì)應(yīng)了前面所講的各種虛擬網(wǎng)絡(luò)資源。其中L2的抽象network/subnet/port可以被認(rèn)為是核心資源API(Core API),其他層次的抽象,包括router以及眾多的高層次服務(wù)則是擴(kuò)展資源API(Extension API)。
為了更容易的進(jìn)行擴(kuò)展,Neutron項(xiàng)目利用Plugin的方式組織代碼,每一個(gè)Plugin支持一組API資源并完成特定的操作,這些操作最終由Plugin通過(guò)RPC調(diào)用相應(yīng)的Agent來(lái)完成。
這些Plugin又被做了一些區(qū)分,一些提供基礎(chǔ)二層虛擬網(wǎng)絡(luò)支持的Plugin稱(chēng)為Core Plugin。而Core Plugin之外的其他Plugin則被稱(chēng)為Service Plugin,比如提供防火墻服務(wù)的FWaaS等。
Agent一般專(zhuān)屬于某個(gè)功能,用于使用物理網(wǎng)絡(luò)設(shè)備或一些虛擬化技術(shù)來(lái)完成某些實(shí)際的操作,比如實(shí)現(xiàn)router具體操作的L3 agent。
因?yàn)楦鞣NCore Plugin的實(shí)現(xiàn)之間存在很多重復(fù)的代碼,比如對(duì)數(shù)據(jù)庫(kù)的CRUD等操作。自H版起,Neutron實(shí)現(xiàn)了一個(gè)ML2 Core Plugin,它采用了更加靈活的結(jié)構(gòu)進(jìn)行實(shí)現(xiàn),通過(guò)Driver的形式對(duì)現(xiàn)有的各種Core Plugin提供支持,因此可以說(shuō)ML2 Plugin的問(wèn)世意在取代目前的Core Plugin。
3. Neutron API
Neutron將基于各種虛擬網(wǎng)絡(luò)資源得到的API資源分為核心資源(Core API)和擴(kuò)展資源(Exten API)兩種。Core API只對(duì)應(yīng)于L2層的network/subnet/port三種抽象。其余的各層抽象都屬于Extension API的范圍。Neutron API實(shí)現(xiàn)的主要代碼位于/neutron/api目錄。
4. Neutron-server
作為Neutron中的唯一一個(gè)服務(wù)進(jìn)程,neutron-server承擔(dān)著接收用戶(hù)RESTful API請(qǐng)求并分發(fā)處理的任務(wù)。主要代碼位于neutron/services目錄。
5. ML2 plugin
ML2 plugin被社區(qū)提出來(lái)的目的是用于取代所有的Core Plugin,它采用了更加靈活的結(jié)構(gòu)進(jìn)行實(shí)現(xiàn)。作為一個(gè)Core plugin,ML2 自然會(huì)實(shí)現(xiàn)network/subnet/port這三種核心資源,同時(shí)它也實(shí)現(xiàn)了包括Port Binding等在內(nèi)的部分?jǐn)U展資源。
ML2實(shí)現(xiàn)了網(wǎng)絡(luò)拓?fù)漕?lèi)型(Flat、VLAN、VXLAN、GRE)和底層虛擬網(wǎng)絡(luò)(linux bridge、OVS)分離的機(jī)制,并分別通過(guò)Driver的形式進(jìn)行擴(kuò)展。其中,不同的網(wǎng)絡(luò)拓?fù)漕?lèi)型對(duì)應(yīng)著type driver,由type manager管理,不同的網(wǎng)絡(luò)實(shí)現(xiàn)機(jī)制對(duì)應(yīng)著Mechanism Driver(比如Linux bridge、OVS、NSX等),由Mechanism Manager管理。
詳情,請(qǐng)參閱neutron.plugins.ml2.drivers.mech_agent文件中的AgentMechanismDriverBase類(lèi)。
6. Port Binding擴(kuò)展
Extension API有兩種方式擴(kuò)展現(xiàn)有的資源:一種是為network/port/subnet增加屬性,比如port binding擴(kuò)展。另外一種就是增加一些新的資源,比如VPNaaS等。
Extension API的定義都位于neutron/extension目錄,他們的基類(lèi)以及一些公用的代碼則位于neutron/api/extension.py文件。其中Extension Descriptor類(lèi)是所有Extension API的基類(lèi)。添加新的資源時(shí)需要實(shí)現(xiàn)get_resources( )方法,而擴(kuò)展現(xiàn)有的資源時(shí),則只需要實(shí)現(xiàn)get_extended_resources( ) 方法。
7.OpenvSwitch Agent
ML2 Plugin的主要工作是管理虛擬網(wǎng)絡(luò)資源,保證數(shù)據(jù)正確無(wú)誤,具體物理設(shè)備的設(shè)置則由Agent來(lái)完成,這里我們宏觀闡述下Neutron項(xiàng)目中的OVS Agent。
基于Plugin rpc提供的信息,OVS Agent負(fù)責(zé)在計(jì)算節(jié)點(diǎn)和網(wǎng)絡(luò)節(jié)點(diǎn)上,通過(guò)對(duì)OVS虛擬交換機(jī)的管理將一個(gè)Network映射到物理網(wǎng)絡(luò),這需要OVS Agent去執(zhí)行一些linux 網(wǎng)絡(luò)和OVS相關(guān)的配置與操作,Neutron通過(guò)如下兩個(gè)庫(kù)提供了最為基礎(chǔ)的操作接口,從而可以通過(guò)Linux Shell命令完成OVS的配置。
比如:
- ovs_lib.py
通過(guò)shell執(zhí)行各種ovs-vsctl操作。
代碼目錄:neutron/agent/common
- ip_lib.py
通過(guò)linux的br-ctl命令操作Linux的veth、router、namespace等。
代碼目錄:neutron/agent/linux/
主要是完成如下的一些工作:
- agent初始化
- agent和Plugin RPC的通信
- br-int創(chuàng)建與初始化
- br-eth初始化
- br-tun初始化
- 創(chuàng)建Tunnel Port
- 分配LVID(Local VLAN ID)
- L2 population
8. Service plugin
Neutron中除了network、port、subnet這三種二層的核心資源外,其他的都被作為Extension API進(jìn)行實(shí)現(xiàn),隨著ML2的成熟和發(fā)展,Extension API 的實(shí)現(xiàn)演變?yōu)閮煞N方式,一種是實(shí)現(xiàn)在某個(gè)Core plugin內(nèi),比如ML2內(nèi)的port binding、Security Group等。
另一種就是使用Service plugin的方式,去實(shí)現(xiàn)FWaaS、LBaaS、VPNaaS等高級(jí)服務(wù)。
代碼目錄:neutron/services
至此,我們已經(jīng)從宏觀上認(rèn)識(shí)了Neutron架構(gòu),接下來(lái)的則是自己考究了。