三、neutron server 組件詳解:
Neutron server 分層模型

上圖是 Neutron Server 的分層結構,至上而下依次為:
Core API:對外提供管理 network, subnet 和 port 的 RESTful API。
Extension API:對外提供管理 router, load balance, firewall 等資源 的 RESTful API。
Commnon Service:認證和校驗 API 請求。
Neutron Core:Neutron server 的核心處理程序,通過調用相應的 Plugin 處理請求。
Core Plugin API:定義了 Core Plgin 的抽象功能集合,Neutron Core 通過該 API 調用相應的 Core Plgin。
Extension Plugin API:定義了 Service Plgin 的抽象功能集合,Neutron Core 通過該 API 調用相應的 Service Plgin。
Core Plugin:實現了 Core Plugin API,在數據庫中維護 network, subnet 和 port 的狀態,並負責調用相應的 agent 在 network provider 上執行相關操作,比如創建 network。
Service Plugin:實現了 Extension Plugin API,在數據庫中維護 router, load balance, security group 等資源的狀態,並負責調用相應的 agent 在 network provider 上執行相關操作,比如創建 router。
歸納起來,Neutron Server 包括兩部分:
1. 提供 API 服務。
2. 運行 Plugin。
即 Neutron Server = API + Plugins

明白了 Neutron Server 的分層模型,我們就更容易理解 Neutron 是如何支持多種 network provider。
三、ML2 Core Plugin 詳解:
Neutron 是如何支持多種 network provider?
上節提到 Core Plugin,其功能是維護數據庫中 network, subnet 和 port 的狀態,並負責調用相應的 agent 在 network provider 上執行相關操作,比如創建 network。
openstack中有兩大常見 Core Plugin: linux bridge plugin 和 open vswitch plugin。
Neutron 可以通過開發不同的 plugin 和 agent 支持不同的網絡技術。這是一種相當開放的架構。不過隨着支持的 network provider 數量的增加,開發人員發現了兩個突出的問題:
1. 只能在 OpenStack 中使用一種 core plugin,多種 network provider 無法共存。 只使用一個 core plugin 本身沒有問題。但問題在於傳統的 core plugin 與 core plugin agent 是一一對應的。也就是說,如果選擇了 linux bridge plugin,那么 linux bridge agent 將是唯一選擇,就必須在 OpenStack 的所有節點上使用 linux bridge 作為虛擬交換機(即 network provider)。
同樣的,如果選擇 open vswitch plugin, 所有節點上只能使用 open vswitch,而不能使用其他的 network provider。

2. 不同 plugin 之間存在大量重復代碼,開發新的 plugin 工作量大。
所有傳統的 core plugin 都需要編寫大量重復和類似的數據庫訪問的代碼,大大增加了 plugin 開發和維護的工作量。

ML2 能解決傳統 core plugin 的問題
Moduler Layer 2(ML2):是 Neutron 在 Havana 版本實現的一個新的 core plugin,用於替代原有的 linux bridge plugin 和 open vswitch plugin。 作為新一代的 core plugin,提供了一個框架,允許在 OpenStack 網絡中同時使用多種 Layer 2 網絡技術,不同的節點可以使用不同的網絡實現機制。

如上圖所示,采用 ML2 plugin 后,可以在不同節點上分別部署 linux bridge agent, open vswitch agent, hyper-v agent 或其他第三方 agent。
ML2 不但支持異構部署方案,同時能夠與現有的 agent 無縫集成:以前用的 agent 不需要變,只需要將 Neutron server 上的傳統 core plugin 替換為 ML2。
有了 ML2,要支持新的 network provider 就變得簡單多了:無需從頭開發 core plugin,只需要開發相應的 mechanism driver,大大減少了要編寫和維護的代碼。
ML2 Core Plugin 詳解:
ML2 對二層網絡進行抽象和建模,引入了 type driver 和 mechansim driver。這兩類 driver 解耦了 Neutron 所支持的網絡類型(type)與訪問這些網絡類型的機制(mechanism),其結果就是使得 ML2 具有非常好的彈性,易於擴展,能夠靈活支持多種 type 和 mechanism。

