深入理解Neutron網絡


一、Neutron中的三種網絡

1. External Network/API Network

這個網絡是鏈接外網的,無論是用戶調用OpenStack的API,還是創建出來的虛擬機要訪問外網,或者外網要ssh到虛擬機,都需要通過這個網絡。

2. Data Network

數據網絡,虛擬機之間的數據傳輸通過這個網絡來進行,比如一個虛擬機要連接到另一個虛擬機,虛擬機要連接虛擬路由都是通過這個網絡來進行。

3. Management Network

管理網絡,OpenStack各個模塊之間的交互,連接數據庫,連接Message Queue都是通過這個網絡來進行。

二、Neutron中的三個節點

1. Controller節點

      neutron-server用於接受API請求創建網絡,子網,路由器等,然而創建的這些東西僅僅是一些數據結構在數據庫里面。

2. Network節點

   (1)neutron-l3-agent用於創建和管理虛擬路由器,當neutron-server將路由器的數據結構創建好,neutron-l3-agent是做具體事情的,真正的調用命令行將虛擬路由器,路由表,namespace,iptables規則全部創建好。

   (2)neutron-dhcp-agent用於創建和管理虛擬DHCP server,每個虛擬網絡都會有一個DHCP server,這個DHCP server為這個虛擬網絡里面的虛擬機提供IP。

   (3)neutron-openvswitch-plugin-agent用於創建L2的switch,在Network節點上,Router和DHCP Server都會連接到二層的switch上。

3. Compute節點

      neutron-openvswitch-plugin-agent用於創建L2的switch,在compute節點上,虛擬機的網卡也是連接到二層的switch上。

三、租戶創建網絡過程

   (1)為這個Tenant創建一個private network,不同的private network是需要通過VLAN tagging進行隔離的,互相之間廣播(broadcast)不能到達,網絡類型可以是vxlan\gre等;

   (2)為private network創建一個subnet,subnet才是真正配置IP網段的地方,對於vpc網絡,我們常常用192.168.0.0/24這個網段;

   (3)為這個Tenant創建一個Router,訪問外網;

   (4)將private network連接到Router上;

   (5)創建一個External Network;

   (6)創建一個External Network的Subnet,這個外網邏輯上代表了我們數據中心的物理網絡,通過這個物理網絡,我們可以訪問外網;

   (7)將Router連接到External Network;

       設置外部網絡時PUBLIC_GATEWAY應該設為數據中心里面的Gateway,PUBLCI_RANGE也應該和數據中心的物理網絡的CIDR一致,否則連不通。之所以設置PUBLIC_START和PUBLIC_END,是因為在數據中心中,不可能所有的IP地址都給OpenStack使用,另外的可能搭建了VMware vCenter,可能有物理機,所以僅僅分配一個區間給OpenStack來用。

四、Neutron中的技術

       Neutron能提供虛擬的分布式(跨物理機虛機在同一個vlan)二層vswitch(提供虛擬的network\subnet\port)、三層router、防火牆、負載均衡等抽象網絡功能,能為每個租戶提供獨立的虛擬網絡環境。所謂虛擬網絡,就是虛機啟動的時候會有一個虛擬網卡,虛擬網卡會連接到虛擬switch上,虛擬switch連接到虛擬router上,虛擬router最終和物理網卡連通,從而實現虛擬網絡和物理網絡連通起來。可能用到的技術包括:

五、舉例說明

1. GRE網絡原理

       假設虛擬機VM0虛擬網卡veth0有網絡數據包向外網發送,那么會經過如下過程:

       (1)數據包會經過qbr Linux Bridge設備,qvb(quantum veth bridge)和qvo(quantum veth ovs)虛擬網絡設備;

       (2)數據包到達OVS網橋br-int上,br-int將數據包attach到OVS網橋br-tun上(br-int完成標記和去除內部即本地租戶VLAN TAG,本機虛機L2層流量的本地轉發);

       (3)數據包再從compute節點OVS網橋的br-tun和network節點OVS網橋br-tun構成的GRE隧道穿過(br-tun是OVS虛擬出來的網橋,進行隧道封裝,並完成VNI和VLAN映射,通過它將環境中的所有物理機連通起來,這樣物理節點之間就可以形成一個GRE的點對點通信網絡或者vxlan網絡);

       (4)交付到Network節點的OVS網橋br-int上;

       (5)網絡節點的br-int通過qr設備借助Linux命名空間qrouter連通到br-ex上的qg設備,將數據包交付到OVS網橋br-ex上(qrouter就是網絡節點上的neutron-l3-agent);

       (6)最后br-ex通過網絡節點的外部物理端口eth1把數據包傳送到外部路由器的網關。

