Neutron 理解 (1): Neutron 所實現的虛擬化網絡 [How Netruon Virtualizes Network]

1. 爲什麼要網絡虛擬化?

個人認爲,這裏主要有兩個需求:一個是數據中心的現有網絡不能滿足雲計算的物理需求;另一個是數據中心的現有網絡不能滿足雲計算的軟件化即SDN要求。

1.1 現有物理網絡不能滿足雲計算的需求

    互聯網行業數據中心的基本特徵就是服務器的規模偏大。進入雲計算時代後,其業務特徵變得更加複雜,包括:虛擬化支持、多業務承載、資源靈活調度等(如圖1所示)。與此同時,互聯網雲計算的規模不但沒有縮減,反而更加龐大。這就給雲計算的網絡帶來了巨大的壓力。

 

圖1. 互聯網雲計算的業務特點

(1)大容量的MAC表項和ARP表項

    虛擬化會導致更大的MAC表項。假設一個互聯網雲計算中心的服務器有5000臺,按照1:20的比例進行虛擬化,則有10萬個虛擬機。通常每個虛擬機會配置兩個業務網口,這樣這個雲計算中心就有20萬個虛擬網口,對應的就是需要20萬個MAC地址和IP地址。雲計算要求資源靈活調度,業務資源任意遷移。也就是說任意一個虛擬機可以在整個雲計算網絡中任意遷移。這就要求全網在一個統一的二層網絡中。全網任意交換機都有可能學習到全網所有的MAC表項。與此對應的則是,目前業界主流的接入交換機的MAC表項只有32K,基本無法滿足互聯網雲計算的需求。另外,網關需要記錄全網所有主機、所有網口的ARP信息。這就需要網關設備的有效ARP表項超過20萬。大部分的網關設備芯片都不具備這種能力。

(2)4K VLAN Trunk問題

傳統的大二層網絡支持任意VLAN的虛擬機遷移到網絡的任意位置,一般有兩種方式。方式一:虛擬機遷移後,通過自動化網絡管理平臺動態的在虛擬機對應的所有端口上下發VLAN配置;同時,還需要動態刪除遷移前虛擬機對應所有端口上的VLAN配置。這種方式的缺點是實現非常複雜,同時自動化管理平臺對多廠商設備還面臨兼容性的問題,所以很難實現。方式二:在雲計算網絡上靜態配置VLAN,在所有端口上配置VLAN trunk all。這種方式的優點是非常簡單,是目前主流的應用方式。但這也帶來了巨大的問題:任一VLAN內如果出現廣播風暴,則全網所有VLAN內的虛擬機都會受到風暴影響,出現業務中斷。

(3)4K VLAN上限問題

雲計算網絡中有可能出現多租戶需求。如果租戶及業務的數量規模超出VLAN的上限(4K),則無法支撐客戶的需求。

(4)虛擬機遷移網絡依賴問題

VM遷移需要在同一個二層域內,基於IP子網的區域劃分限制了二層網絡連通性的規模。

資料來源

1.2 雲計算的 SDN 要求

    數據中心(Data Center)中的物理網絡是固定的、需要手工配置的、單一的、沒有多租戶隔離的網絡。這是一個物理網絡局部實例:

 

(圖1, 來源:Cisco 網站。 TOR:Top On Rack 交換機。圖中的一個服務器有三塊網卡,分別連到連接數據網絡和管理網絡的交換機。)

    而云架構往往是多租戶架構,這意味着多個客戶會共享單一的物理網絡。因此,除了提供基本的網絡連接能力以外,雲還需要提供網絡在租戶之間的隔離能力;同時雲是自服務的,這意味着租戶可以通過雲提供的 API 來使用虛擬出的網絡組建來設計,構建和部署各種他們需要的網絡。

   

(左圖-圖3: 計算虛擬化和網絡虛擬化。來源)                                                 (右圖-圖4:來源 MidoNet 提供的物理網絡和邏輯網絡的映射)

   OpenStack 雲也不例外。 OpenStack 通過 Neutron 項目在物理網絡環境之上提供滿足多租戶要求的虛擬網絡和服務。Neutron 提供的網絡虛擬化能力包括:

  • (1)二層到七層網絡的虛擬化:L2(virtual switch)、L3(virtual Router 和 LB)、L4-7(virtual Firewall )等
  • (2)網絡連通性:二層網絡和三層網絡
  • (3)租戶隔離性
  • (4)網絡安全性
  • (4)網絡擴展性
  • (5)REST API
  • (6)更高級的服務,包括 LBaaS,FWaaS,VPNaaS 等。具體以後再慢慢分析。

2. Neutron 網絡虛擬化

    在實際的數據中心中,網絡可以分爲三層:OpenStack Cloud network,機房intranet (external network),以及真正的外部網絡即 Internet。External 網絡和Internet 之間是數據中心的 Uplink 路由器,它負責通過 NAT 來進行兩個網絡之間的IP地址(即 floating IP 和 Internet/Public IP)轉換,因此,這部分的控制不在 OpenStack 控制之下,也不在本文的主要探討範圍之內。

 

  • OpenSack Cloud network:OpenStack 所管理的網絡。
  • External network:數據中心所管理的的公司網(Intranet) ,虛機使用的 Floating IP 是這個網絡的地址的一部分。
  • Internet:由各大電信運營商所管理的公共網絡,使用公共IP。

這是 RedHat 提供的一個 OpenStack Cloud network 網絡架構:

大概地分類的話,該網絡管理網絡 和 數據網絡,數據網絡中關鍵的是租戶網絡,用於租戶虛機之間的通信。這部分也是 Neutron 所實現的網絡虛擬化的核心。在目前的Neutron 實現中,Neutron 向租戶提供虛擬的網絡(network)、子網(subnet)、端口 (port)、交換機(switch)、路由器(router)等網絡組件。下圖顯示了虛擬網絡和物理網絡的映射關係:

(圖5.來源:2015 OpenStack技術大會-Neutron雲計算網絡虛擬化-龔永生.pdf)

2.1 網絡(L2 network)

    網絡(network)是一個隔離的二層網段,類似於物理網絡世界中的虛擬 LAN (VLAN)。更具體來講,它是爲創建它的租戶而保留的一個廣播域,或者被顯式配置爲共享網段。端口和子網始終被分配給某個特定的網絡。這裏所謂的隔離,可以理解爲幾個含義:

  • 跨網絡的子網之間的流量必須走 L3 Virtual Router
  • 每個網絡使用自己的 DHCP Agent,每個 DHCP Agent 在一個 Network namespace 內
  • 不同網絡內的IP地址可以重複(overlapping)

根據創建網絡的用戶的權限,Neutron network 可以分爲:

  • Provider network:管理員創建的和物理網絡有直接映射關係的虛擬網絡。
  • Tenant network:租戶普通用戶創建的網絡,物理網絡對創建者透明,其配置由 Neutorn 根據管理員在系統中的配置決定。

虛機可以直接掛接到 provider network 或者 tenant network 上  “VMs can attach directly to both tenant and provider networks, and to networks with any provider:network_type value, assuming their tenant owns the network or its shared.”。

根據網絡的類型,Neutron network 可以分爲:

  • VLAN network(虛擬局域網) :基於物理 VLAN 網絡實現的虛擬網絡。共享同一個物理網絡的多個 VLAN 網絡是相互隔離的,甚至可以使用重疊的 IP 地址空間。每個支持 VLAN network 的物理網絡可以被視爲一個分離的 VLAN trunk,它使用一組獨佔的 VLAN ID。有效的 VLAN ID 範圍是 1 到 4094。
  • Flat network:基於不使用 VLAN 的物理網絡實現的虛擬網絡。每個物理網絡最多隻能實現一個虛擬網絡。
  • local network(本地網絡):一個只允許在本服務器內通信的虛擬網絡,不知道跨服務器的通信。主要用於單節點上測試。
  • GRE network (通用路由封裝網絡):一個使用 GRE 封裝網絡包的虛擬網絡。GRE 封裝的數據包基於 IP 路由表來進行路由,因此 GRE network 不和具體的物理網絡綁定。
  • VXLAN network(虛擬可擴展網絡):基於 VXLAN 實現的虛擬網絡。同 GRE network 一樣, VXLAN network 中 IP 包的路由也基於 IP 路由表,也不和具體的物理網絡綁定。

注:在AWS中,該概念對應 VPC 概念。AWS 對 VPC 的數目有一定的限制,比如每個賬戶在每個 region 上默認最多隻能創建 5 個VPC,通過特別的要求最多可以創建 100 個。

2.1.1 Provider network

   Provider Network 是由 OpenStack 管理員創建的,直接對應於數據中心的已有物理網絡的一個網段。這種網絡有三個和物理網絡有關屬性:

  • provider:network_type (網絡類型,包括 vxlan, gre, vlan, flat, local) 
  • provider:segmentation_id (網段 ID, 比如 VLAN 的 802.1q tag, GRE 網絡的 Tunnel ID, VXLAN 網絡的 VNI) 
  • provider:physical_network (物理網絡的邏輯名稱,比如 physnet1, ph-eth1, etc) 

  這種網絡是可以在多個租戶之間共享的。這種網絡通過計算和網絡節點上指定的 bridge 直接接入物理網絡,所以默認的情況下它們是可以路由的,因此也不需要接入 Neutron Virtual Router,也不需要使用 L3 agent。使用這種網絡,必須預先在各計算和網絡節點上配置指定的網橋。

  雖然可以創建 GRE 和 VXLAN 類型的 Provider network, 但是(個人認爲)Provider network 只對 Flat 和 VLAN 類型的網絡纔有意義,因爲 Provider network 的一個重要屬性是 provider:physical_network,而這個參數對其他網絡類型沒有有意義。

創建 provider network:

  • local 類型的:neutron net-create NAME --provider:network_type local
  • flat 類型的:neutron net-create NAME --provider:network_type flat --provider:physical_network PHYS_NET_NAME
  • vlan 類型的:neutron net-create NAME --provider:network_type vlan --provider:physical_network PHYS_NET_NAME --provider:segmentation_id VID
  • gre 類型的:neutron net-create NAME --provider:network_type gre --provider:segmentation_id TUNNEL_ID
  • vxlan 類型的:neutron net-create NAME --provider:network_type vxlan --provider:segmentation_id TUNNEL_ID

2.1.3 Tenant network

    Tenant network 是由 tenant 的普通用戶創建的網絡。默認情況下,這類用戶不能創建共享的 tenant network(因此 Nuetron Server 的policy 設置了"create_network:shared": "rule:admin_only"。),因此這種網絡是完全隔離的,也不可以被別的 tenant 共享。

    Tenant network 也有 local,flat,vlan,gre 和 vxlan 等類型。但是,tenant 普通用戶創建的 Flat 和 VLAN tenant network 實際上還是 Provider network,所以真正有意義的是 GRE 和 VXLAN 類型,這種網絡和物理網絡沒有綁定關係。

    創建 tenant network 的過程:

(0)管理員在 neutron 配置文件中配置 tenant_network_types,其值可以設爲一個所支持的網絡類型列表,比如 “vlan,gre,vxlan”。其默認值爲 “local“,因此需要改變。該值表明該 OpenStack 雲中允許被創建的 tenant network 類型。 

(1)運行命令 neutron net-create <net_name>

(2)neutron server 逐一根據該配置項嘗試創建 network segment,成功則立即返回。

複製代碼
def allocate_tenant_segment(self, session):
    for network_type in self.tenant_network_types: #挨個試
        driver = self.drivers.get(network_type)
        segment = driver.obj.allocate_tenant_segment(session)
        if segment: #返回第一個成功的 segment
            return segment
    raise exc.NoNetworkAvailable()
複製代碼

    創建每種網絡時,使用不同的配置項:

網絡類型 配置項 說明 實例 
vlan
  • network_vlan_ranges = physnet1:1000:2999,physnet2
  • 指定所使用的物理網絡的標籤和支持的 VLAN ID 範圍

 

network_vlan_ranges = default:2000:3999
integration_bridge = br-int
bridge_mappings = default:br-eth1

flat
  • flat_networks = physnet1,physnet2
  • 指定所使用的物理網絡的 label
 
gre
  • tunnel_id_ranges =a list of <tun_min>:<tun_max>
  • local_ip = <ip>
  •  一組可用的 GRE ID 區間列表;
  • 建立 GRE Tunnel 使用的 IP 地址
 

enable_tunneling = true
tunnel_id_ranges = 1:1000
integration_bridge = br-int
tunnel_bridge = br-tun
local_ip = 10.0.0.3

 vxlan  
  • vni_ranges = a list of <vni_min>:<vni_max>
  • local_ip = <ip>
  • vxlan_group = 239.1.1.1
  •  一組可用的 VNI 區間列表;
  • 建立 VxLAN Tunnel 使用的 IP 地址
  • VXLAN 組播組
 

enable_tunneling = true
tunnel_type = vxlan
integration_bridge = br-int
tunnel_bridge = br-tun
local_ip = 10.0.0.3
tunnel_types = vxlan

所有  
  • integration_bridge
  • bridge_mappings = default:br-eth1
  • tunnel_bridge
  • enable_tunneling = False
  • 指定intergration bridge 的名稱,默認爲 br-int;
  • 指定物理網絡label 和服務器上的 bridge 對應關係;
  • 指定 turnnel bridge 的名稱,默認爲 br-tun
  • 是否使用 tunneling 類型的網絡,包括 GRE 和 VxLAN。使用的話,ML2 agent 會在每個計算和網絡節點創建名稱爲 tunnel_bridge 的 tunnel bridge。
 

2.1.4 Provider network 和 Tenant network 的區別

 

(圖6.來源:google)

幾個區別:

  • Provider network 是由 Admin 用戶創建的,而 Tenant network 是由 tenant 普通用戶創建的。
  • Provider network 和物理網絡的某段直接映射,比如對應某個 VLAN,因此需要預先在物理網絡中做相應的配置。而 tenant network 是虛擬化的網絡,Neutron 需要負責其路由等三層功能。
  • 對 Flat 和 VLAN 類型的網絡來說,只有 Provider network 纔有意義。即使是這種類型的 tenant network,其本質上也是對應於一個實際的物理段。
  • 對 GRE 和 VXLAN 類型的網絡來說,只有 tenant network 纔有意義,因爲它本身不依賴於具體的物理網絡,只是需要物理網絡提供 IP 和 組播即可。
  • Provider network 根據 admin 用戶輸入的物理網絡參數創建;而 tenant work 由 tenant 普通用戶創建,Neutron 根據其網絡配置來選擇具體的配置,包括網絡類型,物理網絡和 segmentation_id。
  • 創建 Provider network 時允許使用不在配置項範圍內的 segmentation_id。

2.1.5 多網段 Provider network (multi-segment provider network)

    默認情況下,用戶只能創建單網段 provider network。這個 Blueprint 使得 Neutron 能夠支持創建多網段網絡。這種網絡由相同或者不同網絡類型的多個網段(network segments)組成一個廣播域。一個 Port 只能在一個 segment 中分配。

    一個實例:

s1@controller:~$ neutron net-create multinet --segments type=dict list=true provider:physical_network=physnet1,provider:segmentation_id=153,provider:network_type=vlan provider:physical_network='',provider:segmentation_id=801,provider:network_type=vxlan


Created a new network:
+-----------------+-------------------------------------------------------------------------------------------------------------+
| Field           | Value                                                                                                       |
+-----------------+-------------------------------------------------------------------------------------------------------------+
| admin_state_up  | True                                                                                                        |
| id                     | 206ae34c-7993-4128-b14d-196e084fbefe                                                                        |
| name                | multinet                                                                                                    |
| router:external  | False                                                                                                       |
| segments          | {"provider:network_type": "vlan", "provider:physical_network": "physnet1", "provider:segmentation_id": 153} |
|                         | {"provider:network_type": "vxlan", "provider:physical_network": null, "provider:segmentation_id": 801}      |
| shared              | False                                                                                                       |
| status               | ACTIVE                                                                                                      |
| subnets             |                                                                                                             |
| tenant_id          | 74c8ada23a3449f888d9e19b76d13aab                                                                            |
+-----------------+-------------------------------------------------------------------------------------------------------------+

下圖中的網絡包括類型分別爲 flat,gre 和 vlan 的三個網段:

(圖7。來源 google)

2.1.6 Mirantis 描述的網絡

https://docs.mirantis.com/openstack/fuel/fuel-9.0/pdf/Mirantis-OpenStack-9.0-PlanningGuide.pdf

Mirantis 將邏輯網絡分爲以下三大類:

  • public network (公共網絡)
    • 虛機通過 pulic network 訪問 internet。它分配外部的 IP 地址給網絡節點,以及在使用 DVR 時分配給計算節點,然後虛機通過 SNAT 來訪問外網。
    • 它也向 public endpoints 提供虛擬IP,用於外網訪問 openstack service api。
    • 管理員制定一個相鄰的地址區間給浮動IP使用。
    • 需要將 public network 與其它網絡隔離。
  • internal network (內部網絡)
    • internal network 是出了 public network 和 provate network 的其他網絡的統稱,包括存儲,管理,PXE 網絡等。
      • 內部網絡 - PXE 網絡,用於環境部署
      • 存儲網絡 - 用於存儲訪問
      • 管理網絡 - 包括數據庫,MQ,HA 服務,以及計算和存儲節點之間的 iSCSI 網絡。
    • 內部網絡將各節點連接起來。openstack 環境中的各個模塊之間的交互通過內部網絡進行。
    • 不要將 internal network 和 private network 混淆,private network 只用於虛機之間的通信。
    • 出於安全考慮,需要將內部網絡從 public 和 private network 隔離出來。
  • Private network (私有網絡)
    • 用於虛機之間的通信,包括 VLAN, GRE/VXLAN 等類型的虛擬網絡都會運行在私有網絡之上。

當 Neutorn 使用 VLAN 模式時候的網卡分配方案:

  • 三網卡方案:

eth0 - PXE 網絡
eth1 - 公共網絡(untagged),管理網絡(tag=102),存儲網絡(tag=103)
eth2 - 私有網絡

  • 四網卡方案

eth0 - PXE 網絡
eth1 - 公共網絡(untagged),管理網絡(tag=102)
eth2 - 私有網絡
eth3 - 存儲網絡

這是 OVS + VLAN 使用三塊網卡時的配置示例:

 

當 Neutorn 使用 隧道(GRE或者 VXLAN) 模式時候的網卡分配方案:

  • 兩網卡方案

eth0 - PXE 網絡
eth1 - 公共網絡(untagged),管理網絡(tag=102),存儲網絡(tag=103)

  • 三網卡方案:

eth0 - PXE 網絡
eth1 - 公共網絡(untagged),管理網絡(tag=102)
eth2 - 存儲網絡

  • 四網卡方案

eth0 - PXE 網絡
eth1 - 管理網絡
eth2 - 公共網絡
eth3 - 存儲網絡

 這是 OVS + GRE 配置示例:

2.2 子網 (subnet)

    子網是一組 IPv4 或 IPv6 地址以及與其有關聯的配置。它是一個地址池,OpenStack 可從中向虛擬機 (VM) 分配 IP 地址。每個子網指定爲一個無類別域間路由 (Classless Inter-Domain Routing) 範圍,必須與一個網絡相關聯。除了子網之外,租戶還可以指定一個網關、一個域名系統 (DNS) 名稱服務器列表,以及一組主機路由。這個子網上的 VM 實例隨後會自動繼承該配置。 

   在 OpenStack Kilo 版本之前,用戶需要自己輸入 CIDR。Kilo 版本中實現了這個 Blueprint,使得 Neutron 能夠從用戶指定的 CIDR Pool 中自動分配 CIDR。

   注:在AWS中,該概念對應其 Subnet 概念。AWS 對 Subnet 的數目有一定的限制,默認地每個 VPC 內最多隻能創建 200 個 Subnet。從CIDR角度看,一個 VPC 有一個比較大的網段,其中的每個 Subnet 分別擁有一個較小的網段。這種做法和OpenStack 有區別,OpenStack 中創建網絡時不需要指定 CIDR。

2.3 端口 (Port)

    一個 Port 代表虛擬網絡交換機(logical network switch)上的一個虛機交換端口(virtual switch port)。虛機的網卡(VIF - Virtual Interface)會被連接到 port 上。當虛機的 VIF 連接到 Port 後,這個 vNIC 就會擁有 MAC 地址和 IP 地址。Port 的 IP 地址是從 subnet 中分配的。

2.4 虛機交換機 (Virtual switch)

  Neutron 默認採用開源的 Open vSwitch 作爲其虛機交換機,同時還支持使用 Linux bridge。

2.5 虛擬路由器 (Virtual router)

  一個 Virtual router 提供不同網段之間的 IP 包路由功能,由 Nuetron L3 agent 負責管理。

2.6 各組件之間的關係

  OpenStack 實際上並未增加網絡功能。路由、交換和名稱解析是由底層的網絡基礎架構處理的。OpenStack 的作用是將這些組件的管理捆綁在一起,並將它們連接到計算工作負載。

(圖8.來源 google)

