Neutron Linux bridge VXLAN 部署

本節將說明如何部署基於 Neutron Linux bridge VXLAN 來提供多租戶網路。

Controller Node

在 Controller 節點上,只需要安裝 Neutron API Server 與 ML2 Plugins 即可。

Controller 安裝前準備

在開始安裝前,要預先建立一個資料庫給 Neutron 儲存相關資訊,使用以下指令建立資料庫:

$ mysql -u root -p

透過以下命令用來更新現有帳號資料或建立 Neutron 資料庫:

CREATE DATABASE neutron;
GRANT ALL PRIVILEGES ON neutron.* TO 'neutron'@'localhost'  IDENTIFIED BY 'NEUTRON_DBPASS';
GRANT ALL PRIVILEGES ON neutron.* TO 'neutron'@'%'  IDENTIFIED BY 'NEUTRON_DBPASS';

這邊NEUTRON_DBPASS可以隨需求修改。

完成後離開資料庫,接著要建立 Service 與 API Endpoint,首先導入 admin 環境變數:

$ . admin-openrc

接著透過以下流程來建立 Neutron 的使用者、Service 以及 API Endpoint:

# 建立 Neutron User
$ openstack user create --domain default \
--password NEUTRON_PASS --email [email protected] neutron

# 新增 Neutron 到 Admin Role
$ openstack role add --project service --user neutron admin

# 建立 Neutron Service
$ openstack service create --name neutron --description "OpenStack Networking" network

# 建立 Neutron public endpoints
$ openstack endpoint create --region RegionOne \
network public http://10.0.0.11:9696

# 建立 Neutron internal endpoints
$ openstack endpoint create --region RegionOne \
network internal http://10.0.0.11:9696

# 建立 Neutron admin endpoints
$ openstack endpoint create --region RegionOne \
network admin http://10.0.0.11:9696

Controller 套件安裝與設定

在開始設定之前,首先要安裝相關套件與 OpenStack 服務套件,可以透過以下指令進行安裝:

$ sudo yum install openstack-neutron python-neutronclient

安裝完成後,編輯 /etc/neutron/neutron.conf 設定檔,在[DEFAULT]部分加入以下設定:

[DEFAULT]
...
core_plugin = ml2
service_plugins = router
allow_overlapping_ips = True
rpc_backend = rabbit
auth_strategy = keystone
notify_nova_on_port_status_changes = True
notify_nova_on_port_data_changes = True

[database]部分修改使用以下方式:

[database]
# connection = sqlite:////var/lib/neutron/neutron.sqlite
connection = mysql+pymysql://neutron:[email protected]/neutron

[oslo_messaging_rabbit]部分加入以下設定:

[oslo_messaging_rabbit]
rabbit_host = 10.0.0.11
rabbit_userid = openstack
rabbit_password = RABBIT_PASS

這邊RABBIT_PASS可以隨需求修改。

[keystone_authtoken]部分加入以下設定:

[keystone_authtoken]
auth_uri = http://10.0.0.11:5000
auth_url = http://10.0.0.11:35357
memcached_servers = 10.0.0.11:11211
auth_type = password
project_domain_name = default
user_domain_name = default
project_name = service
username = neutron
password = NEUTRON_PASS

這邊NEUTRON_PASS可以隨需求修改。

[nova]部分加入以下設定:

[nova]
auth_url = http://10.0.0.11:35357
auth_type = password
project_domain_name = default
user_domain_name = default
region_name = RegionOne
project_name = service
username = nova
password = NOVA_PASS

這邊NOVA_PASS可以隨需求修改。

[oslo_concurrency]部分加入以下內容:

[oslo_concurrency]
lock_path = /var/lib/neutron/tmp

Controller 設定 ML2

這邊 Neutron ML2 外掛使用 Linux bridge agent 來提供給虛擬機建立虛擬網路。這邊 Controller 節點不需要 Linux bridge agent,因為 Controller 不處理網路傳輸。要設定 ML2 可以編輯/etc/neutron/plugins/ml2/ml2_conf.ini並在[ml2]部分加入以下設定:

[ml2]
type_drivers = flat,vlan,gre,vxlan
tenant_network_types = vxlan
mechanism_drivers = linuxbridge,l2population
extension_drivers = port_security

一旦您設定好了 ML2 插件,修改 type_drivers 選項的值會導致資料庫的不一致。所以建議一開始就設定多個。

P.S. Linux bridge agent 只支援 VXLAN

[ml2_type_vxlan]部分加入以下設定:

[ml2_type_vxlan]
vni_ranges = 1:1000

VIN 支援 2 ^ 24 次方個數。

[securitygroup]部分加入以下設定:

[securitygroup]
enable_ipset = True

Controller 設定 Nova 使用 Network

當完成 ML2 設定後,接著編輯/etc/nova/nova.conf,在[neutron]部分加入以下設定:

[neutron]
url = http://10.0.0.11:9696
auth_url = http://10.0.0.11:35357
auth_type = password
project_domain_name = default
user_domain_name = default
region_name = RegionOne
project_name = service
username = neutron
password = NEUTRON_PASS

這邊NEUTRON_PASS可以隨需求修改。

完後後,由於網路服務需要一些初始化腳本,故這邊要建立初始化腳本的連結:

$ sudo ln -s /etc/neutron/plugins/ml2/ml2_conf.ini /etc/neutron/plugin.ini

確定無誤後即可同步資料庫來建立 Neutron 資料表:

$ sudo neutron-db-manage --config-file /etc/neutron/neutron.conf \
--config-file /etc/neutron/plugins/ml2/ml2_conf.ini \
upgrade head

之後重新啟動 Nova API Server:

$ sudo systemctl restart openstack-nova-api.service

完成後設定開機時啟動服務:

$ sudo systemctl enable neutron-server.service

完成後啟動 Neutron Server:

$ sudo systemctl start neutron-server.service

Controller 驗證服務

導入 Keystone 的 admin 帳號,來透過 Neutron client 查看服務目錄:

$ . admin-openrc

這邊可以透過 Neutron client 來查看外部網路列表,如以下方式:

$ neutron ext-list
+---------------------------+-----------------------------------------------+
| alias                     | name                                          |
+---------------------------+-----------------------------------------------+
| dns-integration           | DNS Integration                               |
| network_availability_zone | Network Availability Zone                     |
| address-scope             | Address scope                                 |
| ext-gw-mode               | Neutron L3 Configurable external gateway mode |
| binding                   | Port Binding                                  |
| agent                     | agent                                         |
| subnet_allocation         | Subnet Allocation                             |
| l3_agent_scheduler        | L3 Agent Scheduler                            |
| external-net              | Neutron external network                      |
| net-mtu                   | Network MTU                                   |
| availability_zone         | Availability Zone                             |
| quotas                    | Quota management support                      |
| l3-ha                     | HA Router extension                           |
| provider                  | Provider Network                              |
| multi-provider            | Multi Provider Network                        |
| extraroute                | Neutron Extra Route                           |
| router                    | Neutron L3 Router                             |
| extra_dhcp_opt            | Neutron Extra DHCP opts                       |
| security-group            | security-group                                |
| dhcp_agent_scheduler      | DHCP Agent Scheduler                          |
| router_availability_zone  | Router Availability Zone                      |
| rbac-policies             | RBAC Policies                                 |
| port-security             | Port Security                                 |
| allowed-address-pairs     | Allowed Address Pairs                         |
| dvr                       | Distributed Virtual Router                    |
+---------------------------+-----------------------------------------------+

Network Node

Neutron 在 Network 節點會安裝提供虛擬機的 L2 與 L3 網路虛擬化,來處理內部與外部網路的路由,還有包含 DHCP 服務、Metadata 服務。

Network 安裝前準備

在進行安裝 Neutron 相關套件之前,必須先讓 Network 節點主機設定一些 Kernel 網路參數,透過編輯 /etc/sysctl.conf 加入以下參數:

net.ipv4.ip_forward=1
net.ipv4.conf.all.rp_filter=0
net.ipv4.conf.default.rp_filter=0

完成後,可以透過 sysctl 指令來將參數載入:

$ sudo sysctl -p

Network 套件安裝與設定