2. 進一步理解

       (1)DHCP

       為什么會有個DHCP Server呢?同一個private network里的虛擬機得到IP都是通過這個DHCP Server來的,這個DHCP Server也是連接到br-int上和虛擬機進行通信的。

       (2)qbr與br-int

       既然qbr與br-int都是網橋,為什么不直接連接到br-int,而要通過qvb和qvo這兩個虛擬網絡設備來連接,為什么要用到qbr呢?因為Security group。OVS網橋br-int沒有設置iptables規則的功能,但是openstack又需要提供安全組的服務,因此借助了Linux Bridge(qbr),雖然都是二層網橋,但為了功能互補就同時出現了。具體Openstack中的安全組開通哪些端口,屏蔽哪些端口是用iptables來實現的,而br-int這些虛擬網橋都是通過OVS創建,openstack的Kernel mode和netfilter的kernel mode不兼容。一個IP包進來要么走iptables規則進行處理,要么走OVS規則進行處理,br-int上有很多OVS的規則,比如vlan tag等,所以iptables必須要另外建立一個linux bridge來做,因此有了qbr。在了解拓撲結構的時候,可以將qbr忽略,VM直接連接到br-int上就可以。

       (3)namespace

       為什么會有namespace呢,java的namespace是為了在不同namespace下有相同的類名,openstack也是類似。不同tenant都創建自己的router和private network,彼此不知道別人指定了哪些網段,很有可能兩個tenant都指定了同一個網段,這樣不同的private network的路由表、DHCP Server就需要隔離,否則就亂了,因此有了namespace。

       (4)OVS一體化網橋br-int

       每個機器上都有了自己的br-int,但是對於虛機和虛擬router來說,它們仍然覺得自己連接到了一個大的L2的br-int上,通過這個br-int相互通信,它們感受不到br-int下面的虛擬網卡br-tun。所以對於多節點結構,我們可以想象br-int是一個大的、橫跨所有compute節點和network節點的L2層switch,實現虛機之間的通信以及虛機和router的通信,好像open stack環境中所有的虛機都連接到了一個巨型的虛擬交換機上。

       但是br-int畢竟被物理的割開了,需要有一種方式將其串聯,openstack提供了多種方式,可以用GRE將不同機器的br-int連接起來,也可以通過vlan或是vxlan。這就是為什么openstack有了br-int這個bridge,但是不把所有的openvswitch的規則都在它上面實現。就是為了提供這種靈活性,對於虛擬機來講,看到的是一大整個br-int,不同機器的br-int可以有多種方式連接,這在br-int下面的網卡上面實現。

       (5)OVS隧道網橋br-tun

       br-tun也是OVS創建的虛擬網橋,它是一個中間層,接收br-int的網絡數據,然后再通過特定的網絡協議與各個節點的br-tun相連構成一個通道層。如果所有的br-int構成的抽象層定義為虛擬二層網絡,那么所有的br-tun構成的抽象層便是虛擬三層網絡了。

       (6)網絡數據包隔離

       如果有不同的tenant,創建了不同的private network,為了在data network上對包進行隔離,創建private network的時候,需要指定vlanid。因此不同的tenant的private network上建的虛機,連接到br-int上的時候是帶tag的,所以不同tenant的虛機,即便連接到同一個br-int上,因為tag不同,也不能相互通信。

       但是同一個節點上的tag是僅在此節點有效的,並不是使用我們創建private network的時候指定的全局唯一的vlanid,一個compute節點上的br-int上的tag 1和另一個compute節點上的br-int的tag1很可能是兩碼事。全局的vlanid僅僅在br-int以下的虛擬網卡和物理網絡中使用,虛機所有能看到的東西,到br-int為止,看不到打通br-int所要使用的vlanid。

       從局部有效的tag到全局有效的vlanid的轉換,都是通過openvswitch的規則,在br-tun上實現。


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM