1. 程式人生 > >Openstack入門篇(十一)之neutron服務(控制節點)的部署與測試

Openstack入門篇(十一)之neutron服務(控制節點)的部署與測試

驅動 username 禁止 普通 虛擬主機 group 查看 禁用 poi

  • 1.Neutron的介紹

  Neutron 為整個 OpenStack 環境提供網絡支持,包括二層交換,三層路由,負載均衡,防火墻和 *** 等。Neutron 提供了一個靈活的框架,通過配置,無論是開源還是商業軟件都可以被用來實現這些功能。
Openstack的設計理念是把所有的組件當做服務來註冊的。 Neutron就是網絡服務。它將網絡、子網、端口和路由器抽象化,之後啟動的虛擬主機就可以連接到這個虛擬網絡上,最大的好處是這些都可視化的在Horizon裏得到了實現,部署或者改變一個SDN變得非常簡單。
我們先通過如下一個簡單的流程來了解客戶機如何連接到網絡上

  • 租戶創建了一個網絡,比方說net
  • 租戶為此網絡分配一個子網,比如192.168.56.0/24
  • 租戶啟動一個客戶機,並指明一個網口連接到net
  • Nova通知Neutron並在net上創建一個端口,如port1
  • Neutron選擇並分配一個IP給port1
  • 客戶機通過port1就連接到了net上

技術分享圖片

  • 2.Neutron的架構

與 OpenStack 的其他服務的設計思路一樣,Neutron 也是采用分布式架構,由多個組件(子服務)共同對外提供網絡服務。

技術分享圖片

Neutron 由如下組件構成:

Neutron Server :

對外提供 OpenStack 網絡 API,接收請求,並調用 Plugin 處理請求。

Plugin:處理 Neutron Server 發來的請求,維護 OpenStack 邏輯網絡的狀態, 並調用 Agent 處理請求。

Agent :處理 Plugin 的請求,負責在 network provider 上真正實現各種網絡功能。

network provider :提供網絡服務的虛擬或物理網絡設備,例如 Linux Bridge,Open vSwitch 或者其他支持 Neutron 的物理交換機。

Queue :Neutron Server,Plugin 和 Agent 之間通過 Messaging Queue 通信和調用。

Database :存放 OpenStack 的網絡狀態信息,包括 Network, Subnet, Port, Router 等。

案例理解內容:
以創建一個 VLAN100 的 network 為例,假設 network provider 是 linux bridge, 流程如下:

①Neutron Server 接收到創建 network 的請求,通過 Message Queue(RabbitMQ)通知已註冊的 Linux Bridge Plugin。

②Plugin 將要創建的 network 的信息(例如名稱、VLAN ID等)保存到數據庫中,並通過 Message Queue 通知運行在各節點上的 Agent。

③Agent 收到消息後會在節點上的物理網卡(比如 eth0)上創建 VLAN 設備(比如 eth0.100),並創建 bridge (比如 brqXXX) 橋接 VLAN 設備。

技術分享圖片

  • 3.flat network原理

flat network 是不帶 tag 的網絡,要求宿主機的物理網卡直接與 linux bridge 連接,這意味著:
每個 flat network 都會獨占一個物理網卡。

技術分享圖片

上圖中 eth1 橋接到 brqXXX,為雲主機提供 flat 網絡。
如果需要創建多個 flat network,就得準備多個物理網卡,如下圖所示。

技術分享圖片

  • 4.neutron服務的部署與測試

(1)編輯配置neutron.conf

編輯/etc/neutron/neutron.conf 文件並完成如下操作:
在 [database] 部分,配置數據庫訪問:

[database]
...
connection = mysql+pymysql://neutron:[email protected]/neutron
在[DEFAULT]部分,啟用ML2插件並禁用其他插件:

[DEFAULT]
...
core_plugin = ml2
service_plugins =
在 “[DEFAULT]” 和 “[keystone_authtoken]” 部分,配置認證服務訪問:

[DEFAULT]
...
auth_strategy = keystone

[keystone_authtoken]
...
auth_uri = http://192.168.56.11:5000
auth_url = http://192.168.56.11:35357
memcached_servers = 192.168.56.11:11211
auth_type = password
project_domain_name = default
user_domain_name = default
project_name = service
username = neutron
password = neutron
在[DEFAULT]部分,配置RabbitMQ消息隊列訪問權限:

[DEFAULT]
...
transport_url = rabbit://openstack:[email protected]
在[DEFAULT]和[nova]部分,配置網絡服務來通知計算節點的網絡拓撲變化:

[DEFAULT]
...
notify_nova_on_port_status_changes = True
notify_nova_on_port_data_changes = True

[nova]
...
auth_url = http://192.168.56.11:35357
auth_type = password
project_domain_name = default
user_domain_name = default
region_name = RegionOne
project_name = service
username = nova
password = nova
在 [oslo_concurrency] 部分,配置鎖路徑:

[oslo_concurrency]
...
lock_path = /var/lib/neutron/tmp
查看neutron所有配置項: [root@linux
-node1 ~]# grep "^[a-z]" /etc/neutron/neutron.conf auth_strategy = keystone core_plugin = ml2 service_plugins = notify_nova_on_port_status_changes = true notify_nova_on_port_data_changes = true transport_url = rabbit://openstack:[email protected] connection = mysql+pymysql://neutron:[email protected]/neutron auth_uri = http://192.168.56.11:5000 auth_url = http://192.168.56.11:35357 memcached_servers = 192.168.56.11:11211 auth_type = password project_domain_name = default user_domain_name = default project_name = service username = neutron password = neutron auth_url = http://192.168.56.11:35357 auth_type = password project_domain_name = default user_domain_name = default region_name = RegionOne project_name = service username = nova password = nova lock_path = /var/lib/neutron/tmp

(2)配置 Modular Layer 2 (ML2) 插件

編輯/etc/neutron/plugins/ml2/ml2_conf.ini文件並完成以下操作:
在[ml2]部分,啟用flat和VLAN網絡:

[ml2]
...
type_drivers = flat,vlan
在[ml2]部分,禁用私有網絡:

[ml2]
...
tenant_network_types =
在[ml2]部分,啟用Linuxbridge機制:

[ml2]
...
mechanism_drivers = linuxbridge
在[ml2] 部分,啟用端口安全擴展驅動:

[ml2]
...
extension_drivers = port_security
在[ml2_type_flat]部分,配置公共虛擬網絡為flat網絡:

[ml2_type_flat]
...
flat_networks = public       <==指定普通用戶創建的網絡類型為 public
在 [securitygroup]部分,啟用 ipset 增加安全組的方便性:

[securitygroup]
...
enable_ipset = True

(3)配置Linuxbridge代理

編輯/etc/neutron/plugins/ml2/linuxbridge_agent.ini文件並且完成以下操作:

在[linux_bridge]部分,將公共虛擬網絡和公共物理網絡接口對應起來:

[linux_bridge]
physical_interface_mappings = public:eth0     <==指明 public 網絡與物理網卡的對應關系
在[vxlan]部分,禁止VXLAN覆蓋網絡:

[vxlan]
enable_vxlan = False
在 [securitygroup]部分,啟用安全組並配置 Linux 橋接 iptables 防火墻驅動:

[securitygroup]
...
enable_security_group = True
firewall_driver = neutron.agent.linux.iptables_firewall.IptablesFirewallDriver

tips:理解此處的public與 eth0 的關系

public是 flat 網絡的標識,在創建 flat 時需要指定 label(標識)。label 的名字可以是任意字符串,這裏創建的標識為public。只要確保各個節點 ml2_conf.ini 中的 label 命名一致就可以了。

各個節點中 label 與物理網卡的對應關系可能不一樣。這是因為每個節點可以使用不同的物理網卡將雲主機連接到 flat network。