在開始設定之前,首先要安裝相關套件與 OpenStack 服務套件,可以透過以下指令進行安裝:

$ sudo yum install openstack-neutron openstack-neutron-ml2 \
openstack-neutron-linuxbridge ebtables

安裝完成後,編輯 /etc/neutron/neutron.conf 設定檔,在[DEFAULT]部分加入以下設定:

[DEFAULT]
...
verbose = True
rpc_backend = rabbit
auth_strategy = keystone
core_plugin = ml2
service_plugins = router
allow_overlapping_ips = True

[database]部分將所有 connection 與 sqlite 的參數註解掉:

[database]
# connection = sqlite:////var/lib/neutron/neutron.sqlite

[oslo_messaging_rabbit]部分加入以下設定:

[oslo_messaging_rabbit]
rabbit_host = 10.0.0.11
rabbit_userid = openstack
rabbit_password = RABBIT_PASS

這邊RABBIT_PASS可以隨需求修改。

[keystone_authtoken]部分加入以下設定:

[keystone_authtoken]
auth_uri = http://10.0.0.11:5000
auth_url = http://10.0.0.11:35357
memcached_servers = 10.0.0.11:11211
auth_type = password
project_domain_name = default
user_domain_name = default
project_name = service
username = neutron
password = NEUTRON_PASS

這邊NEUTRON_PASS可以隨需求修改。

[oslo_concurrency]部分加入以下內容:

[oslo_concurrency]
lock_path = /var/lib/neutron/tmp

Network 設定 ML2

這邊 Neutron ML2 外掛使用 Linux bridge agent 來提供給虛擬機建立虛擬網路。這邊 Network 需要設定 Linux bridge agent,因為 Network 是主要處理網路傳輸的節點。要設定 ML2 可以編輯/etc/neutron/plugins/ml2/ml2_conf.ini並在[ml2]部分加入以下設定:

[ml2]
type_drivers = flat,vlan,gre,vxlan
tenant_network_types = vxlan
mechanism_drivers = linuxbridge,l2population
extension_drivers = port_security

[ml2_type_flat]部分加入以下設定:

[ml2_type_flat]
flat_networks = external

[ml2_type_vxlan]部分加入以下設定:

[ml2_type_vxlan]
vni_ranges = 1:1000

VIN 支援 2 ^ 24 次方個數。

[securitygroup]部分加入以下設定:

[securitygroup]
enable_ipset = True

接著編輯 /etc/neutron/plugins/ml2/linuxbridge_agent.ini 設定檔,在 [linux_bridge]部分加入以下設定:

[linux_bridge]
physical_interface_mappings = external:<physical_interface>

這邊<physical_interface>eth1

[vxlan]部分加入以下設定:

[vxlan]
local_ip = OVERLAY_IP
enable_vxlan = true
l2_population = True

這邊OVERLAY_IP10.0.1.21

[agent]部分加入以下設定:

[agent]
tunnel_types = vxlan
prevent_arp_spoofing = True

[securitygroup]部分加入以下設定:

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

設定 Layer 3 Proxy

由於本架構採用 Self-service,故需要設定 Layer 3 Proxy 來提供虛擬化路由器。編輯/etc/neutron/l3_agent.ini[DEFAULT]部分加入以下設定:

[DEFAULT]
...
interface_driver = neutron.agent.linux.interface.BridgeInterfaceDriver
external_network_bridge =
verbose = True

external_network_bridge 參數預設保留空白,該參數是使用單一的 Agent 來提供多個外部網路,細節設定可以參考 L3 Agent

設定 DHCP Proxy

由於本架構採用 Self-service,故需要設定 DHCP Proxy 來提供 DHCP 服務給虛擬機使用。編輯/etc/neutron/dhcp_agent.ini[DEFAULT]部分加入以下設定:

[DEFAULT]
...
interface_driver = neutron.agent.linux.interface.BridgeInterfaceDriver
dhcp_driver = neutron.agent.linux.dhcp.Dnsmasq
enable_isolated_metadata = True
verbose = True