3. Neutron中的網絡連通性

  如上面第二章節所述,一個標準 OpenStack 環境中的物理網絡配置往往包括:

  • Internet(Pulic network):傳統意義上的公共網絡,使用往往由電信運營商提供的公共IP。
  • 外部網絡(External network):數據中心 Intranet,從這裏分配浮動IP地址。
  • OpenStack 內部網絡:
    • 管理網絡(management network):提供 OpenStack 各個組件之間的內部通信,以及 API 訪問端點(Endpoint)。爲安全考慮,該網絡必須限制在數據中心之內。
    • API 網絡:其實這不是一個單獨的網絡,而是包含在外部和內部網絡中。API 的 Endpoint 包括 publicurl 和 internalurl,其中,publicurl  包含的是 externa network 的 IP 地址,internal network 包含的是 management network IP 地址。爲了簡單起見,提供給內外網絡訪問的API的 publicurl 和 internalurl 相同,而只給內部網絡訪問的 API 只使用 internalurl。
    • 數據網絡(data network):除管理網絡以外的其它網絡,往往還可以細分爲下面幾種。它們可以合爲一種,也可以從性能方面考慮分離出一種或幾種作爲單獨的網絡。
      • 租戶網絡(Tenant network):提供虛機在計算節點之間,以及計算節點和網絡節點之間的通信。同樣這也是數據中心的內部網絡。
      • 存儲訪問網絡(storage access network):訪問存儲的網絡。
      • 存儲後端網絡(storage backend network):比如 Ceph 和 Swift 集羣用於後端數據複製的網絡。
  • 除了以上網絡外,往往還有各種功能網絡,包括 IPMI 網絡,PXE 網絡,監控網絡等等。這部分就略去不談了。

    

這幾種網絡,在物理交換機上,往往都使用 VLAN 來做網絡隔離。現在討論的只是租戶網絡即虛機之間通信的網絡,在 Neutron 的實現看來,該網絡的連通性包括幾個層次:

  • 同主機和不同主機上一個網段內的虛機之間的連接性:虛擬二層網絡,走物理二層(VLAN)或者三層(GRE/VxLAN)網絡。
  • 不同網段內的虛機之間的連通性:經過物理(VLAN)或者 Neutron Virtual router
  • 虛機和外部網絡之間的連通性:經過物理路由器(給 VLAN 虛擬網絡實用的物理交換機連接的路由器)或者 Neutron Virtual router

爲了支持這些網絡連通性,Neutron 需要實現跨主機的二層網絡和虛擬路由器。可以參考 學習OpenStack之(5):在Mac上部署Juno版本OpenStack 四節點環境

3.1 虛擬二層網絡的實現

    所謂虛擬二層網絡,就是提供給虛機的一種虛擬網絡,使得虛機可以和同網段中的其它虛機就像在物理二層網絡一樣在網絡二層直接通信,不管目的虛機處於什麼物理位置。也就是說,對虛機來說,物理三層網絡對它是透明的。

3.1.1 使用 VLAN 實現虛擬二層網絡

 

(圖10.來源:google) 

這種實現方式基於物理網絡上的使用 VLAN 的交換機。請參考 (2)Neutron OpenvSwitch + VLAN 虛擬網絡

3.1.2 基於 GRE/VxLAN 實現的二層網絡 (L2)

    除了 VLAN 方式的物理的二層網絡,另一種方式使用Tunnel/Overlay 方式實現虛機二層網絡。那Overlay如何應對雲計算網絡的挑戰呢?

(1)首先,Overlay的核心是重新構建一個邏輯網絡平面,其技術手段的關鍵是採用隧道技術實現L2oIP的封裝。通過隧道實現各虛擬機之間的二層直連。這樣網絡只看見Overlay邊緣節點的MAC地址,物理網絡學習到的MAC表項非常有限,現有接入交換機32K的MAC表項足以滿足需求(如下圖所示)。對應的Overlay邊緣節點實現基於會話的地址學習機制,也就是說只學習有交互流量的虛擬機MAC地址。這樣也嚴格限制了邊緣節點的地址表項。

 

Overlay網絡如何應對雲計算網絡的挑戰

(2)其次,Overlay網絡僅僅是一個邏輯上的二層直連網絡。其依賴的物理網絡,是一個傳統的路由網絡。這個路由網絡是一個三層到邊緣的網絡。也就是說二層廣播域被縮小到極致。這樣,網絡風暴潛在的風險大幅度降低。同時,對於一些需要依賴二層廣播的協議報文,例如:ARP報文,Overlay網絡通過ARP代理等方式實現協議的內容透傳,不會影響協議報文的正常運作。

(3)再次,針對4K VLAN上限問題,Overlay網絡通過L2oIP的封裝字段,提供24bits長度的隔離ID,最大可以支持16M租戶或業務。

