Openstack入門篇(十一)之neutron服務(控制節點)的部署與測試
-
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 :
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服務(控制節點)的部署與測試