完成上述後,下一步可以依需求設定,因為類似 VXLAN 的協定包含了額外的 Header 封包,這些封包增加了網路開銷,而減少了有效的封包可用空間。在不了解虛擬網路架構的情況下,Instance 會用預設的 eth maximum transmission unit(MTU) 1500 bytes 來傳送封包。IP 網路利用 Path MTU discovery(PMTUD)機制來偵測與調整封包大小。但是有些作業系統、網路阻塞、缺乏對 PMTUD 支援等因素,會造成效能的損失與連接錯誤。

最好情況下,可以在 Network 節點上開啟 Jumbo frames 來避免該問題。因為 Jumbo frames 支援最大 9000 bytes 的 MTU,這大大解決了覆蓋網路(Overlay Network)的封包開銷影響。但是很多網路設備不一定支援,且 OpenStack 管理人員也可能忽略對網路架構的控制,因此考慮到複雜性,這邊選擇降低 MTU 大小來避免該問題,使用 VXLAN 大多環境採用 1450 Bytes 來執行。

設定 MTU 可以透過編輯/etc/neutron/dhcp_agent.ini[DEFAULT]部分加入以下設定:

[DEFAULT]
...
dnsmasq_config_file = /etc/neutron/dnsmasq-neutron.conf

然後建立並編輯/etc/neutron/dnsmasq-neutron.conf來設定 MTU 大小:

$ echo 'dhcp-option-force=26,1450' | sudo tee /etc/neutron/dnsmasq-neutron.conf

設定 Metadata Agent

OpenStack Metadata 提供了一些主機客製化的設定訊息,諸如 Hostname、網路配置資訊等等。編輯/etc/neutron/metadata_agent.ini[DEFAULT]部分加入以下設定:

[DEFAULT]
nova_metadata_ip = 10.0.0.11
metadata_proxy_shared_secret = METADATA_SECRET

將其中的METADATA_SECRET替換為一個合適的 metadata 代理的 secret。

完成上面設定後,先回到Controller節點,編輯/etc/nova/nova.conf,在[neutron]部分加入以下設定:

[neutron]
...
service_metadata_proxy = True
metadata_proxy_shared_secret = METADATA_SECRET

將其中的METADATA_SECRET替換為一個合適的 metadata 代理的 secret。

然後在 Controller 節點上重新啟動 Nova API Server:

$ sudo systemctl restart openstack-nova-api.service

當完成上述所有安裝與設定後,回到 Network 節點,由於網路服務需要一些初始化腳本,故這邊要建立初始化腳本的連結:

$ sudo ln -s /etc/neutron/plugins/ml2/ml2_conf.ini /etc/neutron/plugin.ini

接著設定開機時啟動服務:

$ sudo systemctl enable neutron-linuxbridge-agent.service \ neutron-dhcp-agent.service neutron-metadata-agent.service \
neutron-l3-agent.service

完成後啟動所有 Neutron 服務

$ sudo systemctl start neutron-linuxbridge-agent.service \ neutron-dhcp-agent.service neutron-metadata-agent.service \
neutron-l3-agent.service

Network 驗證服務

接著回到Controller節點導入 admin 帳號來驗證服務:

$ . admin-openrc

這邊可以透過 Neutron client 來查看 Agents 狀態,如以下方式:

$ neutron agent-list
+--------------------------------------+--------------------+----------+-------------------+-------+----------------+---------------------------+
| id                                   | agent_type         | host     | availability_zone | alive | admin_state_up | binary                    |
+--------------------------------------+--------------------+----------+-------------------+-------+----------------+---------------------------+
| 47e05144-8084-464b-bfd5-2e59bbb158e0 | Metadata agent     | network  |                   | :-)   | True           | neutron-metadata-agent    |
| 9947deb7-7e59-42ab-9e91-3f892a4f9d7e | Linux bridge agent | network  |                   | :-)   | True           | neutron-linuxbridge-agent |
| c262eafe-415f-4eb3-a686-de1363ff8a01 | DHCP agent         | network  | nova              | :-)   | True           | neutron-dhcp-agent        |
| e64cf4f9-02b0-41fa-b9a8-def19f0e2813 | L3 agent           | network  | nova              | :-)   | True           | neutron-l3-agent          |
+--------------------------------------+--------------------+----------+-------------------+-------+----------------+---------------------------+

