本小節重點:數據庫
局域網LAN的發展是VLAN產生的基礎,於是先介紹一下局域網LANvim
由Hub、網橋或交換機等網絡設備鏈接同一網段內的全部節點造成局域網(LAN),一般是一個單獨的廣播域。緩存
處於同一個局域網LAN以內的網絡節點之間能夠直接通訊服務器
處於不一樣局域網段的設備之間的通訊則必須通過路由器才能通訊。網絡
上述傳統拓撲結構的關鍵在於用三層設備,即路由器,來隔離不一樣的LAN,在網絡規模增大的狀況下存在兩個缺陷:
1. 路由器數量須要增多,網絡時延隨之加長,進而致使網絡數據傳輸速度的降低。這主要是由於數據在從一個局域網傳遞到另外一個局域網時,必須通過路由器的路由操做: 路由器根據數據包中的相應信息肯定數據包的目標地址,而後再選擇合適的路徑轉發出去。
2. 用戶是按照它們的物理鏈接被天然地劃分到不一樣的用戶組(廣播域)中。這種分割方式並非根據工做組中全部用戶的共同須要和帶寬的需求來進行的。所以,儘管不一樣的工做組或部門對帶寬的需求有很大的差別,但它們卻被機械地劃分到同一個廣播域中爭用相同的帶寬。
app
綜上兩點,必須選出一種隔離廣播域的方式,兼備下述兩點ide
1.能夠不用經過路由器來隔離不一樣廣播域 學習
2.能夠突破地理位置的限制,在邏輯上劃分出不一樣的廣播域spa
這就是VLAN,IEEE 802.1Q 標準定義了 VLAN Header 的格式。它在普通以太網幀結構的 SA (src addr)以後加入了 4bytes 的 VLAN Tag/Header 數據,其中包括 12-bits 的 VLAN ID。VLAN ID 最大值爲4096,可是有效值範圍是 1 - 4094。3d
帶 VLAN 的交換機的端口分爲兩類:
單臺交換機上劃分VLAN
多臺交換機上劃分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 中的兩個計算機須要通訊的話,須要在兩個交換機之間連兩根線:
(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 1 中,也就至關於沒有配置 VLAN。該機制說明以下:
配置了 VLAN 的交換機的該機制相似,只不過:
(1)MAC 表格中每一行有不一樣的 VLAN ID。作比較的時候,拿傳入幀的目的 MAC 地址和 VLAN ID 和此表中的行數據相比較。若是都相同,則選擇其 Ports 做爲轉發出口端口。
(2)若是沒有吻合的表項,則將此幀從全部有一樣 VLAN ID 的 Access ports 和 Trunk ports 轉發出去。
二層網絡使用 MAC (media access control address)地址做爲硬件的惟一標識。基於 TCP/IP 協議的軟件使用 ARP 來將 IP 地址轉化爲 MAC 地址。
1. 目的 IP 地址在同一網段的話
SRC MAC: A 的 MAC DST MAC:FF:FF:FF:FF:FF:FF SRA IP: A 的 IP DST IP: B 的 IP
SRC MAC: B 的 MAC DST MAC:A 的 MAC SRA IP: B 的 IP DST IP: A 的 IP
SRC MAC: A 的 MAC DST MAC:Router 的 interface 1 的 MAC 地址 SRA IP: A 的 IP DST IP: B 的 IP
SRC MAC: Router interface 2 的 MAC DST MAC:B 的 MAC SRA IP: A 的 IP DST IP: B 的 IP
Neutron 基於 VLAN 模式的 tenant network 同 provider network 同樣,都必須使用物理的 VLAN 網絡。
本例子中,交換機上劃分了三個 VLAN 區域:
關於網段之間的路由:
控制節點上:
# 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
注意:
而後重啓相應的 Neutron 服務。
當 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秒。
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
作完以上的步驟以後,用戶就能夠在 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。
(1)一個計算節點上的網絡實例
它反映的網絡配置以下:
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)網絡流向
對其餘虛機之間數據交換情形,都算做跨子網的數據流向,都須要通過網絡節點中的 Router 進行 IP 包的路由。(也能夠直接使用鏈接物理交換機的物理路由器)。