(4)最後,針對網絡虛擬化問題。Overlay網絡本身就是一個從物理網絡中抽離的邏輯網絡,通過名址分離使得內層IP地址完全作爲一個尋址標籤,不再具備路由功能,可以實現不同subnet之間二層互通,保證二層網絡的連通性不受IP地址段的限制。

資料來源

  在 Neutron 中,Neutron 將虛機發出的數據幀打包,走三層物理網絡到達目的虛機的主機,解包給虛機。這種實現使得兩個虛機的通信看起來是二層網絡通信。

(圖11.來源:google)

請參考:(3)Neutron OpenvSwitch + GRE/VxLAN 虛擬網絡

3.2 虛擬路由器 (virtual router)

  跨子網的通信需要走虛擬路由器。同物理路由器一樣,虛擬路由器由租戶創建,擁有多個 virtual interface,連接一個租戶的子網,以及外部網絡。它具有以下特性:

  • 一個 VR 只屬於創建它的租戶,只用於該租戶的子網之間和子網與外網的路由
  • 同一網絡內的若干子網可以掛在一個 VR 上
  • 同一租戶的不同網絡的沒有 IP 地址重疊的子網可以掛在一個 VR 上
  • 不同租戶之間的內網之間是不能使用 VR 的
  • 同一租戶的不同網絡內的有 IP 地址重疊的兩個子網不能使用同一個 VR(添加子網到 VR 時會報錯)
  • 在網絡節點上,一個 VR 運行在一個 Network namespace 內,該namespace 的名稱包含該 VR 的 UUID

具體會在後面的文章中分析。

 

(圖12。來源:google)

請參考:(6)Neutron L3 Agent  

3.3 DHCP 服務

    DHCP 服務是網絡環境中必須有的。Neutron 提供基於 Dnamasq 實現的虛機 DHCP 服務,向租戶網絡內的虛機動態分配固定 IP 地址。它具有以下特性:

  • 一個網絡可以有多個運行在不同物理網絡節點上的 DHCP Agent,同時向網絡內的虛機提供服務
  • 一個 DHCP Agent 只屬於一個網絡,在網絡節點上運行在一個 network namespace 內
  • 網絡內的子網共享該 DHCP Agent

具體請參考 (5)Neutron DHCP Agent

4. Neutron 租戶網絡的隔離性(isolation of tenant network)

    Neutron 實現了不同層次的租戶網絡隔離性:

  • 租戶之間的網絡是三層隔離的,連通過 VR 做路由都不行,實在要連通的話,需要走物理網絡
  • 一個租戶內的不同網絡之間二層隔離的,需要通過 VR 做三層連通
  • 一個網絡內的不同子網也是二層隔離的,需要通過 VR 做三層連通

    Neutron 對每個租戶網絡(tenant network)都分配一個 segmentation_id,其特點包括:

  • 每個 tenant network 都有一個這種 ID
  • 每個租戶網絡的 ID 在全部的租戶範圍內都是唯一的
  • 一個 ID 代表一個廣播域
  • 一個 ID 使得同一網絡內的兩個虛機之間好像建立了一個虛擬通道(tunnel)一樣
  • 不同 ID 的網絡 tunnel 之間是互相隔離的
  • 根據物理實現不同,該ID被實現爲幾種不同的形式:
    • VLAN ID
    • GRE Tunnel ID
    • VxLAN VNI

以下圖描述的 GRE 類型的網絡爲例:

 

 

(圖13。圖片來源。)

  • (1)計算節點的 br-int 上,neutron 爲每個虛機連接 OVS 的 access port 分配了內部的 VLAN Tag。這種 tag 限制了網絡流量只能在 tenant network 之內。
  • (2)計算節點的 br-tun 上,neutron 將內部的 VLAN Tag 轉化爲 GRE Tunnel ID,是的不同 network 的流量走不通的 tunnel。
  • (3)網絡節點的 br-tun 上,neutron 將 GRE Tunnel ID 轉發了一一對應的 內部 VLAN Tag,使得網絡流被不同的服務處理。
  • (4)網絡節點的 br-int 上連接的 DHCP 和 L3 agent 使用 Linux network namespace 進行隔離。

請參考: 

(2)Neutron OpenvSwitch + VLAN 虛擬網絡 

(3)Neutron OpenvSwitch + GRE/VxLAN 虛擬網絡 

5. Neutron 租戶網絡的安全性(security)