Compute Node

Neutron 在 Compute 節點主要安裝 Neutron L2 Agent 來讓虛擬機連接虛擬網路與安全群組。

Compute 安裝前準備

在進行安裝 Neutron 相關套件之前,必須先讓 Compute 節點主機設定一些 Kernel 網路參數,透過編輯 /etc/sysctl.conf 加入以下參數:

net.ipv4.conf.all.rp_filter=0
net.ipv4.conf.default.rp_filter=0
net.bridge.bridge-nf-call-iptables=1
net.bridge.bridge-nf-call-ip6tables=1

完成後,可以透過 sysctl 指令來將參數載入:

$ sudo sysctl -p

Compute 套件安裝與設定

在開始設定之前,首先要安裝相關套件與 OpenStack 服務套件,可以透過以下指令進行安裝:

$ sudo yum install openstack-neutron-linuxbridge ebtables

安裝完成後,編輯 /etc/neutron/neutron.conf 設定檔,在[DEFAULT]部分加入以下設定:

[DEFAULT]
...
verbose = True
rpc_backend = rabbit
auth_strategy = keystone
core_plugin = ml2
service_plugins = router
allow_overlapping_ips = True

[database]部分將所有 connection 與 sqlite 的參數註解掉:

[database]
# connection = sqlite:////var/lib/neutron/neutron.sqlite

[oslo_messaging_rabbit]部分加入以下設定:

[oslo_messaging_rabbit]
rabbit_host = 10.0.0.11
rabbit_userid = openstack
rabbit_password = RABBIT_PASS

這邊RABBIT_PASS可以隨需求修改。

[keystone_authtoken]部分加入以下設定:

[keystone_authtoken]
auth_uri = http://10.0.0.11:5000
auth_url = http://10.0.0.11:35357
memcached_servers = 10.0.0.11:11211
auth_type = password
project_domain_name = default
user_domain_name = default
project_name = service
username = neutron
password = NEUTRON_PASS

這邊NEUTRON_PASS可以隨需求修改。

[oslo_concurrency]部分加入以下內容:

[oslo_concurrency]
lock_path = /var/lib/neutron/tmp

Compute 設定 ML2

這邊 Neutron ML2 外掛使用 Linux bridge agent 來提供給虛擬機建立虛擬網路。這邊 Compute 需要設定 Linux bridge agent,因為 Compute 會透過 Agent 連接 Network 節點來使用虛擬化網路。要設定 Linux bridge agent 可以編輯/etc/neutron/plugins/ml2/linuxbridge_agent.ini,在[vxlan]部分加入以下設定:

[vxlan]
local_ip = OVERLAY_IP
enable_vxlan = true
l2_population = True

這邊OVERLAY_IP10.0.1.31

[agent]部分加入以下設定:

[agent]
tunnel_types = vxlan
prevent_arp_spoofing = True

[securitygroup]部分加入以下設定:

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

設定 Compute 使用 Network

當完成 ML2 設定後,接著編輯/etc/nova/nova.conf,在[neutron]部分加入以下設定::

[neutron]
url = http://10.0.0.11:9696
auth_url = http://10.0.0.11:35357
auth_type = password
project_domain_name = default
user_domain_name = default
region_name = RegionOne
project_name = service
username = neutron
password = NEUTRON_PASS

這邊NEUTRON_PASS可以隨需求修改。

當完成上述安裝與設定後,在Compute節點重新啟動 Nova compute:

$ sudo systemctl restart openstack-nova-compute.service

設定開機時啟動與重新啟動 Linux Bridge Agent:

sudo systemctl enable neutron-linuxbridge-agent.service
sudo systemctl start neutron-linuxbridge-agent.service

Compute 驗證服務

接著回到Controller節點導入 admin 帳號來驗證服務:

$ . admin-openrc

這邊可以透過 Neutron client 來查看 Agents 狀態,如以下方式:

$ neutron agent-list

若正確的話,會看到多一個compute節點執行了 agent

完成後,就可以建立外部網路與租戶網路(Self-service),請參閱 建立外部網路與租戶網路