Openstack之neutron入門

轉載, 原文地址: http://www.aboutyun.com/forum.php?mod=viewthread&tid=9537&highlight=Neutron%2B%2B%C8%EB%C3%C5  


問題導讀
1.Openstack網絡組件的經歷了幾個過程?
2.Neutron主要有哪幾部分組成?各自的作用是什麼?
3.虛擬網絡上的數據包的處理由誰來完成?


本文將會涵蓋如下幾個部分:
- Openstack網絡組件的發展歷程
- Neutron的結構
- Neutron Server的結構
- Neutron的配置

1 Openstack網絡組件的發展歷程

1.1 nova-network

Openstack在2010年正式發佈它的第一個版本Austin的時候,nova-network作爲它的核心組件被包含其中。nova-network的功能主要有:

IP地址分配 包含爲虛擬主機分配私有(固定)和浮動IP地址。

網絡模型與管理 提供了虛擬網絡使虛擬主機之間以及與外部網絡通信。網絡模型分爲以下三種。這三種模型可以共存在一個雲系統中,但是在一個計算節點上只能配備一種模型。

扁平網絡 (Flat Network):在創建虛擬主機時,nova-network會從指定子網中取一個空閒IP並將它寫入此虛擬主機的配置文件。在一個子網內的虛擬主機可以通過創建Linux橋實現互通。

帶DHCP功能的扁平網絡 (Flat DHCP Network):顧名思義,此種模式相對於扁平網絡加入了DHCP功能。在創建虛擬主機時,nova-network會在指定的子網中爲此虛擬主機分配IP和物理地址,並將這些信息告知DHCP服務器(默認是dnsmasq)。DHCP服務器會監聽虛擬主機所在的橋。當有虛擬主機啓動時,會自動從DHCP服務器獲得IP。可以看到DHCP服務器只是按照nova-network給定的列表(IP和物理地址)分發IP,如何分配還是nova-network說了算。

VLAN網絡 (VLAN Network):這是nova-network的默認模型。針對每個項目(Project,如今Openstack把項目改稱租戶 -- Tenant),都會對應一個vlan。每個項目裏的私有IP地址只能在本項目的vlan裏訪問。與項目對應的vlan需要子網,這個子網是由管理員動態分配給項目的。與帶DHCP功能的扁平網絡類似,子網內的IP地址也是通過DHCP服務器分發的。所有在一個子網內的虛擬主機都通過網橋互通。
安全控制 主要通過ebtables和iptables來實現。

1.2 Quantum

Quantum是隨Openstack的Folsom版本正式發佈的,其實它已經作爲試用組件包含在之前的Essex版本中。在Grizzly裏功能得到了增強。
爲什麼引入Quantum?答案非常簡單,Quantum功能更強大,滿足更多需求。下面列幾條主要功能。
- 提供面向租戶的API,以便控制2層網絡和管理IP地址
- 支持插件式網絡組件,像Open vSwitch,Cisco,Linux Bridge,Nicira NVP等等
- 支持位於不同的2層網絡的IP地址重疊
- 支持基本的3層轉發和多路由器
- 支持隧道技術(Tunneling)
- 支持3層代理和DHCP代理的多節點部署,增強了擴展性和可靠性
- 提供負載均衡API (試用版本)

1.3 Neutron

因爲商標侵權的原因,Openstack在Havana版本上將Quantum更名爲Neutron,所以Neutron並不是什麼新的東西。在Havana版裏,Neutron也只增加和增強了少數功能。
- 提供穩定的負載均衡API
- 支持端到端的IPSec VPN
- 面向租戶的防火牆服務
- 提供一個新的插件ML2,這個插件可以作爲一個框架同時支持不同的2層網絡

現在很多已部署的Openstack雲還在繼續使用nova-network,因爲它簡單,穩定,尤其是多節點部署的可擴展性和可靠性讓人不願割捨。但是我們必須考慮往Neutron上遷移了,最新版Icehouse(還未發佈)中的nova-network將會被列爲過期組件,雖然系統還支持,但不建議使用了。
接下來我們一起來看看Neutron,本人精力在諮詢、架構和部署,所以對源碼實現我們不會涉及。

2 Neutron的結構

Openstack的設計理念是把所有的組件當做服務來註冊的。 Neutron就是網絡服務。它將網絡、子網、端口和路由器抽象化,之後啓動的虛擬主機就可以連接到這個虛擬網絡上,最大的好處是這些都可視化的在Horizon裏得到了實現,部署或者改變一個SDN變得非常簡單,沒有專業知識的人稍經培訓也可以做到。

我們先通過如下一個簡單的流程來了解客戶機如何連接到網絡上。
- 租戶創建了一個網絡,比方說mynet
- 租戶爲此網絡分配一個子網,比如192.168.122.0/24
- 租戶啓動一個客戶機,並指明一個網口連接到mynet
- Nova通知Neutron並在mynet上創建一個端口,如port1
- Neutron選擇並分配一個IP給port1
- 客戶機通過port1就連接到了mynet上

Neutron主要有以下幾部分組成。


Neutron Server:
 這一部分包含守護進程neutron-server和各種插件neutron-*-plugin,它們既可以安裝在控制節點也可以安裝在網絡節點。neutron-server提供API接口,並把對API的調用請求傳給已經配置好的插件進行後續處理。插件需要訪問數據庫來維護各種配置數據和對應關係,例如路由器、網絡、子網、端口、浮動IP、安全組等等。

插件代理 (Plugin Agent): 虛擬網絡上的數據包的處理則是由這些插件代理來完成的。名字爲neutron-*-agent。在每個計算節點和網絡節點上運行。一般來說你選擇了什麼插件,就需要選擇相應的代理。代理與Neutron Server及其插件的交互就通過消息隊列來支持。

DHCP代理(DHCP Agent): 名字爲neutron-dhcp-agent,爲各個租戶網絡提供DHCP服務,部署在網絡節點上,各個插件也是使用這一個代理

3層代理 (L3 Agent): 名字爲neutron-l3-agent, 爲客戶機訪問外部網絡提供3層轉發服務。也部署在網絡節點上。
下面這張圖取自官網,很好的反映了Neutron內部各部分之間的關係。(SDN服務在這裏是額外的外部功能,可以暫時略過。)

 


3 Neutron Server的結構

下面我們來細看一下Neutron Server的結構。

 


這張圖中我們只看Quantum-common和Quantum Plugin部分,其實就是Neutron Server。
上面我們已提到,Neutron最重要的就是兩部分:API和插件。

3.1 API

API又分爲兩個部分。
API Core:暫且稱之爲API核。它可以看做是插件功能的最小集合,即每個插件都必須有的功能,也就是對網絡、子網和端口的查詢、加刪和更新操作等。
API Extensions:暫稱之爲API擴展。它們一般是針對具體插件實現的,這樣租戶就可以利用這些插件獨特的功能,比方說訪問控制(ACL)和QoS。
需要提一下的是,現在API核具備的功能還都很簡單,隨着Neturon的不斷成熟,它可能就會納入一些API擴展中的功能。
當然API部分也負責Neutron服務的啓動、客戶請求和相應回覆的打包和派發以及驗證數據格式及其正確性。也有一些安全和穩定機制,比方說對API請求的限制以防止DOS攻擊來保證服務在大負載下的可用性。
至於驗證和授權功能,相信大家都已瞭解,就是與Keystone結合,進行用戶或租戶級的使用控制。

3.2 插件

下面我們再來看一下插件。
從功能上說,插件一般有以下內容。
- 存儲當前邏輯網絡的配置信息,這就需要一個數據庫,比方說MySQL
- 判斷和存儲邏輯網絡和物理網絡的對應關係,比方說爲一個邏輯網絡選擇一個vlan
- 與一種或多種交換機通信來實現這種對應關係。這一般通過宿主機上的插件代理來實現這種操作,或者遠程登錄到交換機上來配置。
以Open vSwitch爲例,下面列出了插件需要訪問的數據表。

  1. +---------------------------+
  2. | Tables_in_neutron         |
  3. +---------------------------+
  4. | agents                    |
  5. | allowedaddresspairs       |
  6. | dnsnameservers            |
  7. | externalnetworks          |
  8. | extradhcpopts             |
  9. | floatingips               |
  10. | ipallocationpools         |
  11. | ipallocations             |
  12. | ipavailabilityranges      |
  13. | networkdhcpagentbindings  |
  14. | networks                  |
  15. | ovs_network_bindings      |
  16. | ovs_tunnel_allocations    |
  17. | ovs_tunnel_endpoints      |
  18. | ovs_vlan_allocations      |
  19. | portbindingports          |
  20. | ports                     |
  21. | quotas                    |
  22. | routerl3agentbindings     |
  23. | routerroutes              |
  24. | routers                   |
  25. | securitygroupportbindings |
  26. | securitygrouprules        |
  27. | securitygroups            |
  28. | subnetroutes              |
  29. | subnets                   |
  30. +---------------------------+
複製代碼



4 Neutron的配置

Neutron的配置應該說是比Openstack的其他組件複雜一點。
常用的配置模型有兩種,
把Neutron Server放在控制節點上,DHCP和L3代理放在網絡節點上,可參考一下官圖。

 


把Neutron的所有部分放在單獨的網絡節點上。這種方式就是把上圖部署在控制節點中的neutron-server放到網絡節點上。
因爲網絡配置不像網絡使用那麼頻繁,所以通常建議使用第一種方案,沒有必要單獨把neutron-server拿出來。因爲neutron-server是可單獨部署的,我們就拿第二種方案作爲例子。

系統使用ubuntu12.04,軟件的安裝我們就不說了,這裏我們採用Open vSwitch插件。(針對虛擬交換機Open vSwitch,Neutron建議是使用ML2插件的,但這裏我們爲了加深對插件和插件代理的理解,還是沿用了OpenvSwitch插件)。

4.1 計算節點的配置

安裝完軟件包以後,計算節點應該就有OpenvSwitch的代理在運行,使用ps命令可以看到如下進程。
  1. /usr/bin/python /usr/bin/neutron-openvswitch-agent --config-file=/etc/neutron/neutron.conf --config-file=/etc/neutron/plugins/openvswitch/ovs_neutron_plugin.ini
複製代碼


這裏我們可以看到代理讀取了2個配置文件。

neutron.conf主要需要設置如下幾項:
  1. core_plugin = neutron.plugins.openvswitch.ovs_neutron_plugin.OVSNeutronPluginV2        //插件類型
  2. auth_strategy = keystone        // 授權方式
  3. rabbit_host = 192.168.122.1        //處理消息隊列的主機地址
  4. [keystone_authtoken]        //keystone信息,這裏只是我的例子信息
  5. auth_host = 192.168.122.1
  6. auth_port = 35357
  7. auth_protocol = http
  8. admin_tenant_name = service
  9. admin_user = neutron
  10. admin_password = neutron
  11. auth_url = http://192.168.122.1:35357/v2.0
  12. connection = mysql://neutron:[email protected]/neutron        //DB信息
複製代碼



neutron.conf會默認包含另一個配置文件api-paste.ini,對它只需添加keystone信息。
  1. auth_host=192.168.122.1
  2. admin_user=neutron
  3. admin_tenant_name=service
  4. admin_password=neutron

  5. ovs_neutron_plugin.init主要需要設置以下幾項,以vlan爲例:
  6. tenant_network_type = vlan        //網絡類型,例如vlan,gre
  7. network_vlan_ranges = physnet1:1000:2999        //vlanID
  8. bridge_mappings = physnet1:br-int        //用於計算節點上客戶機內部網絡的網橋
  9. firewall_driver = neutron.agent.linux.iptables_firewall.OVSHybridIptablesFirewallDriver
複製代碼



4.2 網絡節點的配置

安裝完軟件後,網絡節點應該會有如下進程在運行。
  1. /usr/bin/python /usr/bin/neutron-dhcp-agent --config-file=/etc/neutron/neutron.conf --config-file=/etc/neutron/dhcp_agent.ini
  2. /usr/bin/python /usr/bin/neutron-metadata-agent --config-file=/etc/neutron/neutron.conf --config-file=/etc/neutron/metadata_agent.ini
  3. /usr/bin/python /usr/bin/neutron-l3-agent --config-file=/etc/neutron/neutron.conf --config-file=/etc/neutron/l3_agent.ini
  4. /usr/bin/python /usr/bin/neutron-server --config-file /etc/neutron/neutron.conf --config-file /etc/neutron/plugins/openvswitch/ovs_neutron_plugin.ini
  5. /usr/bin/python /usr/bin/neutron-openvswitch-agent --config-file=/etc/neutron/neutron.conf --config-file=/etc/neutron/plugins/openvswitch/ovs_neutron_plugin.ini
複製代碼


你會看到每個部分會用到哪個配置文件。

neutron.conf和api-paste.ini的配置與計算節點上是一樣的。

dhcp_agent.ini的主要設置以下幾項。看內容可理解其意義。
  1. interface_driver = neutron.agent.linux.interface.OVSInterfaceDriver
  2. dhcp_driver = neutron.agent.linux.dhcp.Dnsmasq
複製代碼



metadata_agent.ini的設置主要是keystone相關的。
  1. auth_url = http://192.168.122.1:5000/v2.0
  2. auth_region = regionOne
  3. admin_tenant_name = service
  4. admin_user = neutron
  5. admin_password = neutron
  6. nova_metadata_ip = 192.168.122.1
  7. metadata_proxy_shared_secret = meta        //proxy的密碼,個人設置
複製代碼



l3_agent.init的設置。
  1. interface_driver = neutron.agent.linux.interface.OVSInterfaceDriver
複製代碼



ovs_neutron_plugin.ini的配置和計算節點上的一樣。

4.3 節點上OVS的配置

計算節點和網絡節點的NIC配置非常相似,我們都是用第二個NIC(eth1)作爲內部網絡的通訊。以網絡節點爲例。eth1不能設置IP地址,而是把IP地址給虛擬橋。
  1. auto eth1
  2. iface eth1 inet manual
  3.         up ifconfig $IFACE 0.0.0.0 up
  4.         down ip link set $IFACE down
  5. auto br-int 
  6. iface br-int inet static
  7.         address 10.100.1.2
  8.         netmask 255.255.255.0
複製代碼



OVS中把eth1放到虛擬橋上。
  1.     Bridge br-int
  2.         Port "eth1"
  3.             Interface "eth1"
  4.         Port br-int
  5.             Interface br-int
  6.                 type: internal
複製代碼



5 結束語

Neutron是openstack的方向,我們有必要花點時間研究一下它。目前對它的擔心還是有的,比方說穩定性、可用性,還有性能(以後有機會探討),但它的靈活性、多功能性是無可比擬的。

相關內容:
Openstack之neutron入門(一)


Openstack之neutron入門二

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章