除了租戶的隔離性以外,

  • Neutron 還提供數據網絡與外部網絡的隔離性。默認情況下,所有虛機通往外網的流量全部走網絡節點上的 L3 agent。在這裏,內部的固定 IP 被轉化爲外部的浮動 IP 地址。這種做法一方面保證了網絡包能夠回來,另一方面也隱藏了內部的 IP 地址。
  • Neutron 還是用 Linux iptables 特性,實現其 Security Group 特性,從而保證訪問虛機的安全性。
  • Neutorn 利用網絡控制節點上的 network namespace 中的 iptables,實現了進出租戶網絡的網絡包防火牆,從而保證了進出租戶網絡的安全性。

請參考下面的文章: 

(8)Neutron Security Group 

(9)Neutron FWaas 和 Nova Security Group 

6. Neutron 租戶網絡的可用性(HA)和擴展性(Scalability)

OpenStack 雲中可能用於成千上萬臺虛機,成千上萬個租戶,因此,Neutron 的數據網絡的可用性和擴展性非常重要。Neutron 中,這些特性包括幾個層次:

(1)軟件架構上,Neutron 實現OpenStack 標準的去中心化架構和插件機制,有效地保證了其擴展性。

 

(圖14.來源於 google)

(2)Neutron 爲每個 provider/tenant network 分配一個唯一的 segmentation_id。該 ID 的數目是影響可擴展性的因素之一。在規模不大的私有云中,往往是用 VLAN 模式,簡單、可靠、能夠滿足規模要求;而在大型的私有云或者公有云中,往往使用 VxLAN。

網絡類型 ID 數目 說明
flat 1 通常不用於數據網絡,因爲其不具備租戶隔離型。
vlan 4094 802.1Q 定義了 VLAN ID 佔 12-bit
GRE 16777216 RFC 2637 定義的 GRE 的 ID 佔 24-bit
VxLAN 16777216 RFC 7348 定義的 VxLAN 的 ID 佔 24-bit

(3)分佈式 Virtual Router (DVR) 和 分佈式 DHCP agent

默認情況下,L3 agent 和 DHCP agent 部署在網絡節點上,這在大規模的雲環境中可能會存在性能問題。這是 Blueprint

Architecuture-1.png |Dvr-architecture.png

(左圖-圖15,未使用DVR。右圖-圖16,使用了DVR-分佈式虛擬路由器。來源。)

通過使用 DVR,L3 轉發和 NAT 會被分佈在計算節點上,這使得計算節點變成了網絡節點,這樣集中式的網絡節點的負載就被分擔了。這個 Blueprint 實現了分佈式的 DHCP Agent,這進一步釋放了集中式網絡節點的壓力。

(4)L2 Population 和 ARP Responder:這兩個功能大大減少了網絡的複雜性,提交了網絡效率,從而促進了擴展性。

(4)高可用:雖然 Neutron 在高可用實現方面走在了 OpenStack 所有組件的前列,目前已經實現了多種 L3 Agent 的 HA 方案,但是,這些方案目前還不是很成熟,大都是在 Juno 版本中添加的,而且現在還在持續優化中,離正式進入生產環境還有一些距離。但是,我們可以相信,再經過兩三個版本,這些功能就能夠進入生產環境。

請參考這個文章:

(4)Neutron OVS OpenFlow 流表 和 L2 Population

(11)Neutron DVR 

(12)Neutron VRRP 

(13)High Availability (HA) 

7. Neutron 擴展服務(extension service)

    在實際的網絡中,除了網絡的核心功能以外,還有一些普遍應用的網絡服務,比如 VPN, Load Balancing 和 Firewall 等。Neutron 針對這些普遍的服務,也提供了參考實現。需要注意的是,目前這些實現更多類似於一種原型實現(PoC),其目的是向給產品實現者提供一種參考架構,因此,這些功能往往還不能直接應用到生產系統。正是考慮到這些特點,目前 Neutron 項目組將這些代碼挪出了 Neutorn 的主代碼庫。

具體請參考: 

(7)Neutron LBaas 

(9)Neutron FWaas 和 Nova Security Group 

(10)Neutron VPNaas 

 8. Neutron REST API

    Neutron 的 neutron-server 模塊提供 REST API 來操作上文提到的各種網絡組件,包括 network,subnet,port,router 等。可參考上圖13。具體的 API 可以參考 這裏這裏

轉載地址: http://www.cnblogs.com/sammyliu/p/4622563.html
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章