(1) Type Driver
Neutron 支持的每一種網絡類型都有一個對應的 ML2 type driver。
type driver 負責維護網絡類型的狀態,執行驗證,創建網絡等。 ML2 支持的網絡類型包括 local, flat, vlan, vxlan 和 gre。 我們將在后面章節詳細討論每種 type。
(2) Mechansim Driver
Neutron 支持的每一種網絡機制都有一個對應的 ML2 mechansim driver。
mechanism driver 負責獲取由 type driver 維護的網絡狀態,並確保在相應的網絡設備(物理或虛擬)上正確實現這些狀態。
type 和 mechanisim 都太抽象,現在我們舉一個具體的例子: type driver 為 vlan,mechansim driver 為 linux bridge,我們要完成的操作是創建 network vlan100,那么:
-
vlan type driver 會確保將 vlan100 的信息保存到 Neutron 數據庫中,包括 network 的名稱,vlan ID 等。
-
linux bridge mechanism driver 會確保各節點上的 linux brige agent 在物理網卡上創建 ID 為 100 的 vlan 設備 和 brige 設備,並將兩者進行橋接。
mechanism driver 有三種類型:
Agent-based
包括 linux bridge, open vswitch 等。
Controller-based
包括 OpenDaylight, VMWare NSX 等。
基於物理交換機
包括 Cisco Nexus, Arista, Mellanox 等。 比如前面那個例子如果換成 Cisco 的 mechanism driver,則會在 Cisco 物理交換機的指定 trunk 端口上添加 vlan100。
本教程討論的 mechanism driver 將涉及 linux bridge, open vswitch 和 L2 population。
linux bridge 和 open vswitch 的 ML2 mechanism driver 作用是配置各節點上的虛擬交換機。linux bridge driver 支持的 type 包括 local, flat, vlan, and vxlan。open vswitch driver 除這 4 種 type 還支持 gre。
L2 population driver 作用是優化和限制 overlay 網絡中的廣播流量。 vxlan 和 gre 都屬於 overlay 網絡。
ML2 core plugin 已經成為 OpenStack Neutron 的首選 plugin,本教程后面會討論如何在實驗環境中配置 ML2 的各種 type 和 mechansim。
四、Service Plugin / Agent 詳解:
Core Plugin/Agent 負責管理核心實體:net, subnet 和 port。而對於更高級的網絡服務,則由 Service Plugin/Agent 管理。
Service Plugin 及其 Agent 提供更豐富的擴展功能,包括路由,load balance,firewall等,如圖所示:

DHCP
dhcp agent 通過 dnsmasq 為 instance 提供 dhcp 服務。
Routing
l3 agent 可以為 project(租戶)創建 router,提供 Neutron subnet 之間的路由服務。路由功能默認通過 IPtables 實現。
Firewall
l3 agent 可以在 router 上配置防火牆策略,提供網絡安全防護。另一個與安全相關的功能是 Security Group,也是通過 IPtables 實現。 Firewall 與 Security Group 的區別在於:
-
Firewall 安全策略位於 router,保護的是某個 project 的所有 network。
-
Security Group 安全策略位於 instance,保護的是單個 instance。
Firewall 與 Security Group 后面會詳細分析。
Load Balance
Neutron 默認通過 HAProxy 為 project 中的多個 instance 提供 load balance 服務。
后面的章節會結合 linux bridge 和 open vswitch 詳細討論每一種 service。
五、 Neutron 架構框架總結:
前面我們詳細討論了 Neutron 架構,包括 Neutron Server,Core 和 Service Agent。現在用兩張圖做個總結。
第一張:

與 OpenStack 其他服務一樣,Neutron 采用的是分布式架構,包括 Neutorn Server、各種 plugin/agent、database 和 message queue。
1. Neutron server 接收 api 請求。
2. plugin/agent 實現請求。
3. database 保存 neutron 網絡狀態。
4. message queue 實現組件之間通信。
metadata-agent 之前沒有講到,這里做個補充:
instance 在啟動時需要訪問 nova-metadata-api 服務獲取 metadata 和 userdata,這些 data 是該 instance 的定制化信息,比如 hostname, ip, public key 等。
但 instance 啟動時並沒有 ip,那如何通過網絡訪問到 nova-metadata-api 服務呢?
答案就是 neutron-metadata-agent 該 agent 讓 instance 能夠通過 dhcp-agent 或者 l3-agent 與 nova-metadata-api 通信
如果我們將 Neutron 架構展開,則會得到下面第二張圖:

-
Neutron 通過 plugin 和 agent 提供的網絡服務。
-
plugin 位於 Neutron server,包括 core plugin 和 service plugin。
-
agent 位於各個節點,負責實現網絡服務。
-
core plugin 提供 L2 功能,ML2 是推薦的 plugin。
-
使用最廣泛的 L2 agent 是 linux bridage 和 open vswitch。
-
service plugin 和 agent 提供擴展功能,包括 dhcp, routing, load balance, firewall, vpn 等。
至此,Neutron 架構已經討論完,希望大家已經理解。