支持多個flat網絡
如果要創建多個 flat 網絡,需要定義多個 label,用逗號隔開,當然也需要用到多個物理網卡,如下所示:

[ml2_type_flat] 
flat_networks = flat1,flat2

[linux_bridge] 
physical_interface_mappings = flat1:eth1,flat2:eth2

(4)配置DHCP代理

編輯/etc/neutron/dhcp_agent.ini文件並完成下面的操作:

在[DEFAULT]部分,配置Linuxbridge驅動接口,DHCP驅動並啟用隔離元數據,這樣在公共網絡上的實例就可以通過網絡來訪問元數據

[DEFAULT]
...
interface_driver = neutron.agent.linux.interface.BridgeInterfaceDriver     <==使用 linux bridge 連接 DHCP                                                                                                                                          namespace interface。
dhcp_driver = neutron.agent.linux.dhcp.Dnsmasq           <==使用 dnsmasq 實現 DHCP。
enable_isolated_metadata = True
當創建 network 並在 subnet 上 enable DHCP 時,網絡節點上的 DHCP agent 會啟動一個 dnsmasq 進程為該 network 提供 DHCP 服務。

(5)配置元數據代理

編輯/etc/neutron/metadata_agent.ini文件並完成以下操作:

在[DEFAULT] 部分,配置元數據主機以及共享密碼:

[DEFAULT]
...
nova_metadata_ip = 192.168.56.11
metadata_proxy_shared_secret = nobody

(6)配置計算服務來使用網絡服務

編輯/etc/nova/nova.conf文件並完成以下操作:

[root@linux-node1 ~]# vim /etc/nova/nova.conf
在[neutron]部分,配置訪問參數,啟用元數據代理並設置密碼:

[neutron]
...
url = http://192.168.56.11:9696
auth_url = http://192.168.56.11:35357
auth_type = password
project_domain_name = default
user_domain_name = default
region_name = RegionOne
project_name = service
username = neutron
password = neutron
service_metadata_proxy = True
metadata_proxy_shared_secret = nobody

(7)完成安裝

①網絡服務初始化腳本需要一個超鏈接 /etc/neutron/plugin.ini指向ML2插件配置文件/etc/neutron/plugins/ml2/ml2_conf.ini。如果超鏈接不存在,使用下面的命令創建它:

[root@linux-node1 ~]# ln -s /etc/neutron/plugins/ml2/ml2_conf.ini /etc/neutron/plugin.ini
②同步數據庫

[root@linux-node1 ~]# su -s /bin/sh -c "neutron-db-manage --config-file /etc/neutron/neutron.conf --config-file /etc/neutron/plugins/ml2/ml2_conf.ini upgrade head" neutron
③重啟計算API服務

[root@linux-node1 ~]# systemctl restart openstack-nova-api.service
④當系統啟動時,啟動Networking服務並配置它啟動

[root@linux-node1 ~]# systemctl enable neutron-server.service   neutron-linuxbridge-agent.service neutron-dhcp-agent.service   neutron-metadata-agent.service
[root@linux-node1 ~]# systemctl start neutron-server.service   neutron-linuxbridge-agent.service neutron-dhcp-agent.service   neutron-metadata-agent.service    

(8)創建“neutron”服務實體以及API端點

[root@linux-node1 ~]# openstack service create --name neutron    --description "OpenStack Networking" network

[root@linux-node1 ~]# openstack endpoint create --region RegionOne   network public http://192.168.56.11:9696

[root@linux-node1 ~]# openstack endpoint create --region RegionOne   network internal http://192.168.56.11:9696

[root@linux-node1 ~]# openstack endpoint create --region RegionOne   network admin http://192.168.56.11:9696

[root@linux-node1 ~]# neutron agent-list

技術分享圖片

出現圖中的3個笑臉,代表網絡服務的成功了!!!

+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++

以下為網絡底層變化原理的介紹:

  • 5.底層網絡的變化

執行 brctl show,查看控制節點當前的網絡結構。

技術分享圖片

Neutron 自動新建了public 對應的網橋brqc39c1348-5a,以及 dhcp 的 tap 設備tapae04cfac-d0。
另外,tapae04cfac-d0 和物理網卡 eth0都已經連接到 bridge。
此時,flat network(public)網絡結構如圖:

技術分享圖片

  • 6.DHCP服務解析

DHCP agent 的配置文件位於 /etc/neutron/dhcp_agent.ini。

dhcp_driver
使用 dnsmasq 實現 DHCP。

interface_driver
使用 linux bridge 連接 DHCP namespace interface。

當創建 network 並在 subnet 上 enable DHCP 時,網絡節點上的 DHCP agent 會啟動一個 dnsmasq 進程為該 network 提供 DHCP 服務。

dnsmasq 是一個提供 DHCP 和 DNS 服務的開源軟件。
dnsmasq 與 network 是一對一關系,一個 dnsmasq 進程可以為同一 netowrk 中所有 enable 了 DHCP 的 subnet 提供服務。

網絡創建完成,我們可以在linux-node1上進行查看dnsmasq的進程

技術分享圖片

dnsmasq 重要的啟動參數:
--dhcp-hostsfile
存放 DHCP host 信息的文件,這裏的 host 在我們這裏實際上就是 instance。
dnsmasq 從該文件獲取 host 的 IP 與 MAC 的對應關系。
每個 host 對應一個條目,信息來源於 Neutron 數據庫。

--interface
指定提供 DHCP 服務的網絡接口。
dnsmasq 會在該網絡接口上監聽雲主機的 DHCP 請求

思考:
從上面可以看到DHCP 的網絡接口是tapae04cfac-d0,並非是ns-ae04cfac-d0,這是怎麽一回事?
Neutron 通過 dnsmasq 提供 DHCP 服務,而 dnsmasq 如何獨立的為每個 network 服務呢?
答案:是通過 Linux Network Namespace 隔離

每個 dnsmasq 進程都位於獨立的 namespace, 命名為
qdhcp-<\network id>

[root@linux-node1 ~]# neutron net-list
+--------------------------------------+--------+------------------------------------------------------+
| id                                   | name   | subnets                                              |
+--------------------------------------+--------+------------------------------------------------------+
| c39c1348-5a8f-4291-9772-b03a22b085df | public | df82f43f-97fe-41d0-bdbd-933565102598 192.168.56.0/24 |
+--------------------------------------+--------+------------------------------------------------------+

[root@linux-node1 ~]# ip netns list
qdhcp-c39c1348-5a8f-4291-9772-b03a22b085df (id: 0)

ip netns list 命令列出所有的 namespace。 
qdhcp-c39c1348-5a8f-4291-9772-b03a22b085df就是public的namespace

其實,宿主機本身也有一個 namespace,叫 root namespace,擁有所有物理和虛擬 interface device。
物理 interface 只能位於 root namespace。

新創建的 namespace 默認只有一個 loopback device。
管理員可以將虛擬 interface,例如 bridge,tap 等設備添加到某個 namespace。

對於 public的 DHCP 設備tapae04cfac-d0,需要將其放到 namespaceqdhcp-c39c1348-5a8f-4291-9772-b03a22b085df 中,但這樣會帶來一個問題:
tapae04cfac-d0 將無法直接與 root namespace 中的 bridge 設備brqc39c1348-5a連接。

Neutron 使用 veth pair 解決了這個問題。

veth pair 是一種成對出現的特殊網絡設備,它們象一根虛擬的網線,可用於連接兩個 namespace。向 veth pair 一端輸入數據,在另一端就能讀到此數據。

tapae04cfac-d0與ns-ae04cfac-d0 就是一對 veth pair,它們將 qdhcp-c39c1348-5a8f-4291-9772-b03a22b085df 連接到brqc39c1348-5a。如下圖所示:

技術分享圖片

Openstack入門篇(十一)之neutron服務(控制節點)的部署與測試