Neutron
neutron主要就是用於網絡虛擬化,之前將nova的時候說過,網絡部分沒有寫,因為openstack中的網絡屬於一個大部分,所以今天咱們就來看看neutron到底是怎么樣實現網絡虛擬化的
Neutron包含的組件:
neutron-server
neutron-plugin
neutron-agent
neutron各組件詳解:
neutron-server可以理解為類似於nova-api那樣的一個組件,一個專門用來接收neutron REST API調用的服務器。負責將不同的rest api發送到不同的neutron-plugin
neutron-plugin可以理解為不同網絡功能實現的入口,現在大部分都是軟件定義網絡,各個廠商都開發自己的plugin(插件)。neutron-plugin接收netron-server發過來的rest api,向neutron database完成一些信息注冊(比如用戶要建端口)。然后將具體要執行的業務操作和參數通知給自身對應的neutron-agent
neutron-agent可以直觀的理解為neutron-plugin在設備上的代理,接受相應的neutron-plugin通知的業務操作和參數,並轉換為具體的設備級操作,以指導設備的動作。當本地設備發生問題時,neutron-agent會將情況通知給neutron-plugin(說白了就是neutron-server就是與各個組件交互的,接收請求,neutron-plugin是操作數據庫的,neutron-agent就是具體干活的)
neutron database就是數據庫,一些業務相關的參數都存在這里
neutron-plugin分為core-plugin個service-plugin兩類(我們主要研究core-pulgin)
Core-plugin,在neutron中有一個Core-plugin叫做ML2(Modular Layer 2),就是負責管理L2的網絡連接(二層交換機概念)。ML2中主要包括network,subent,port三類核心資源,對三類資源進行操作的REST API被neutron-server看做Core API 由neutron原生支持,其中
注意**:學習openstack重中之重network的類型包括:Flat,Vlan,Vxlan,GRE,還有一個local 五種網絡模式指的是二層網絡
Service-plugin,即為出Core-plugin以外的其它的plugin,包括L3router,firewall,loadblancer,vpn,metering等等,主要實現L3-L7的網絡服務。
Neutron對Quantum(neutron的原名)的插件機制進行了優化,將各個廠商L2插件中獨立的數據庫實現提取出來,作為公共的ML2插件存儲租戶的業務需求,使得廠商可以專注於L2設備驅動的實現,而ML2作為總控可以協調多廠商L2設備共同運行”。在Quantum中,廠家都是開發各自的Service-plugin,不能兼容而且開發重復度很高,於是在Neutron中就為設計了ML2機制,使得各廠家的L2插件完全變成了可插拔的,方便了L2中network資源擴展與使用。ML2可以支持在一個環境中同時運行五種模式
(注意,以前廠商開發的L2 plugin跟ML2都存在於neutron/plugins目錄下,而可插拔的ML2設備驅動則存在於neutron/plugins/ml2/drivers目錄下)
一般而言,neutron-server和各個neutron-plugin部署在控制節點或者網絡節點上,而neutron-agent則部署在網絡節點上和計算節點上。我們先來分析控制端neutron-server和neutron-plugin的工作,然后在分開分析設備端neutron-agent的工作
網絡虛擬化
實際數據中心網絡可分為三層:
openstack Cloud network:openstack所管理的網絡
既往intranet(external network):數據中心所管理的網絡
以及真正的外部網絡internet,由各大運行商所管理的公共網絡
openstack的網絡可以是:
1.管理網絡:包含api網絡(public,admin,和internal)各個組件之間的協同工作。
2.數據網絡
3.存儲網絡
4.IDRAC網絡
5.PXE網絡
總結:openstack --> external --> (NAT) -->internet
neutron網絡虛擬化簡介
openstack中neutron組件負責咋物理網絡環境智商提供滿足多租戶要求的虛擬化網絡和服務
Neutron 提供的網絡虛擬化能力包括:
1.二層到七層網絡的虛擬化:L2(virtual switch)、L3(virtual Router 和 LB)、L4-7(virtual Firewall )等
2.網絡連通性:二層網絡和三層網絡
3.租戶隔離性
4.網絡安全性
5.網絡擴展性
6.REST API
7.更高級的服務,包括 LBaaS,FWaaS,VPNaaS 等
先從二層網絡虛擬化來說
按照用戶的權限創建網絡,neutron L2 network可以分為:
Provider network:管理員創建的跟物理網絡直接綁定到一塊,即虛擬機用的網絡就是物理網絡
Tenant network:租戶普通用戶創建的網絡。物理網絡對創建者透明,用戶不需要考慮底層
根據網絡類型,neutron L2 network可以分為
flat network:基於不實用vlan的物理網絡實現的虛擬網絡。所有網絡都在一個網絡中。不推薦使用,用不到生產環境中。
local network:一個只允許在本服務器內通信的虛擬網絡,所有服務都裝在一台機器上 不推薦中。
vlan network:基於物理vlan網絡實現的虛擬網絡。共享同一個物理網絡的多個vlan網絡是相互隔離的,並且可以使用重疊IP地址空間。最重要的一點是有效的VLAN ID 范圍為1-4095
GRE network:(通過路由封裝網絡):一個使用GRE封裝網絡包的虛擬網絡,GRE封裝的數據包基於IP路由表來進行路由,因此GRE network不和具體的網絡網絡綁定
VXLAN network:(虛擬可擴展網絡)基於vxlan實現虛擬網絡。同GRE network一樣,vxlan network中IP包的路由也基於IP路由表,也不和具體的物理網絡綁定
L2 網絡之Provider Netwrok
provider network是有Openstack管理員創建的,直接對應於數據中的一塊物理網段,這種網絡有三個和物理網絡有關的屬性:
provider.network_type(網絡類型:vxlan,gre,valn,flat,local)
provider.segmentation_id(網段ID:比如vlan的802.1q tag,gre的tunnel ID,VXLAN的VNI)
provider.physical_network(物理網絡的邏輯名稱:比如physnet1,ph-etg1)
這種網絡是可以在多個租戶之間共享的。這種網絡通過計算和網絡節點上指定的 bridge 直接接入物理網絡,所以默認的情況下它們是可以路由的,因此也不需要接入 Neutron Virtual Router,也不需要使用 L3 agent。使用這種網絡,必須預先在各計算和網絡節點上配置指定的網橋
創建 provider network:
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
L2 網絡之Tenant Netwrok
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 類型,這種網絡和物理網絡沒有綁定關系。
1.管理員在 neutron 配置文件中配置 tenant_network_types,其值可以設為一個所支持的網絡類型列表,比如 “vlan,gre,vxlan”。其默認值為 “local“,因此需要改變。該值表明該 OpenStack 雲中允許被創建的 tenant network 類型。
2.運行命令 neutron net-create <net_name>
3.neutron server 逐一根據該配置項嘗試創建 network segment,成功則立即返回。
創建每種網絡時,使用不同的配置項:
網絡類型 | 配置項 | 說明 | 實例 |
vlan |
|
|
network_vlan_ranges = default:2000:3999 |
flat |
|
|
|
gre |
|
|
enable_tunneling = true |
vxlan |
|
|
enable_tunneling = true |
所有 |
|
|
端口:
一個port代表虛擬網絡交換機(logical network switch)上的一個虛擬交換機端口(virtual switch port)。虛擬機的網卡(VIF:Virtual Interface)會被連接到port上。當虛擬機的VIF連接到port后, vNIC就會擁有MAC地址和IP地址
虛擬交換機:
Neutron默認采用開源的Open vSwitch作為其虛擬交換機,簡稱ovs,同時還支持linux bridge
虛擬路由器:
一個Virtual router 提供不同網段之間的IP包路由功能,由Neutron L3 agent負責管理。
一個 VR 只屬於創建它的租戶,只用於該租戶的子網之間和子網與外網的路由
同一網絡內的若干子網可以掛在一個 VR 上
同一租戶的不同網絡的沒有 IP 地址重疊的子網可以掛在一個 VR 上
不同租戶之間的內網之間是不能使用 VR 的
同一租戶的不同網絡內的有 IP 地址重疊的兩個子網不能使用同一個 VR(添加子網到 VR 時會報錯)
在網絡節點上,一個 VR 運行在一個 Network namespace 內,該namespace 的名稱包含該 VR 的 UUID
大二層概念
二層是指數據鏈路層,計算機與計算機之間的通信采用的是基於以太網協議廣播的方式,而大二層的概念指的是openstack中所有的vm都處於一個大的二層網絡中,大二層也可以被想象成一堆二層交換機串聯在一起。這樣做的好處就是為了滿足vm可以遷移到全網任意位置,二層無需網關,無需路由,因而資源調用更加靈活,反正如果不在一個大二層中,那么vm遷移到另外一個位置(另外的一個網絡中)。則需我們人為的指定網關,添加路由策略,然而這還只是針對一台vm的遷移,要滿足所有的vm的動態遷移,再去指定網關,路由等這樣就不現實了。
關於網絡的基礎知識請參考這篇篇博客:http://www.cnblogs.com/linhaifeng/articles/5937962.html
物理的二層與虛擬的二層(vlan模式)
物理的二層指的是:物理網絡是二層網絡,基於以太網協議的廣播方式進行通信
虛擬的二層指的是:neutron實心的虛擬的網絡也是二層網絡(openstack的vm機所用的網絡必須是大二層),也是基於以太網協議的廣播方式進行通信,但毫無疑問的是該虛擬網絡是依賴於物理的二層網絡
物理二層+虛擬二層的典型代表:vlan網絡模式
物理的三層與虛擬的二層(GRE模式與VXLAN模式)
物理三層指的是:物理網絡是三層網絡,基於IP路由的方式進行通信
虛擬的二層指的是:neutron實現的虛擬網絡仍然是二層網絡(openstack的vm機所用的網絡必須是大二層),仍然是基於以太網的廣播方式進行通信,但毫無疑問的是該虛擬機網絡是依賴於物理的三層網絡,這點有點類似於VPN的概念,根本原理就是將私網的包封裝起來,最終打上隧道的ip地址傳輸。
物理三層+虛擬二層的典型代表:GRE模式與vxlan模式
Neutron租戶網絡的隔離性
Neutron實現了不同層次的租戶網絡隔離性:
租戶之間的網絡是三層隔離的,聯通VR(Virtual Router)做路由都不行,實在要連通的話,需要走物理網絡。
一個租戶內的不同網絡之間二層是隔離的,需要通過VR做三層連接
一個網絡內的不同子網也是二層隔離的,需要通過VR做三層連接
Neutron對每個租戶網絡(Tenant network)都分配一個segmentation_id,其特點包括:
每個Tenant network都有一個這種ID
每個租戶網絡的ID在全部的租戶范圍內都是唯一的
一個ID代表一個廣播域
一個ID使得同一網絡內的兩個虛擬機之間好像建立了一個虛擬通道(tunnel)一樣
不同ID的網絡tunnel之間是相互隔離的
根據屋里實現不同,該ID被實現為幾種不同的形式:
VLAN ID
GRE Tunnel ID
VXLAN VNI
原圖鏈接:https://pinrojas.com/2014/07/29/theres-real-magic-behind-openstack-neutron/
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,使得網絡流被不同的服務處理。)網絡節點的 br-int 上連接的 DHCP 和 L3 agent 使用 Linux network namespace 進行隔離。
4.網絡節點的 br-int 上連接的 DHCP 和 L3 agent 使用 Linux network namespace 進行隔離。
Neutron租戶網絡的安全性(security)
除了租戶隔離以外
neutron還提供數據網絡與外部網絡的隔離性,默認情況下,所有虛擬機通過外網的流量全部走網絡節點的L3 agent。在這里,內部的固定IP被轉化為外部的浮動IP地址。這種做法一方面保證了網絡包能夠回來,另一方面也隱藏了內部的IP地址。
neutron還是用Linux iptables特性,實現其Security Group特性,從而保證訪問虛機的安全性。
neutron利用網絡控制節點上的network namesapce種的iptables,實現了進出租戶網絡的網絡報防火牆,從而保證了進出租戶網絡的安全性。