Neutron 理解 (2): 使用 Open vSwitch + VLAN 組網 [Neutron Open vSwitch + VLAN Virtual Network]
學習 Neutron 系列文章:
1. L2 基礎知識
1.1 VLAN 基礎知識
1.1.1 VLAN 的含義
LAN 表示 Local Area Network,本地區域網,通常使用 Hub 和 Switch 來連線LAN 中的計算機。一般來說,當你將兩臺計算機連入同一個 Hub 或者 Switch 時,它們就在同一個 LAN 中。同樣地,你連線兩個 Switch 的話,它們也在一個 LAN 中。一個 LAN 表示一個廣播域,它的意思是,LAN 中的所有成員都會收到 LAN 中一個成員發出的廣播包。可見,LAN 的邊界在路由器或者類似的3層裝置。
VLAN 表示 Virutal LAN。一個帶有 VLAN 功能的switch 能夠同時處於多個 LAN 中。最簡單地說,VLAN 是一種將一個交換機分成多個交換機的一種方法。比方說,你有兩組機器,group A 和 B,你想配置成組 A 中的機器可以相互訪問,B 中的機器也可以相互訪問,但是A組中的機器不能訪問B組中的機器。你可以使用兩個交換機,兩個組分別接到一個交換機。如果你只有一個交換機,你可以使用 VLAN 達到同樣的效果。你在交換機上分配配置連線組A和B的機器的埠為 VLAN access ports。這個交換機就會只在同一個 VLAN 的埠之間轉發包。
(圖1)
IEEE 802.1Q 標準定義了 VLAN Header 的格式。它在普通乙太網幀結構的 SA (src addr)之後加入了 4bytes 的 VLAN Tag/Header 資料,其中包括 12-bits 的 VLAN ID。VLAN ID 最大值為4096,但是有效值範圍是 1 - 4094。
(圖2)
帶 VLAN 的交換機的埠分為兩類:
- Access port: 一個 access port 只支援一個VLAN。 一個 access port 往往被分配一個 vlan id。 根據交換機的不同實現,有些交換機只能支援發到 access port 的資料幀中沒有 vlan tag,而有些則支援資料幀中有vlan id tag 但是需要與埠的 vlan id 相同。離開交換機的 Access port 然後進入計算機的以太幀中沒有 VLAN Tag,這意味著連線到 access ports 的機器不會覺察到 VLAN 的存在。
- 如果進來的資料幀沒有 vlan tag,它通過 access port 後,會被插入 vlan id tag。 如果進來的一個數據幀帶有 vlan id tag,它會被丟棄。
- 如果進來的資料幀沒有 vlan tag,它通過 access port 後,會被插入 vlan id tag。 如果進來的一個數據幀帶有 vlan id tag 並且與 access port 所分配的 vlan id 相同,那麼它會被轉發;如果不同,則會被丟棄。
- Trunk port: 一個 trunk port 支援多個 VLAN。 它通常用於連線交換機。有多個交換機時,組A中的部分機器連線到 switch 1,另一部分機器連線到 switch 2。要使得這些機器能夠相互訪問,你需要連線兩臺交換機。 要避免使用一根電纜連線每個 VLAN 的兩個埠,我們可以在每個交換機上配置一個 VLAN trunk port。Trunk port 發出和收到的資料包都帶有 VLAN header,該 header 表明了該資料包屬於那個 VLAN。因此,只需要分別連線兩個交換機的一個 trunk port 就可以轉發所有的資料包了。通常來講,只使用 trunk port 連線兩個交換機,而不是用來連線機器和交換機,因為機器不想看到它們收到的資料包帶有 VLAN Header。有時候,如果一個機器需要發出帶有不同 VLAN ID 的資料包,那麼與它相連的交換機的口也需要被設定為 trunk port。
For Catalyst 2970 Switch Software Configuration Guide, 12.1(19)EA1:
An access port belongs to and carries the traffic of only one VLAN. Traffic is received and sent in native formats with no VLAN tagging. Traffic arriving on an access port is assumed to belong to the VLAN assigned to the port. If an access port receives a tagged packet (Inter-Switch Link [ISL] or 802.1Q tagged), the packet is dropped, and the source address is not learned.
For Catalyst 3550 Multilayer Switch Software Configuration Guide, 12.1(19)EA1:
An access port belongs to and carries the traffic of only one VLAN. Traffic is received and sent in native formats with no VLAN tagging. Traffic arriving on an access port is assumed to belong to the VLAN assigned to the port. If an access port receives a tagged packet (Inter-Switch Link [ISL] or 802.1Q tagged) for the VLAN assigned to the port, the packet is forwarded. If the port receives a tagged packet for another VLAN, the packet is dropped, the source address is not learned, and the frame is counted in the No destination statistic.
(圖3)
1.1.2 VLAN 的型別
(1)基於埠的 VLAN (untagged VLAN - 埠屬於一個VLAN,資料幀中沒有VLAN tag)
這種模式中,在交換機上建立若干個VLAN,在將若干埠放在每個VLAN 中。每個埠在某一時刻只能屬於一個VLAN。一個 VLAN 可以包含所有埠,或者部分埠。每個埠有個PVID (port VLAN identifier)。這種模式下,一個埠上收到的 frame 是 untagged frame,因此它不包含任何有關 VLAN 的資訊。VLAN 的關係只能從埠的 PVID 上看出來。交換機在轉發 frame 時,只將它轉發到相同 PVID 的埠。
如上圖所示,連線兩個交換機的同一個 VLAN 中的兩個計算機需要通訊的話,需要在兩個交換機之間連兩根線:
- 一根從 Switch A 埠4 到 Switch B 埠 4 (VLAN 1)
- 一根從 Switch A 埠8 到 Switch B 埠 8 (VLAN 2)
(2)Tagged VLANs (資料幀中帶有 VLAN tag)
這種模式下,frame 的VLAN 關係是它自己攜帶的資訊中儲存的,這種資訊叫 a tag or tagged header。當交換機收到一個帶 VLAN tag 的幀,它只將它轉發給具有同樣 VID 的埠。一個能夠接收或者轉發 tagged frame 的埠被稱為 a tagged port。所有連線到這種埠的網路裝置必須是 802.1Q 協議相容的。這種裝置必須能處理 tagged frame,以及新增 tag 到其轉發的 frame。
上圖中,兩個交換機上的埠8 支援 VLAN 1 和 2, 因此一根線就可以了實現跨交換機的同VLAN 內的計算機互相通訊了。
在實際的VLAN 配置中的各種情況:
- 交換機的所有埠,部分是 tagged port,部分被新增到 VLAN 中。
- 一個 untagged port,不管它是一個基於埠的VLAN 的一個成員還是一個 tagged VLAN 中的一個成員,一個時刻只能在一個 VLAN 中。
- 一個 tagged port,可以是多個 VLAN 的成員。
- 一個 port,可以同時是一個 VLAN 的 untagged member,以及不同 VLAN 中的 tagged member。
1.1.3 交換機埠型別
乙太網埠有三種鏈路型別:Access、Hybrid和Trunk。
- Access型別的埠只能屬於1個VLAN,一般用於連線計算機的埠
這種型別的埠允許接收沒有打標籤的幀,再發出去時將會被打上標籤。
(圖片來源)
- Trunk型別的埠可以屬於多個VLAN,可以接收和傳送多個VLAN的報文,一般用於交換機之間連線的埠
(圖片來源)
在配置 trunk 口時,可以指定允許接收的VLAN 的 ID 區間,還可以配置一個 Native VLAN (預設VID,也稱為 PVID)。當設定了 PVID 時,沒有打標籤的進來的幀將被打上PVID 的 tag再被髮出去。
- Hybrid型別的埠可以屬於多個VLAN,可以接收和傳送多個VLAN的報文,可以用於交換機之間連線,也可以用於連線使用者的計算機。Hybrid埠和Trunk埠的不同之處在於Hybrid埠可以允許多個VLAN的報文傳送時不打標籤,而Trunk埠只允許預設VLAN的報文傳送時不打標籤。
各種型別:
- Access (接收) Tagged = PVID 不接收 注:部分高階產品可能接收。
- Access (接收) Tagged =/ PVID 不接收 注:部分高階產品可能接收。
- Access (接收) Untagged 接收 增加tag=PVID 從PC
- Access (傳送) Tagged = PVID 轉發 刪除tag
- Access (傳送) Tagged =/ PVID 不轉發 不處理
- Access (傳送) Untagged 無此情況
- Trunk (接收) Tagged = PVID 接收 不修改tag
- Trunk (接收) Tagged =/ PVID 接收 不修改tag
- Trunk (接收) Untagged 接收 增加tag=PVID
- Trunk (傳送) Tagged = PVID If Passing then 轉發 刪除tag
- Trunk (傳送) Tagged =/ PVID If Passing then 轉發 不修改tag
- Trunk (傳送) Untagged 無此情況
- Hybrid (接收) Tagged = PVID 接收 不修改tag 對端是trunk
- Hybrid (接收) Tagged =/ PVID 接收 不修改tag 對端是trunk
- Hybrid (接收) Untagged 接收 增加tag=PVID 類Trunk
- Hybrid (傳送) Tagged = PVID Tag 和 untag 中列出的vlan可以passing 看Tag項和untag項
- Hybrid (傳送) Tagged =/ PVID Tag 和 untag 中列出的vlan可以passing 看Tag項和untag項
- Hybrid (傳送) Untagged 無此情況
解釋:
- 主機只能處理標準以太幀(沒打標籤的),交換機內部的幀都是打了標籤的。
- 收報文:Acess埠1 收到一個報文,判斷是否有VLAN資訊:如果沒有則打上埠的PVID,並進行交換轉發,如果有則直接丟棄(預設)
- 發報文:Acess埠1 將報文的VLAN資訊剝離,直接傳送出去
- 收報文:trunk埠: 1、收到一個報文,判斷是否有VLAN資訊:如果沒有則打上埠的PVID,並進行交換轉發,如果有判斷該trunk埠是否允許該 VLAN的資料進入:如果可以則轉發,否則丟棄
- 發報文:trunk埠: 1、比較埠的PVID和將要傳送報文的VLAN資訊,如果兩者相等則剝離VLAN資訊,再發送,如果不相等則直接傳送
- 收報文: hybrid埠: 1、收到一個報文 2、判斷是否有VLAN資訊:如果沒有則打上埠的PVID,並進行交換轉發,如果有則判斷該hybrid埠是否允許該VLAN的資料進入:如果可以則轉發,否則丟棄
- 發報文:hybrid埠:1、判斷該VLAN在本埠的屬性(disp interface 即可看到該埠對哪些VLAN是untag, 哪些VLAN是tag)2、如果是untag則剝離VLAN資訊,再發送,如果是tag則直接傳送
tagged (進) | untagged(進) | 出 (交換機在做交換時,只會把幀發給包含其 VID 的埠) | |
Access 埠 | 丟棄 | 打上 PVID | 剝離 VID,此時的幀為標準乙太網幀 |
Trunk 埠 | 如果是允許的,則不變;否則丟棄 | 打上 PVID | 如果 VID 與 PVID 不同,則透傳;如果 VID 與 PVID 相同,則剝離 VID |
1.1.4 VLAN 的不足
- VLAN 使用 12-bit 的 VLAN ID,所以 VLAN 的第一個不足之處就是它最多隻支援 4096 個 VLAN 網路(當然這還要除去幾個預留的),對於大型資料中心的來說,這個數量是遠遠不夠的。
- VLAN 是基於 L2 的,所以很難跨越 L2 的邊界,在很大程度上限制了網路的靈活性。
- VLAN 操作需手工介入較多,這對於管理成千上萬臺機器的管理員來說是難以接受的。
1.2 二層交換的基礎知識
1.2.1 二層交換機最基本的功能
二層交換機最基本的功能包括:
- MAC 地址學習:當交換機從它的某個埠收到資料幀時,它將埠的 ID 和幀的源 MAC 地址儲存到它的內部MAC表中。這樣,當將來它收到一個要轉發到該 MAC 地址的幀時,它就知道直接從該埠轉發出去了。
- 資料幀轉發:交換機在將從某個埠收到資料幀,再將其從某個埠轉發出去之前,它會做一些邏輯判斷:
- 如果幀的目的 MAC 地址是廣播或者多播地址的話,將其從交換機的所有埠(除了傳入埠)上轉發。
- 如果幀的目的MAC地址在它的內部MAC表中能找到對應的輸出埠的話(MAC 地址學習過程中儲存的),將其從該埠上轉發出去。
- 對其它情況,將其從交換機的所有埠(除了傳入埠)上轉發。
-
加 VLAN 標籤/去 VLAN 標籤:
- 幀接收:從 trunk port 上收到的資料幀必須是加了標籤的。從 access port 上收到的資料幀必須是沒有加標籤的,否則該幀將會被拋棄。
- 幀處理:根據上述轉發流程決定其發出的埠。
- 幀發出:從 trunk port 發出的幀是加了標籤的。從 access port 上發出的幀必須是沒加標籤的。
預設情況下,交換機的所有埠都處於VLAN 1 中,也就相當於沒有配置 VLAN。該機制說明如下:
(圖4)
- PC A 發一個幀到交換機的 1 埠,其目的MAC地址為 PC B 的 MAC。
- 交換機比較其目的 MAC 地址和它的內部 MAC Table,發現它不存在(此時表為空)。在決定泛洪之前,它把埠 1 和 PC A 的 MAC 地址存進它的 MAC Table。
- 交換機將幀拷貝多份,分別從2和3埠發出。
- PC B 收到該幀以後,發現其目的 MAC 地址和他自己的 MAC 地址相同。它發出一個回覆幀進入埠3。
- 交換機將 PC B 的 MAC地址和埠3 存在它的 MAC 表中。
- 因為該幀的目的地址為PC A 的 MAC 地址它已經在 MAC 表中,交換機直接將它轉發到埠1,達到PC A。
配置了 VLAN 的交換機的該機制類似,只不過:
(1)MAC 表格中每一行有不同的 VLAN ID。做比較的時候,拿傳入幀的目的 MAC 地址和 VLAN ID 和此表中的行資料相比較。如果都相同,則選擇其 Ports 作為轉發出口埠。
(圖5)
(2)如果沒有吻合的表項,則將此幀從所有有同樣 VLAN ID 的 Access ports 和 Trunk ports 轉發出去。
1.2.2 Address Resolution Protocol (ARP) 原理
二層網路使用 MAC (media access control address)地址作為硬體的唯一標識。基於 TCP/IP 協議的軟體使用 ARP 來將 IP 地址轉化為 MAC 地址。
1. 目的 IP 地址在同一網段的話
(圖6)
該示例中,Host A 和 B 在同一個網段中。A 的 IP 地址是 10.0.0.99,B 的 IP 地址是 10.0.0.100。當 A 要和 B 通訊時,A 需要知道 B 的 MAC 地址。該過程經過以下步驟: (1)A 上的 IP 協議棧知道通過B 的 IP 地址可以直接到達 B。A 檢查它的本地 ARP 快取來看B 的 MAC 地址是否已經存在。 (2)如果A 沒有發現B 的 MAC 地址,它發出一個 ARP 廣播請求,來詢問“10.0.0.100 的 MAC 地址是什麼?”,該資料包:SRC MAC: A 的 MAC
DST MAC:FF:FF:FF:FF:FF:FF
SRA IP: A 的 IP
DST IP: B 的 IP
(3)該網段中所有的電腦都將收到該包,並且會檢查 DST IP 和自己的IP 是否相同。如果不同,則丟棄該包。Host B 發現其IP 地址和 DST IP 相同,它將 A 的 IP/MAP 地址加入到自己的ARP 快取中。
(4)B 發出一個 ARP 回覆訊息
SRC MAC: B 的 MAC
DST MAC:A 的 MAC
SRA IP: B 的 IP
DST IP: A 的 IP
(5)交換機直接將該包交給 host A。A 收到後,將 B 的 MAC/IP 地址快取到 ARP 快取中。
(6)A 使用 B 的 MAC 作為目的 MAC 地址發出 IP 包。
2. 目的IP 地址不在同一個網段的話
(圖7)
本例子中,A 的地址是 10.0.0.99, B 的地址是 192.168.0.99。Router 的 interface 1 和 A 在同一個網段,其IP 地址為10.0.0.1;interface 2 和 B 在同一個網段,其IP地址為 192.168.0.1。
A 使用下面的步驟來獲取 Router 的 interface 1 的 MAC 地址。
(1)根據其路由表,A 上的 IP 協議知道需要通過它上面配置的 gateway 10.0.0.1 才能到達到 B。經過上面例子中的步驟,A 會得到 10.0.0.1 的 MAC 地址。
(2)當 A 收到 Router interface 1 的 MAC 地址後,A 發出了給B 的資料包:
SRC MAC: A 的 MAC DST MAC:Router 的 interface 1 的 MAC 地址 SRA IP: A 的 IP DST IP: B 的 IP(3)路由器的 interface1 收到該資料包後,根據其路由表,首先經過同樣的ARP 過程,路由器根據 B 的 IP 地址通過 ARP 獲得其 MAC 地址,然後將包發給它。
SRC MAC: Router interface 2 的 MAC DST MAC:B 的 MAC SRA IP: A 的 IP DST IP: B 的 IP
2. 使用 Open vSwitch (OVS)+ VLAN 組網
Neutron 基於 VLAN 模式的 tenant network 同 provider network 一樣,都必須使用物理的 VLAN 網路。
2.1 物理 VLAN 網路配置
本例子中,交換機上劃分了三個 VLAN 區域:
- 管理網路,用於 OpenStack 節點之間的通訊,假設 VLAN ID 範圍為 50 - 99.
- 資料網路,用於虛擬機器之間的通訊。由於Vlan模式下,租戶建立的網路都具有獨立的 Vlan ID,故需要將連線虛機的伺服器的交換機埠設定為 Trunk 模式,並且設定所允許的 VLAN ID 範圍,比如 100~300。
- 外部網路,用於連線外部網路。加上 VLAN ID 範圍為 1000-1010。
(圖8)
關於網段之間的路由:
- 如果該物理交換機接到一個物理路由器並做相應的配置,則資料網路可以使用這個物理路由器,而不需要使用 Neutron 的虛擬路由器。
- 如果不使用物理的路由器,可以在網路節點上配置虛擬路由器。
2.2 Neutron 配置
2.2.1 配置進行
控制節點上:
# vim /etc/neutron/plugins/ml2/ml2_conf.ini [ml2] type_drivers = flat,vlan
tenant_network_types = vlan
mechanism_drivers = openvswitch
[ml2_type_flat]
flat_networks = external
[ml2_type_vlan]
network_vlan_ranges = physnet1:100:300
網路節點上:
#為連線物理交換機的網絡卡 eth2 和 eth3 建立 OVS physical bridge,其中,eth2 用於資料網路,eth3 用於外部網路 ovs-vsctl add-br br-eth2
ovs-vsctl add-br br-ex ovs-vsctl add-port br-eth2 eth2
ovs-vsctl add-port br-ex eth3 # vim /etc/neutron/plugins/ml2/ml2_conf.ini
[m12] type_drivers = flat,vlan
tenant_network_types = vlan
mechanism_drivers = openvswitch
[ml2_type_flat]
flat_networks = external
[ml2_type_vlan]
network_vlan_ranges = physnet1:100:300,external:1000:1010
[ovs]
bridge_mappings = physnet1:br-eth2,external:br-ex
計算節點上:
#為連線物理交換機的網絡卡 eth2 建立 OVS physical bridge
ovs-vsctl add-br br-eth2
ovs-vsctl add-port br-eth2 eth2
# vim /etc/neutron/plugins/ml2/ml2_conf.ini
[m12]
type_drivers = vlan
tenant_network_types = vlan
mechanism_drivers = openvswitch
[ml2_type_vlan]
network_vlan_ranges = physnet1:100:300
[ovs]
bridge_mappings = physnet1:br-eth2
注意:
- network_vlan_ranges 中的 VLAN ID 必須和物理交換機上的 VLAN ID 區間一致。
- bridge_mappings 中所指定的 bridge 需要和在個節點上手工建立的 OVS bridge 一致。
然後重啟相應的 Neutron 服務。
2.2.2 配置生效過程
當 Neutron L2 Agent (OVS Agent 或者 Linux Bridge agent)在計算和網路節點上啟動時,它會根據各種配置在節點上建立各種 bridge。以 OVS Agent 為例,
(1)建立 intergration brige(預設是 br-int);如果 enable_tunneling = true 的話,建立 tunnel bridge (預設是 br-tun)。
(2)根據 bridge_mappings,配置每一個 VLAN 和 Flat 網路使用的 physical network interface 對應的預先建立的 OVS bridge。
(3)所有虛機的 VIF 都是連線到 integration bridge。同一個虛擬網路上的 VM VIF 共享一個本地 VLAN (local VLAN)。Local VLAN ID 被對映到虛擬網路對應的物理網路的 segmentation_id。
(4)對於 GRE 型別的虛擬網路,使用 LSI (Logical Switch identifier)來區分隧道(tunnel)內的租戶網路流量(tenant traffic)。這個隧道的兩端都是每個物理伺服器上的 tunneling bridge。使用 Patch port 來將 br-int 和 br-tun 連線起來。
(5)對於每一個 VLAN 或者 Flat 型別的網路,使用一個 veth 或者一個 patch port 對來連線 br-int 和物理網橋,以及增加 flow rules等。
(6)最後,Neutron L2 Agent 啟動後會執行一個RPC迴圈任務來處理 埠新增、刪除和修改。管理員可以通過配置項 polling_interval 指定該 RPC 迴圈任務的執行間隔,預設為2秒。
2.3 建立虛擬網路和子網
2.3.1 建立命令
[email protected]:~$ neutron net-create net1 (或者 Admin 使用者執行 neutron net-create net1 --provider:network_type vlan --provider:physical_network physnet1 --provider:segmentation_id 101。效果相同) Created a new network: +---------------------------+--------------------------------------+ | Field | Value | +---------------------------+--------------------------------------+ | admin_state_up | True | | id | dfc74f44-a9f2-4497-a53d-1723804a49a8 | | name | net1 | | provider:network_type | vlan | | provider:physical_network | physnet1 | | provider:segmentation_id | 101 | | router:external | False | | shared | False | | status | ACTIVE | | subnets | | | tenant_id | 74c8ada23a3449f888d9e19b76d13aab | +---------------------------+--------------------------------------+ [email protected]:~$ neutron subnet-create subnet1 10.0.0.0/24 --name net1
2.3.2 Neutron 程式碼實現
做完以上的步驟之後,使用者就可以在 subnet 上 boot 虛機了。
boot 虛機的過程中,Nova 依次會:
(1)呼叫 Neutron REST API 申請一個或者多個 port。Neutron 會根據資料庫中的配置來進行分配。
(2)在計算節點上,Nova 呼叫 ovs-vsctl 命令將虛機的 VIF 被 plug 到 br-int 上。
(3)啟動虛機。
Neutron L2 Agent 的迴圈任務每隔兩秒會依次:
(1)呼叫 ”ovs-vsctl list-ports“ 命令獲取到 br-int 上的 port,再根據上次儲存的歷史資料,生成所有變更埠的列表(包括新增的、更新的、刪除的埠)。比如:
{'current': set([u'04646b21-78a0-429e-85be-3167042b77be', u'592740b0-0768-4e57-870d-6495e6c22135']), 'removed': set([]), 'added': set([u'04646b21-78a0-429e-85be-3167042b77be', u'592740b0-0768-4e57-870d-6495e6c22135'])}
(2)為每一個待處理埠,根據其 ID 從 DB 中取得其詳細資訊。比如:
{u'profile': {}, u'admin_state_up': True, u'network_id': u'e2022937-ec2a-467a-8cf1-f642a3f777b6', u'segmentation_id': 4, u'device_owner': u'compute:nova', u'physical_network': phynet1, u'mac_address': u'fa:16:3e:fd:ed:22', u'device': u'592740b0-0768-4e57-870d-6495e6c22135', u'port_id': u'592740b0-0768-4e57-870d-6495e6c22135', u'fixed_ips': [{u'subnet_id': u'13888749-12b3-462e-9afe-c527bd0a297e', u'ip_address': u'91.1.180.4'}], u'network_type': u'vlan'}
(3)針對每一個增加或者變更的 port,設定 local VLAN Tag;呼叫 ”ovs-ofctl mod-flows “ 命令來設定 br-tun 或者 物理 bridge 的 flow rules;並設定 db 中其狀態為 up。
(4)針對每一個被刪除的 port,設定 db 中其狀態為 down。
2.4 Neutron 虛擬網路
(1)一個計算節點上的網路例項
它反映的網路配置如下:
- Neutron 使用 Open vSiwtch。
- 一臺物理伺服器,網絡卡 eth1 接入物理交換機,預先配置了網橋 br-eth1。
- 建立了兩個 neutron VLAN network,分別使用 VLAN ID 101 和 102。
- 該伺服器上執行三個虛機,虛機1 和 2 分別有一個網絡卡接入 network 1;虛機2 和 3 分別有一個網絡卡接入 network 2.
(圖9)
Neutron 在該計算節點上做的事情:
- 建立了 OVS Integration bridge br-int。它的四個 Access 埠中,兩個打上了內部 Tag 1,連線接入 network 1 的兩個網絡卡;另兩個埠的 VLAN Tag 為 2。
- 建立了一對 patch port,連線 br-int 和 br-eth1。
- 設定 br-int 中的 flow rules。對虛機過來的從 access ports 進入 br-int 的資料幀,會被加上相應的 VLAN Tag,轉發到 patch port;從 patch port 進入的資料幀,將 VLAN ID 101 修改為 1, 102 修改為 2,再轉發到相應的 Access ports。
- 設定 br-eth1 中的 flow rules。從 patch port 進入的資料幀,將內部 VLAN ID 1 修改為 101,內部 VLAN ID 2 修改為 102,再從 eth1 埠發出。對從 eth1 進入的資料幀做相反的處理。
兩個說明:
- 使用該設計時,br-int 只能接收虛機發出的網路包沒有加 vlan tag,也就是 untagged。
- 在某些場景中,虛機發出的包需要有 vlan tag。 Neutron 的 BP https://blueprints.launchpad.net/neutron/+spec/vlan-aware-vms 實現了一種方案,而且程式碼已經合併。『This blueprint proposes how to incorporate VLAN aware VM:s into OpenStack. In this document a VLAN aware VM is a VM that sends and receives VLAN tagged frames over its vNIC.』
(2)再加上另一個連線到同一個物理交換機的伺服器(加上 neutron 網路使用的 VLAN ID 為 100,物理 brige 為 br-eth0):
(圖10)
Neutron 實現了基於物理 VLAN 交換機的跨物理伺服器二層虛擬網路。
(3)連線到同一物理交換機的網路節點的情況
(圖11)
(4)網路流向
- 不同物理伺服器上的虛機,如果 VM1 和 VM2 屬於同一個 tenant network 的同一個subnet,那麼兩者的通訊直接經過 物理交換機 進行,不需要做到網路節點。如圖10 所示。
- 相同物理伺服器上的虛機,如果 VM1 和 VM2 屬於同一個 tenant network 的同一個subnet,那麼兩者的通訊直接經過 br-int 進行。
- 對其他虛機之間資料交換情形,都算作跨子網的資料流向,都需要經過網路節點中的 Router 進行 IP 包的路由。(也可以直接使用連線物理交換機的物理路由器)。
更詳細的網路流向分析可以參考我另外的幾篇文章:
注:本文所有的圖片皆來自網際網路。
歡迎大家關注我的個人公眾號:
相關推薦
Neutron 理解 (2): 使用 Open vSwitch + VLAN 組網 [Neutron Open vSwitch + VLAN Virtual Network]
學習 Neutron 系列文章: 1. L2 基礎知識 1.1 VLAN 基礎知識 1.1.1 VLAN 的含義 LAN 表示 Local Area Network,本地區域網,通常使用 Hub 和 Switch 來連線LAN 中的計算機。一般
Neutron 理解 (9): OpenStack 是如何實現 Neutron 網路 和 Nova虛機 防火牆的 [How Nova Implements Security Group and How Neutron Implements Virtua
學習 Neutron 系列文章: 1. Nova 安全組 1.1 配置 節點 配置檔案 配置項 說明 controller /etc/nova/nova.conf security_group_api =
Neutron 理解 (3): Open vSwitch + GRE/VxLAN 組網 [Netruon Open vSwitch + GRE/VxLAN Virutal Network]
學習 Neutron 系列文章: 目前,OpenStack Neutron 支援使用兩種隧道網路技術 通用路由封裝(GRE) 和 VxLAN 來實現虛擬的二層網路。這兩種技術大致看起來非常相似,都是需要使用 OpenStack 在計算和網路節點
Neutron 理解(14):Neutron ML2 + Linux bridge + VxLAN 組網
學習 Neutron 系列文章: 1. 基礎知識 1.1 VXLAN 和 Linux 以及 Linux bridge 的關係 VXLAN 是一個新興的SDN 標準,它定義了一種新的 overlay 網路,它主要的創造者是 VMware,
理解OpenShift(1):網路之 Router 和 Route Neutron 理解 (7): Neutron 是如何實現負載均衡器虛擬化的
理解OpenShift(1):網路之Router 和 Route 1. OpenShift 為什麼需要 Router 和 Route? 顧名思義,Router 是路由器,Route 是路由器中配置的路由。OpenShift 中的這兩個概念是為了解決從叢集外部(就是從除了叢集節點
Neutron 理解 (6): Neutron 是怎麼實現虛擬三層網路的 [How Neutron implements virtual L3 network]
學習 Neutron 系列文章: Neutron 對虛擬三層網路的實現是通過其 L3 Agent (neutron-l3-agent)。該 Agent 利用 Linux IP 棧、route 和 iptables 來實現內網內不同網路內的虛機之間的網路流量
Neutron 理解 (4): Neutron OVS OpenFlow 流表 和 L2 Population [Netruon OVS OpenFlow tables + L2 Population]
學習 Neutron 系列文章: OVS bridge 有兩種模式:“normal” 和 “flow”。“normal” 模式的 bridge 同普通的 Linux 橋,而 “flow” 模式的 bridge 是根據其流表(flow tab
Neutron 理解 (1): Neutron 所實現的網路虛擬化 [How Neutron Virtualizes Network]
學習 Neutron 系列文章: 1. 為什麼要網路虛擬化? 個人認為,這裡主要有兩個需求:一個是資料中心的現有網路不能滿足雲端計算的物理需求;另一個是資料中心的現有網路不能滿足雲端計算的軟體化即SDN要求。 1.1 現有物理網路不能
Neutron 理解 (8): Neutron 是如何實現虛機防火牆的 [How Neutron Implements Security Group]
學習 Neutron 系列文章: 1. 基礎知識 1.1 防火牆(firewall) 防火牆是依照特定的規則來控制進出它的網路流量的網路安全系統。一個典型的場景是在一個受信任的內網和不受信任的外網比如 Internet 之間建立一個屏障。防火牆
Neutron 理解 (7): Neutron 是如何實現負載均衡器虛擬化的 [LBaaS V1 in Juno]
學習 Neutron 系列文章: 1. 基礎知識 1.1 負載均衡的概念 負載均衡(Load Balancing)是將來訪的網路流量在執行相同應用的多個伺服器之間進行分發的一種核心網路服務。它的功能由負載均衡器(load balancer)提供。負
OpenStack Neutron(2):建立私有網路並與公網相連
在OpenStack中,建立instance之前必須建立網路。這裡通過Dashbord建立私有網路並且通過虛擬路由器與公網相連。私有網路即Tenant network。1. 建立私有網路及其子網登入Dashbord->Project->Network->Ne
Neutron 理解 (1): Neutron 所實現的虛擬化網路 [How Netruon Virtualizes Network]
1. 為什麼要網路虛擬化? 個人認為,這裡主要有兩個需求:一個是資料中心的現有網路不能滿足雲端計算的物理需求;另一個是資料中心的現有網路不能滿足雲端計算的軟體化即SDN要求。 1.1 現有物理網路不能滿足雲端計算的需求 網際網路行業資料中心的基本特徵就是伺服
Ocata Neutron代碼分析(一)——Neutron API啟動過程分析
process fig ddr arch 異常 run tap 文件中 bridge 首先,Neutron Server作為一種服務(neutron-server.service),可以到Neutron項目目錄中的setup.cfg配置文件中找到對應的代碼入口。 [ent
Ocata Neutron代碼分析(二)——Neutron RPC啟動過程分析
gre add ice common multi tween wait函數 tex 依次 RPC啟動跟Neutron API的啟動在同一個函數中執行,neutron.server.wsgi_eventlet.py中的eventlet_wsgi_server。 def ev
Caffe原始碼理解2:SyncedMemory CPU和GPU間的資料同步
目錄 寫在前面 成員變數的含義及作用 構造與析構 記憶體同步管理 參考 部落格:blog.shinelee.me | 部落格園 | CSDN 寫在前面 在Caffe原始碼理解1中介紹了Blob類,其中的資料成員有 shared_ptr<SyncedMemory>
javascript閉包理解2
閉包的形成需要兩個條件: 1.在函式內部建立新的函式; 2.新的函式在執行時,訪問了函式的變數物件; 總結一下閉包: 閉包是在函式被呼叫執行的時候才被確認建立的。 閉包的形成,與作用域鏈的訪問順序有直接關係。 只有內部函式訪問了上層作用域鏈中的變數物件時,才會
CocosCreator之KUOKUO帶你理解2代引擎的微信主域子域及排行榜模版連結
本次引擎2.0.5 編輯工具VSCode 目標:理解2代引擎的微信主域子域及排行榜模版 首先我們要明白為什麼需要主域跟子域(微信的原因) 一代引擎需要用程式碼把子域紋理重新整理到主域。 官方在二代引擎推出了一個好東西: 什麼呢?我們往下看。 官方二代案例下載 這
【ShaderLab學習】AlphaTest & AlphaBlend理解[2]
Alpha Blend 透明混合使用當前片元的透明度作為混合因子,與已儲存在顏色緩衝中的顏色值進行混合,得到新的顏色。需要注意的是,透明度混合需要關閉深度寫入,這時候要注意物體的渲染順序。 源顏色(當
ASP.Net Core 2.2使用SQLite資料庫unable to open database file
原文: ASP.Net Core 2.2使用SQLite資料庫unable to open database file 最近把專案更新到了ASP.Net Core 2.2,釋出之後發現在IIS下使用SQLite資料庫不行了,報異常說不能開啟資料庫。"unable to open database file"
正則元字元理解2
小括號就是括號內看成一個整體 ,中括號就是匹配括號內的其中一個,大括號就是匹配幾次 例如: reg = /(123)/就匹配num =123,num = 1234,不匹配num = 234 reg = /[1,2,3]/就匹配num = 1,num = 2,num =3,不匹配num =5 reg =