當前位置:
首頁 > 最新 > OpenStack-Neutron的資源模型

OpenStack-Neutron的資源模型

在OpenStack的官網,https://developer.openstack.org/api-ref/network/v2/,對其公開的REST ful API做了相關說明。這些RESTful API背後就是Neutron的網路資源模型。Neutron把它管理的對象統統稱為資源,比如Network、Subnet、Port等,表面看與傳統網路中概念一樣,但是由於Neutron管理的範圍(DC內)和對象的特點(Host內部虛機VM)等原因,與傳統網路的概念並不完全相同,甚至有些令人困惑。

Neutron管理的典型資源包括:Network、Subent、Port和Router。

network

network 是一個隔離的二層廣播域。Neutron 支持多種類型的 network,包括 local, flat, VLAN, VxLAN 和 GRE。其中,VxLAN和GRE屬於隧道網路,local、vlan和flat屬於非隧道網路。從全局看,Network是Neutron資源模型的「根」。Subnet隸屬於它,Port也要隸屬於它。在Network中引申出兩個重要概念:運營商網路(provider network)和物理網路(provider:physical_network)。

運營商網路(provider network)

是相對於租戶(project)創建的網路,即租戶網路而言。租戶創建的租戶網路屬於內網網路,和外部網路之間是隔離的,如果該租戶創建的虛機VM有訪問外部網路的需求,此時neutron就必須通過一個網路來映射這個外部網路,實現這個功能的就是運營商網路(provider network)。即,運營商網路就是運營商的某個物理網路在OpenStack的延伸。

物理網路(provider:physical_network)

前面說了,為了滿足租戶(project)創建的虛機VM訪問外網的需求(這裡的外網不一定是internet,也可能是企業內部其他物理網路),需要創建一個運營商網路(provider network)來對外網進行映射,而這個映射是如何實現的呢?答案就是通過網路節點Host的物理網卡來完成,通過這物理網卡實現運營商網路和外部網路的對接。這個物理網卡就是neutron管理範圍內的物理網路(provider:physical_network),這個概念在創建運營商網路類型為VLAN和FLAT是尤其明顯,因為創建這兩種網路類型時,其配置文件中明確要求對應物理網卡名稱(詳見部署章節)。但是當創建的運營商網路為隧道網路時,卻不需要指定物理網卡。這又是為什麼呢?答案就要從隧道網路的報文說起,如下圖所示:

從上圖中可以看出,隧道性網路離開主機的報文,外面有一層隧道Header的,這個Header包括隧道的源IP和目的IP。只要有了目的IP,主機Host的IP協議棧就會找到合適的網卡將報文轉發出去。因此,當運營商網路類型為VxLAN或GRE等隧道網路時,是通過對應物理網卡的IP找到物理網卡轉發報文,本質上還是需要佔用一個物理網卡,只是配置上無需指定物理網卡名稱,只需完成隧道網路對應VTEP IP配置即可。這裡面還隱含一個概念,就是隧道網路的物理網卡可以復用,即當我們的創建多個隧道網路類型的運營商網路時,可以通過同一個VTEP IP對應的物理網卡轉發數據包。那麼VLAN網路類型和FLAT網路類型運營商網路指定了物理網卡名稱,是否也可以復用?答案是,VLAN網路可以通過在物理網卡上起子介面來實現復用,但是主機Host的物理網卡要配置成Trunk模式。這個不難理解,和實際物理網路交換機的實現方式一致。但FLAT網路只能獨佔一個物理網,這個在後面分析FLAT網路的實現方式時會詳述,這裡不再贅述。

Subnet

subnet 是一個 IPv4 或者 IPv6 地址段,其數據模型只包含兩個欄位cidr和ip_version。虛擬機VM的 IP 從 subnet 中分配。每個 subnet 需要定義 IP 地址的範圍和掩碼。network 與 subnet 是 1對多 關係。一個 subnet 只能屬於某個 network;一個 network 可以有多個 subnet,這些 subnet 可以是不同的 IP 段,但不能重疊。表面看,Subnet只是代表純邏輯資源,是一批IP地址的集合,但實際上每個IP背後都代表一個實體,如VM。那麼就會產生以下兩個問題:虛機VM的IP地址如何分配?虛機VM的DNS是什麼?因此,Subnet除了cidr和ip_version等純邏輯資源外,還隱含了IP核心網路服務的內容,即俗稱的DDI服務(DHCPDNSIPAM)。

DHCP服務

當創建網路時,勾選啟用DHCP服務,其對應配置文件中的enabel_dhcp=true,此時Neutron會自動創建一個DHCP Server,前面介紹過該DHCP Server被操作系統OS創建在namespace中,通過veth pair與Bridge網橋相連。DHCP可以配置為一個IP地址池,如果沒配置,就默認採用subnet的cidr欄位作為標準地址池。

DNS服務

當創建網路時,勾選啟用DHCP服務,同時也默認啟用DNS服務。Neutron會根據虛機的主機名和綁定Port信息完成主機名和IP地址解析功能。

IPAM服務

有了DNS、有了DHCP,這個還不夠。實際的組網中,一般還有一個IPAM(IP Address Management,IP地址管理)功能,數據模型中與其相關的欄位是Subnetpool_id,其餘DHCP數據模型的allocation_pools重複,也就意味著IPAM就是從subnet設定的地址池中管理虛機VM的IP地址分配。

Port

port 可以看做虛擬交換機上的一個埠。port 上定義了 MAC 地址和 IP 地址,當 VM 的虛擬網卡 VIF(Virtual Interface) 綁定到 port 時,port 會將 MAC 和 IP 分配給 VIF。其實在後面的各種網路實現章節,大家會這個port其實就是linux操作系統的一個tap設備。而tap又是什麼呢?為了說明這個東東,我們先從理論、數據模型講起,最後通過實驗環節來進行驗證。

Linux中的tap屬於虛擬網路設備,而在linux中所指的「設備」並不是我們實際生產或生活中常見路由器或交換機這類設備,它其實本質上往往是一個數據結構、內核模塊或設備驅動這樣含義。在linux中,tap和tun往往是會被並列討論,tap位於二層,tun位於三層。為了說明這一點我們先看看下面linux用於描述tap和tun的數據結構內容:

Struct tun_strruct {

Char name [8]; //設備名稱

Unsigned long flags; //區分tun和tap的標誌位;

Struct fasync_struct *fasync; //文件非同步調用通知介面

Wait_queue_head_t read_wait; //消息隊列讀等待標誌

Struct net_device dev; //定義一個抽象網路設備

Struct sk_buff_head txq; //定義一個緩存區

Struct net_device_stats stats; //定義一個網卡狀態信息結構

};

從上面的數據結構可以看出,tap和tun的數據結構其實一樣的,用來區別兩者的其實就是flags。Tap從功能上說,位於二層(數據鏈路層),而二層的主要網路協議包括:

(1)點對點協議(Point-to-Point Protocol)

(2)乙太網協議(Ethernet)

(3)高級數據幀鏈路協議(High-Level Data Link Protocol)

(4)幀中繼(Frame Relay)

(5)非同步傳輸模式(Asynchronous Transfer Mode)

而tap只是與乙太網協議(Ethernet)對應,所以tap常被稱為「虛擬乙太網設備」 。

如果想用linux命令行操作一個tap,首先linux得有tun模塊(linux使用tun模塊實現了tun/tap),檢查方法如下:

執行命令modinfo tun,如有有如下輸出,則說明你的linux操作系統具備tun模塊

當linux具備tun模塊,還需要檢查其是否載入。通過執行lsmod | grep tun指令,如果有如下輸出,就說明tun模塊已載入。如果沒有載入,則使用命令modprobe tun進行載入即可。

確認tun模塊載入後,還需確認linux是否有操作tun/tap的命令行工具tunctl。通過執行tunctl help進行檢查,有如下輸出表明具備。否則,執行yum install -y tunctl進行安裝。

具備上述條件後,就可以創建一個tap設備了,通過命令tunctl -t tap_llb1創建,如下:

通過ip link list命令查看剛剛創建tap設備,其具備獨立網卡MAC

使用ip addr add命令給該創建的tap設備綁定ip

此時的tap設備就與Neutron的Pord資源對應的tap設備完全一致。我們可以看看Nuetron創建的tap是什麼樣?如下所示:

圖1

圖2

圖3

圖4

圖1是我們通過創建了一個虛機VM,該虛機通過tap6b130c8d-ba這個tap設備連接到網橋brqea861547-ce上,而這個網橋就是該虛機VM所屬的Network(linuxbridge agent實現下)。

圖4是我們登錄到虛機VM中,查看其網路配置信息,可以發現其虛擬網卡eth0對應的MAC地址與圖3中的配置信息一致,即tap6b130c8d-ba的MAC地址。進一步驗證tap6b130c8d-ba對應的資源模型Port就是虛機的虛擬網卡VIF。

在介紹Router之前,我們對Network、Subnet和Port這3個核心網路資源模型與虛機VM的虛機網卡VIF之間關係進行一個總結。

