一 雲計算時代數據中心物理網絡的問題
數據中心虛擬化成為了趨勢,最典型的場景莫過於:對數據中心的服務器進行虛擬化,來提高資源利用率,同時降低單位能耗。
但是,隨着數據中心虛擬化程度的不斷提高、虛擬化服務器規模的不斷擴大,帶來了巨大的管理壓力。===>這正是雲計算誕生的原因。
在大規模虛擬化的基礎上,實現了自動化管理和集中化管理,就是雲計算的基本模型。
雲計算的超大規模加上其特有的服務模式帶來了諸多亟需解決的問題,這些問題中,首當其沖的就是網絡問題
我們需要從兩個角度去看:
一:數據中心現有的物理網絡,無法承載雲計算機的超大規模
(詳見1.1小節)
二:數據中心現有的物理網絡,無法滿足雲計算SDN的要求
(詳見1.2小節)
1.1 數據中心現有的物理網絡,無法承載雲計算機的超大規模
互聯網行業數據中心的基本特征就是服務器的規模偏大。進入雲計算時代后,其業務特征變得更加復雜,包括:虛擬化支持、多業務承載、資源靈活調度等(如圖1所示)。與此同時,互聯網雲計算的規模不但沒有縮減,反而更加龐大。這就給雲計算的網絡帶來了巨大的壓力。
圖1. 互聯網雲計算的業務特點
l 大容量的MAC表項和ARP表項
虛擬化會導致更大的MAC表項。假設一個互聯網雲計算中心的服務器有5000台,按照1:20的比例進行虛擬化,則有10萬個虛擬機。通常每個虛擬機會配置兩個業務網口,這樣這個雲計算中心就有20萬個虛擬網口,對應的就是需要20萬個MAC地址和IP地址。雲計算要求資源靈活調度,業務資源任意遷移。也就是說任意一個虛擬機可以在整個雲計算網絡中任意遷移。這就要求全網在一個統一的二層網絡中。全網任意交換機都有可能學習到全網所有的MAC表項。與此對應的則是,目前業界主流的接入交換機的MAC表項只有32K,基本無法滿足互聯網雲計算的需求。另外,網關需要記錄全網所有主機、所有網口的ARP信息。這就需要網關設備的有效ARP表項超過20萬。大部分的網關設備芯片都不具備這種能力。
l 4K VLAN Trunk問題
傳統的大二層網絡支持任意VLAN的虛擬機遷移到網絡的任意位置,一般有兩種方式。方式一:虛擬機遷移后,通過自動化網絡管理平台動態的在虛擬機對應的所有端口上下發VLAN配置;同時,還需要動態刪除遷移前虛擬機對應所有端口上的VLAN配置。這種方式的缺點是實現非常復雜,同時自動化管理平台對多廠商設備還面臨兼容性的問題,所以很難實現。方式二:在雲計算網絡上靜態配置VLAN,在所有端口上配置VLAN trunk all。這種方式的優點是非常簡單,是目前主流的應用方式。但這也帶來了巨大的問題:任一VLAN內如果出現廣播風暴,則全網所有VLAN內的虛擬機都會受到風暴影響,出現業務中斷。
l 4K VLAN上限問題
雲計算網絡中有可能出現多租戶需求。如果租戶及業務的數量規模超出VLAN的上限(4K),則無法支撐客戶的需求。
l 虛擬機遷移網絡依賴問題
VM遷移需要在同一個二層域內,基於IP子網的區域划分限制了二層網絡連通性的規模。
1.2 數據中心現有的物理網絡,無法滿足雲計算SDN的要求
站着使用角度去考慮,比如我們使用阿里雲
一方面:每個申請阿里雲的人或組織都是一個獨立的租戶,而每個申請者自以為自己獨享的網絡資源,實際上是與其他申請者共享阿里雲的物理網絡,這就需要阿里雲做好租戶與租戶直接的隔離,這是一個很重要的方面,顯然,數據中心現有的物理網絡無法滿足需求: 數據中心現有的物理網絡是固定的,需要手動配置的,單一的。
另一方面:就是自服務,試想,我們作為阿里雲的使用者,完全可以構建自己的網絡環境,這就需要雲環境對租戶提供API,從而滿足租戶基於雲計算虛擬出來的網絡之上來設計、部署租戶自己需要的網絡架構。
所以總結下來,雲計算SDN的需求無非兩點:
一:租戶“共享同一套物理網絡”並且一定要實現“互相隔離”
二:自服務
1.3 小結
總結1.1和1.2:
- 其實很明顯的可以看出來,無論是1.1還是1.2的問題,都指向了同一點:數據中心現有的物理網絡好使,不夠6。如何解決呢?
- 簡答地說,就是在數據中心現有的物理網絡基礎之上疊加一層我們自己的虛擬網絡
二 如何解決問題:Neutron實現網絡虛擬化
2.1 Neutron組件介紹
neutron包含組件:
neutron-server
neutron-plugin
neutron-agent
neutron各組件功能介紹:
1.Neutron-server可以理解為一個專門用來接收Neutron REST API調用的服務器,然后負責將不同的rest api分發到不同的neutron-plugin上。
2.Neutron-plugin可以理解為不同網絡功能實現的入口,各個廠商可以開發自己的plugin。Neutron-plugin接收neutron-server分發過來的REST API,向neutron database完成一些信息的注冊,然后將具體要執行的業務操作和參數通知給自身對應的neutron agent。
3.Neutron-agent可以直觀地理解為neutron-plugin在設備上的代理,接收相應的neutron-plugin通知的業務操作和參數,並轉換為具體的設備級操作,以指導設備的動作。當設備本地發生問題時,neutron-agent會將情況通知給neutron-plugin。
4.Neutron database,顧名思義就是Neutron的數據庫,一些業務相關的參數都存在這里。
5.Network provider,即為實際執行功能的網絡設備,一般為虛擬交換機(OVS或者Linux Bridge)。
neutron-plugin分為core-plugin和service-plugin兩類。
Core-plugin,Neutron中即為ML2(Modular Layer 2),負責管理L2的網絡連接。ML2中主要包括network、subnet、port三類核心資源,對三類資源進行操作的REST API被neutron-server看作Core API,由Neutron原生支持。其中:
Service-plugin,即為除core-plugin以外其它的plugin,包括l3 router、firewall、loadbalancer、VPN、metering等等,主要實現L3-L7的網絡服務。這些plugin要操作的資源比較豐富,對這些資源進行操作的REST API被neutron-server看作Extension API,需要廠家自行進行擴展。
“Neutron對Quantum的插件機制進行了優化,將各個廠商L2插件中獨立的數據庫實現提取出來,作為公共的ML2插件存儲租戶的業務需求,使得廠商可以專注於L2設備驅動的實現,而ML2作為總控可以協調多廠商L2設備共同運行”。在Quantum中,廠家都是開發各自的Service-plugin,不能兼容而且開發重復度很高,於是在Neutron中就為設計了ML2機制,使得各廠家的L2插件完全變成了可插拔的,方便了L2中network資源擴展與使用。
(注意,以前廠商開發的L2 plugin跟ML2都存在於neutron/plugins目錄下,而可插拔的ML2設備驅動則存在於neutron/plugins/ml2/drivers目錄下)
ML2作為L2的總控,其實現包括Type和Mechanism兩部分,每部分又分為Manager和Driver。Type指的是L2網絡的類型(如Flat、VLAN、VxLAN等),與廠家實現無關。Mechanism則是各個廠家自己設備機制的實現,如下圖所示。當然有ML2,對應的就可以有ML3,不過在Neutron中L3的實現只負責路由的功能,傳統路由器中的其他功能(如Firewalls、LB、VPN)都被獨立出來實現了,因此暫時還沒有看到對ML3的實際需求。
一般而言,neutron-server和各neutron-plugin部署在控制節點或者網絡節點上,而neutron agent則部署在網絡節點上和計算節點上。我們先來分析控制端neutron-server和neutron-plugin的工作,然后再分析設備端neutron-agent的工作。
neutron新進展(dragon flow):
https://www.ustack.com/blog/neutron-dragonflow/
2.2 Neturon網絡虛擬化簡介
==================part1==================
想要了解openstack的虛擬化網絡,必先知道承載openstack虛擬化網絡的物理網絡
在實際的數據中心中,與openstack相關的物理網絡可以分為三層:
- OpenStack Cloud network:OpenStack 架構的網絡
- 機房intranet (external network):數據中心所管理的的公司網(Intranet) ,虛機使用的 Floating IP 是這個網絡的地址的一部分。
- 以及真正的外部網絡即 Internet:由各大電信運營商所管理的公共網絡,使用公共IP。
External 網絡和Internet 之間是數據中心的 Uplink 路由器,它負責通過 NAT 來進行兩個網絡之間的IP地址(即 floating IP 和 Internet/Public IP)轉換,因此,這部分的控制不在 OpenStack 控制之下,我們無需關心它。
openstack架構的網絡--->機房的網絡external-----(NAT)--->外網internet
==================part2==================
openstack架構的網絡又可細分為以下幾種(下述指的仍然是物理網絡):
- 管理網絡:包含api網絡(public給外部用,admin給管理員用-是內部ip,internal給內部用-是內部ip)
- 數據網絡
- 存儲網絡
- IDRAC網絡
- PXE網絡
數據網絡主要用於vm之間的通信,這部分是neutron所實現網絡虛擬化的核心,neutron基於該物理網絡之上,來實現滿足多租戶要求的虛擬網絡和服務。
==================part3==================
Neutron 提供的網絡虛擬化能力包括:
(1)二層到七層網絡的虛擬化:L2(virtual switch)、L3(virtual Router 和 LB)、L4-7(virtual Firewall )等
(2)網絡連通性:二層網絡和三層網絡
(3)租戶隔離性
(4)網絡安全性
(4)網絡擴展性
(5)REST API
(6)更高級的服務,包括 LBaaS,FWaaS,VPNaaS 等。具體以后再慢慢分析。
==================part4==================
Neutron主要為租戶提供虛擬的
1. 交換機(switch)
2. 網絡(L2 network)和子網(subnet),
3. 路由器(router)
4. 端口(port)
2.3 構建大二層網絡:虛擬交換機(switch)+物理交換機
1. 什么是二層網絡?
二層指的是數據鏈路層,計算機與計算機之間的通信采用的是基於以太網協議廣播的方式,請參考http://www.cnblogs.com/linhaifeng/articles/5937962.html
2. 什么是大二層網絡?
大二層的概念指的是openstack中所有的vm都處於一個大的二層網絡中,大二層也可以被想象成一堆二層交換機串聯到一起。
3. 為什么要構建大二層網絡?
構建大二層網絡的目的就是為了滿足vm可以遷移到全網的任意位置。二層無需網關,無需路由,因而資源調用更加靈活,反之,如果所有vm不在一個大二層中,那么vm遷移到另外一個位置(另外一個網絡中),則需要我們人為地指定網關,添加路由策略,然而這還只是針對一台vm的遷移,要滿足所有的vm的動態遷移,再去指定網關、路由等就不現實了。
4. 如何構建大二層網絡?
一些列二層設備串聯起來,組成一個大二層網絡,在openstack中二層設備分為:物理的二層設備和虛擬機的二層設備
虛擬的二層設備又分為:
1. Neutron 默認采用的 開源Open vSwitch 創建的虛機交換機
2. Linux bridge。
需要特別強調的是:
1.大二層網絡是由虛擬二層設備和物理二層設備共同組成的;
2.而這里面所有的二層設備合在一起相當於一個大的交換機;
3.大二層網絡是在計算節點或者網絡節點啟動時就會建立,而后期用戶建立的網絡,都是在此網絡的基礎之上進行邏輯划分,用戶每新建一個網絡都被分配相應的段ID(相當於vlan id)
2.4 大二層網絡創建完畢后,用戶如何使用?->網絡(L2 network)、子網(subnet)
==================part1:用戶創建的L2 network==================
雲平台在構建完畢后,即在物理節點都正常啟動后,大二層網絡也就創建好了,對用戶來說,此時相當於一台大的二層交換機擺在面前,即用戶創建網絡就是把整個大二層網絡當成一個交換機
然后用戶需要做的是基於該網絡划分自己的vlan,即建立一個l2 network,
例如:用戶(例如demo用戶)可以在自己的project下創建網絡(L2 network),該網絡就是在大二層的基礎上划分出來的,是一個隔離的二層網段。類似於物理網絡世界中的虛擬 LAN (VLAN),每建立一個l2 network,都會被分配一個段ID,該段ID標識一個廣播域,這個ID是被隨機分配的,除非使用管理員身份在管理員菜單下,才可以手動指定該ID
那么就讓我們在demo租戶下以demo用戶身份創建demo-net網絡:
以admin用戶登錄,這樣才能看到新建網絡demo-net的段ID,其實此時demo-net僅僅只是一種邏輯上划分
補充:使用管理員身份在管理員菜單下,創建網絡可以手動指定段ID
========part2:用戶為自己新建的l2 network,即demo-net,創建子網==========
子網是一組 IPv4 或 IPv6 地址以及與其有關聯的配置。它是一個地址池,OpenStack 可從中向虛擬機 (VM) 分配 IP 地址。每個子網指定為一個無類別域間路由 (Classless Inter-Domain Routing) 范圍,必須與一個網絡相關聯。除了子網之外,租戶還可以指定一個網關、一個域名系統 (DNS) 名稱服務器列表,以及一組主機路由。這個子網上的 VM 實例隨后會自動繼承該配置。
在 OpenStack Kilo 版本之前,用戶需要自己輸入 CIDR。Kilo 版本中實現了這個 Blueprint,使得 Neutron 能夠從用戶指定的 CIDR Pool 中自動分配 CIDR。
查看新建子網的信息
創建的結果:就好比我們拿來一台“交換機”分出了一個VLAN.
注:在AWS中,該概念對應其 Subnet 概念。AWS 對 Subnet 的數目有一定的限制,默認地每個 VPC 內最多只能創建 200 個 Subnet。從CIDR角度看,一個 VPC 有一個比較大的網段,其中的每個 Subnet 分別擁有一個較小的網段。這種做法和OpenStack 有區別,OpenStack 中創建網絡時不需要指定 CIDR。
========part3:dhcp-agent服務於網絡demo-net下的子網demo-subnet==========
在建立了子網后,會在網絡節點上新增一個名稱空間用來運行dhcp-agent專門為demo-net下的demo-subnet分配ip
demo-net有一個段ID:51
demo-subnet有網絡ID:a603fd2c-35ef-46de-b9c4-da48680eb27d
連接dhcp-agent的端口網絡ID:a603fd2c-35ef-46de-b9c4-da48680eb27d
對應大二層網絡上的變化為:在網絡節點上新增dhcp-agent,在網絡節點上的br-int新增端口,該端口的屬於demo-net,及屬於段ID:51
ps:新建子網后,便會網絡節點新增dhcp-agent(解釋一下:圖中虛擬機是新建虛擬機后才有的)
在demo-net新增一個子網的話,不會新增dhcp-agent,會新增地址池
總結:
DHCP 服務是網絡環境中必須有的。Neutron 提供基於 Dnamasq (輕型的dns和dhcp服務)實現的虛機 DHCP 服務,向租戶網絡內的虛機動態分配固定 IP 地址。它具有以下特性:
- 一個網絡可以有多個運行在不同物理網絡節點上的 DHCP Agent,同時向網絡內的虛機提供服務
- 一個 DHCP Agent 只屬於一個網絡,在網絡節點上運行在一個 network namespace 內
- 網絡內的子網共享該 DHCP Agent
========part4:新建vm1和vm2連接到demo-net==========
在demo-net以及demo-subnet建立成功后,就可以新建虛擬機連接到demo-net了,相當於同一個vlan中的倆台虛擬機,二層互通
此處我們新建vm1和vm2,網絡拓撲如下
========part4:新建網絡demo-net1,與demo-net對比========
按照同樣的套路創建demo-net1,它與demo-net是隔離的
對應大二層網絡的端口連接連接
這里所謂的隔離,可以理解為幾個含義:
- 每個網絡使用自己的 DHCP Agent,每個 DHCP Agent 在一個 Network namespace 內
- 不同網絡內的IP地址可以重復(overlapping)
- 跨網絡的子網之間的流量必須走 L3 Virtual Router
2.5 虛擬機路由器(Vitual Router)
要想讓demo-net1上的vm3與demo-net上的vm2通信,用戶必須建立連接這兩個網絡的路由器router
添加接口
查看網絡拓撲
對應大二層網絡的變化
測試來自demo-net的vm2:172.16.45.6與demo-net1的vm3:172.16.18.3的連通性
要想連接外網,需要用管理員身份,創建與外部網絡綁定的網絡,然后將demo租戶下的test-router的網關指定為該網絡
網絡拓撲
測試:
總結:一個 Virtual router 提供不同網段之間的 IP 包路由功能,由 Nuetron L3 agent 負責管理。
2.6 端口(Port)
一個 Port 代表虛擬網絡交換機(logical network switch)上的一個虛機交換端口(virtual switch port)。虛機的網卡(VIF - Virtual Interface)會被連接到 port 上。當虛機的 VIF 連接到 Port 后,這個 vNIC 就會擁有 MAC 地址和 IP 地址。Port 的 IP 地址是從 subnet 中分配的。
三 實現網絡虛擬化的關鍵:如何構建虛擬的大二層網絡
根據創建網絡的用戶的權限,Neutron L2 network 可以分為:
- Provider network:管理員創建的和物理網絡有直接映射關系的虛擬網絡。
- Tenant network:租戶普通用戶創建的網絡,物理網絡對創建者透明,其配置由 Neutron根據管理員在系統中的配置決定。
虛機可以直接掛接到 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 L2 network 可以分為:
- Flat network:基於不使用 VLAN 的物理網絡實現的虛擬網絡。每個物理網絡最多只能實現一個虛擬網絡。
- local network(本地網絡):一個只允許在本服務器內通信的虛擬網絡,不知道跨服務器的通信。主要用於單節點上測試。
- VLAN network(虛擬局域網) :基於物理 VLAN 網絡實現的虛擬網絡。共享同一個物理網絡的多個 VLAN 網絡是相互隔離的,甚至可以使用重疊的 IP 地址空間。每個支持 VLAN network 的物理網絡可以被視為一個分離的 VLAN trunk,它使用一組獨占的 VLAN ID。有效的 VLAN ID 范圍是 1 到 4094。
- GRE network (通用路由封裝網絡):一個使用 GRE 封裝網絡包的虛擬網絡。GRE 封裝的數據包基於 IP 路由表來進行路由,因此 GRE network 不和具體的物理網絡綁定。
- VXLAN network(虛擬可擴展網絡):基於 VXLAN 實現的虛擬網絡。同 GRE network 一樣, VXLAN network 中 IP 包的路由也基於 IP 路由表,也不和具體的物理網絡綁定。
注:在AWS中,該概念對應 VPC 概念。AWS 對 VPC 的數目有一定的限制,比如每個賬戶在每個 region 上默認最多只能創建 5 個VPC,通過特別的要求最多可以創建 100 個。
L2 network之Provider與Tenant的區別
- 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。
3.2 依賴物理的二層來建立虛擬的大二層(vlan模式)
物理的二層指的是:物理網絡是二層網絡,基於以太網協議的廣播方式進行通信
虛擬的二層指的是:neutron實現的虛擬的網絡也是二層網絡(openstack的vm機所用的網絡必須是大二層),也是基於以太網協議的廣播方式進行通信,但毫無疑問的是該虛擬網絡依賴於物理的二層網絡
物理二層+虛擬二層的典型代表:vlan網絡模式,點擊進入詳解
3.3 依賴物理的三層來建立虛擬的大二層(gre模塊與vxlan模式)
物理的三層指的是:物理網絡是三層網絡,基於ip路由的方式進行通信
虛擬的二層指的是:neutron實現的虛擬的網絡仍然是二層網絡(openstack的vm機所用的網絡必須是大二層),仍然是基於以太網協議的廣播方式進行通信,但毫無疑問的是該虛擬網絡依賴於物理的三層網絡,這有點類似於VPN的概念,根本原理就是將私網的包封裝起來,最終打上隧道的ip地址傳輸。
物理三層+虛擬二層的典型代表:gre模式與vxlan模式,點擊進入詳解