1.1 vlan介紹
本小節重點:
-
vlan的含義
-
vlan的類型
-
交換機端口類型
-
vlan的不足
1.1.1 vlan的含義
局域網LAN的發展是VLAN產生的基礎,因而先介紹一下局域網LAN
由Hub、網橋或交換機等網絡設備連接同一網段內的所有節點形成局域網(LAN),通常是一個單獨的廣播域
處於同一個局域網LAN之內的網絡節點之間可以直接通信
處於不同局域網段的設備之間的通信則必須經過路由器才能通信
上述傳統拓撲結構的關鍵在於用三層設備,即路由器,來隔離不同共的LAN,在網絡規模增大的情況下存在兩個缺陷:
1.路由器數量需要增多,網絡時延隨之增加,進而導致網絡數據傳輸速度的下降。這主要是因為數據在從一個局域網傳遞到另一個局域網時,必須經過路由器的路由操作:路由器根據數據包中的相應信息確定數據包的目標地址,然后再選擇合適的路徑轉發出去。
2.用戶是按照它們的物理連接被自然地划分到不同的用戶組(廣播域)中。這種分割方式並不是根據工作組中所有用戶的共同需要和帶寬的需求來進行的。因此,盡管不同的工作組或部門對帶寬的需求有很大的差異,但它們卻被機械地划分到同一個廣播域中爭用相同的帶寬。
綜上兩點,必須選出一種隔離廣播域的方式,兼備下述兩點
1.可以不用通過路由器來隔離不同廣播域
2.可以突破地理位置的限制,再邏輯上划分出不同的廣播域
這就是VLAN,IEEE 802.1Q 標准定義了VLAN Header 的格式。它再普通以太網幀結構的SA(srcaddr)之后加入了4bytes的VLAN Tag/Header 數據,其中包括12-bits的VLAN ID。VLAN ID最大值為4096,但是有效值范圍是1-4094
帶VLAN的交換機分為兩類:
-
Access port:這些端口被打上了VLAN Tag。離開交換機的Access port進入計算機的以太幀中沒有VLAN Tag,這意味着連接到access port的機器不會察覺到VLAN的存在。離開計算機進入這些端口的數據幀都被打上了VLAN Tag。
-
Trunk port: 有多個交換機時,組A中的部分機器連接到 switch 1,另一部分機器連接到 switch 2。要使得這些機器能夠相互訪問,你需要連接兩台交換機。 要避免使用一根電纜連接每個 VLAN 的兩個端口,我們可以在每個交換機上配置一個 VLAN trunk port。Trunk port 發出和收到的數據包都帶有 VLAN header,該 header 表明了該數據包屬於那個 VLAN。因此,只需要分別連接兩個交換機的一個 trunk port 就可以轉發所有的數據包了。通常來講,只使用 trunk port 連接兩個交換機,而不是用來連接機器和交換機,因為機器不想看到它們收到的數據包帶有 VLAN Header。
單台交換機上划分VLAN
多態交換機上划分VLAN
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。
1.1.3 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標簽/去VALAN標簽:
-
-
幀接收:從 trunk port 上收到的數據幀必須是加了標簽的。從 access port 上收到的數據幀必須是沒有加標簽的,否則該幀將會被拋棄。
-
幀處理:根據上述轉發流程決定其發出的端口。
-
幀發出:從 trunk port 發出的幀是加了標簽的。從 access port 上發出的幀必須是沒加標簽的。
-
默認情況下,交換機的所有端口都處於VLAN 1 中,也就相當於沒有配置 VLAN。該機制說明如下:
-
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 作為轉發出口端口。
(2)如果沒有吻合的表項,則將此幀從所有有同樣 VLAN ID 的 Access ports 和 Trunk ports 轉發出去。
1.2.2 ARP協議
二層網絡使用 MAC (media access control address)地址作為硬件的唯一標識。基於 TCP/IP 協議的軟件使用 ARP 來將 IP 地址轉化為 MAC 地址。
\1. 目的 IP 地址在同一網段的話
該示例中,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 地址不在同一個網段的話
本例子中,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
二、使用OpenvSwitch(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。
關於網段之間的路由:
-
如果該物理交換機接到一個物理路由器並做相應的配置,則數據網絡可以使用這個物理路由器,而不需要使用 Neutron 的虛擬路由器。
-
如果不使用物理的路由器,可以在網絡節點上配置虛擬路由器。
2.2 Neutron配置
2.2.1 配置進行
控制節點上:
# vim /etc/neutron/plugins/ml2/ml2_conf.ini
[ml2]
type_drivers = flat,vlan tenant_network_types = vlanmechanism_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-eth2ovs-vsctl add-br br-ex
ovs-vsctl add-port br-eth2 eth2ovs-vsctl add-port br-ex eth3
# vim /etc/neutron/plugins/ml2/ml2_conf.ini [m12]
type_drivers = flat,vlantenant_network_types = vlanmechanism_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 = vlantenant_network_types = vlanmechanism_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 創建命令
s1@controller:~$ 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 |
+---------------------------+--------------------------------------+
s1@controller:~$ 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.
Neutron在該計算節點上做的事情:
創建了OVS Integration bridge br-int。它的四個Access口中,兩個打上了內部vlan Tag1,連接接入network1的兩個網卡;另外兩個端口打上的是vlan tag 2
創建一對patch port連接br-int和br-eth1
設置br-int中的flow rules。對從access ports進入的數據幀,加上相應的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端口發出。對從eht1進入的數據幀做相反的處理
(2)再加上另一個連接到同一個物理交換機的服務器(加上 neutron 網絡使用的 VLAN ID 為 100,物理 brige 為 br-eth0):
Neutron 實現了基於物理 VLAN 交換機的跨物理服務器二層虛擬網絡。
(3)連接到同一物理交換機的網絡節點的情況
(4)網絡流向
-
不同物理服務器上的虛機,如果 VM1 和 VM2 屬於同一個 tenant network 的同一個subnet,那么兩者的通信直接經過 物理交換機 進行,不需要做到網絡節點。如圖10 所示。
-
相同物理服務器上的虛機,如果 VM1 和 VM2 屬於同一個 tenant network 的同一個subnet,那么兩者的通信直接經過 br-int 進行。
對其他虛機之間數據交換情形,都算作跨子網的數據流向,都需要經過網絡節點中的 Router 進行 IP 包的路由。(也可以直接使用連接物理交換機的物理路由器)。