(1)subnet 與 port 是 1對多 關係。一個 port 必須屬於某個 subnet;一個 subnet 可以有多個 port。

(2)Project 1 : m Network 1 : m Subnet 1 : m Port 1 : 1 VIF m : 1 Instance

Router

如果說Port是Neutron資源模型的「靈魂」,那麼Router就是Neutron資源模型的「發動機「。它承擔著路由轉發功能。Router的資源模型可以簡單抽象為三部分:埠、路由表、路由協議處理單元。如下圖所示:

Router並沒有使用某個欄位表示埠,而是提供2個API以增加/刪除埠,如下所示,非常好理解。

# Add interface to router /v2.0/routers//add_router_interface----增加埠

# Remove interface from router /v2.0/routers//remove_router_interface----刪除埠

理論上,Router只要有了路由表以及對應的埠信息就可以進行路由轉發,但是對於外部網路(Neutron管理範圍之外的網路)路由轉發,尤其公網internet,Router還用了一個特殊欄位external_gateway_info(外部網關信息)來表示。這又是什麼意思?我們通過一個例子來理解,如下圖所示:

位於Nuetron管理網路的內部虛機VM,IP地址為10.10.10.10,它要訪問位於公網(外部網路)的網站www.openstack .org,IP地址為101104.20.110.33,需要經過公網的路由器RouterB才能到達。RouterB的Port2直接與Neutron網路節點的RouterA的Port1相連(中間經過Bridge相連)。這個RouterB就是真正意義上的外部網關,RouterB的介面Port2的IP地址120.192.0.1就是Neutron網路的外部網關IP。但是RouterB根本不在Neutron的管理範圍內(RouterA才屬於),而且Neutron也不需要管理它。從路由轉發的角度講,它只需要在RouterA中建一個路由表項即可,如下:

destination next_hop out interface

104.20.110.0/24 120.192.0.6 Port 2(120.192.0.1)

不過從RouterA的角度來看,不僅僅是增加一個路由表項那麼簡單(後面電信雲SDN部分源碼講解時會詳細闡述)。於是,Neutron提出了external_gateway_info這個模型,它由network_id,enable_snat,external_fixed_ips等幾個欄位組成。對應上圖,其數據結構如下:

「external_gateway_info":{

"enable_snat": true,

「external_fixed_ips": [

{

"ip_address": "120.192.0.6"

},

],

"network_id": "ae3405f12-aa7d-4b87-abdd-50fccaadef453"

}

其中,ip_address就是RouterA的Port1的地址,subnet_id中對應的subnet的gateway_ip就是RouterB中的Port2地址。所以,external_gateway_info其實隱含了Neutron的管理理念:

(1)Neutron只能管理自己的網路。

(2)Neutron不需要管理外部網路,只需知道外部網路網關IP即可。而它獲取外部網關IP的方式就是通過subnet_id間接獲取到其gateway_ip得到。

(3)當enable_snat=true時,SNAT真正生效的地方在RouterA的port1上。

Router中使用routes欄位表示路由表,是一個數組類型,每個元組的類型是[destination(string),netxhop(string)],即[目的地址,下一跳地址]。

如上面例子,當我們創建外部網關信息(external_gateway_info)的時候,Neutron會自動在Router上增加一個相應的路由表項,這個路由稱為默認靜態路由。同時,當我們在Router上增加一個埠時,這個埠背後的subnet的所有進出流量都要經過這個埠轉發,這其實也是一種路由轉發模式,稱為直連路由。但是,無論是增加外部網關信息還是增加埠,其產生的路由表項均不會在Router的路由表routers中增加響應的表項。那這個routers到底有什麼用?答案是,這個routers中只體現靜態路由信息,它與默認路由一樣,都是通往外部網路的。不過,靜態路由的外部網路一般指的是私網,而默認靜態路由的外部網路一般指的是公網,同時在external_gateway_info中並沒有包含目的網段,也就是說除了直連路由(由鏈路層協議自動發現,不體現在路由表中),靜態路由(體現在路由表中,需手工配置)外,到達其他所有目的地都走這條默認靜態路由轉發。

最後用一張圖和一個路由轉發表總結下Router這幾個概念,如下:

路由表項如下:

喜歡這篇文章嗎?立刻分享出去讓更多人知道吧!

本站內容充實豐富,博大精深,小編精選每日熱門資訊,隨時更新,點擊「搶先收到最新資訊」瀏覽吧!


請您繼續閱讀更多來自 CloudSupermanLLB 的精彩文章:

OpenStack-Neutron的資源隔離機制

TAG:CloudSupermanLLB |