网络服务 Neutron 介绍

OpenStack 网络服务包含以下组件:

  • neutron-server 服务
  • OpenStack Networking 插件和代理
  • 队列服务

网络服务 Neutron 概念

OpenStack 网络服务 neutron 管理整个 OpenStack 环境中虚拟网络基础设施 VNI 的所有网络以及物理网络基础设施 PNI 的接入层。 网络服务使项目能够创建高级虚拟网络拓扑结构,其中可能包括防火墙,负载平衡器和虚拟专用网络 VPN 等服务。

网络服务提供抽象的网络,子网和路由器对象。每个抽象对象能够模拟其物理功能:网络包含子网,路由器在不同子网和网络之间进行路由通信。

任何给定的网络设置至少有一个外部网络。与其他网络不同,外部网络不仅仅是一个虚拟定义的网络。相反,它代表了除 OpenStack 安装之外可访问的物理外部网络的一部分。外部网络上的 IP 地址可以通过互联网来访问。

除了外部网络外,任何网络设置都有一个或多个内部网络。这些软件定义的网络 SDN 直接连接至虚拟机。只有在特定内部网络上的虚拟机,或通过接口连接到具有类路由器功能的子网上的虚拟机才能直接访问到该网络的虚拟机。

而对于从外部网络访问虚拟机,则需要通过网络之间的路由器。每个路由器都有一个连接到外部网络的网关和一个或多个连接到内部网络的接口。与物理路由器一样,子网可以访问到同一路由器的其他子网上的机器,虚拟机也可以通过路由器的网关访问外部网络。

另外,您可以将外部网络上的 IP 地址分配给内部网络上的端口。当有请求连接到子网时,该连接将占用一个端口。您可以将外部网络的 IP 地址与端口号关联到虚拟机上。这样,就可以通过外部网络来访问虚拟机了。

网络服务也支持安全组。安全组能使管理员按组来定义防火墙规则。一个虚拟机可以属于一个或多个安全组,网络服务会在这些安全组中应用这些规则,以开放或关闭虚拟机的端口,为虚拟机设置端口范围或流量类型。

每个网络服务的插件都有其自身的用途。虽然理解这些概念对于配置运行 VNIOpenStack 环境并不是必须的,但是它们可以帮助您更好地设置网络。所有网络服务安装都使用核心插件和安全组插件(或者仅使用 No-Op 安全组插件)。此外,网络服务还提供防火墙即服务 FWaaS 和负载均衡即服务 LBaaS 插件。

安装网络服务 Neutron

安装于控制节点

配置数据库

1
$ mysql -u root -p

新建数据库 neutron

1
MariaDB [(none)]> create database neutron;

赋予 neutron 用户权限并设置 NEUTRON_DBPASSWORD

1
2
MariaDB [(none)]> grant all privileges on neutron.* to 'neutron'@'localhost' identified by 'NEUTRON_DBPASSWORD';
MariaDB [(none)]> grant all privileges on neutron.* to 'neutron'@'%' identified by 'NEUTRON_DBPASSWORD';

新建服务证书及 API Endpoints

导入 admin 环境变量:

1
$ . admin-openrc

新建 neutron 用户并设置密码 NEUTRON_PASSWORD

1
$ openstack user create --domain default --password-prompt neutron

admin 角色加入 neutron 用户中:

1
$ openstack role add --project service --user neutron admin

生成 neutron 服务入口点:

1
$ openstack service create --name neutron --description "OpenStack Networking" network

生成网络服务 API Endpoints

1
2
3
$ openstack endpoint create --region RegionOne network public http://controller:9696
$ openstack endpoint create --region RegionOne network internal http://controller:9696
$ openstack endpoint create --region RegionOne network admin http://controller:9696

安装配置组件

Neutron 提供了选项一和选项二两种方式来部署 OpenStack 网络。

选项一提供的部署方案是一个简易化的网络架构,只支持将实例加入服务提供商网络(即外部网络)中。不支持自服务网络,路由以及浮动 IP 。只有 admin 和其他有权限的用户能够管理该络。

选项二是在选项一的基础上添加了第三层(网络层)服务。使之能够支持实例加入自服务网络。demo 以及其他未授权用户能够管理包括了提供自服务与服务提供商网络之间的路由的自服务网络。除此之外,浮动 IP 使得实例能够通过自服务网络连接到外部网络(如 Internet)。

自助服务网络通常使用覆盖网络。 覆盖网络协议(如 VXLAN)包含额外的数据头部,这些头部会增加开销并减少有效负载或用户数据的可用空间。 在不知道虚拟网络架构的情况下,实例尝试使用 1500 字节的以太网默认最大传输单元 MTU 发送数据包。 网络服务通过 DHCP 自动为实例提供正确的 MTU 值。 但是,一些云镜像不使用 DHCP 或忽略 DHCP MTU 选项而使用元数据或脚本进行配置。

以下两种网络配置选项只需要选择一种。

网络选项一

安装组件包:

1
# yum install openstack-neutron openstack-neutron-ml2 openstack-neutron-linuxbridge ebtables

修改 /etc/neutron/neutron.conf

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
[DEFAULT]
# ...
core_plugin = ml2
service_plugins = 	#就是空的,什么选项都不要写
transport_url = rabbit://openstack:RABBIT_PASSWORD@controller
auth_strategy = keystone
notify_nova_on_port_status_changes = true
notify_nova_on_port_data_changes = true

[database]
# ...
connection = mysql+pymysql://neutron:NEUTRON_DBPASSWORD@controller/neutron

[keystone_authtoken]
# ...
auth_uri = http://controller:5000
auth_url = http://controller:35357
memcached_servers = controller:11211
auth_type = password
project_domain_name = default
user_domain_name = default
project_name = service
username = neutron
password = NEUTRON_PASSWORD

[nova]
# ...
auth_url = http://controller:35357
auth_type = password
project_domain_name = default
user_domain_name = default
region_name = RegionOne
project_name = service
username = nova
password = NOVA_PASSWORD

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

RABBIT_PASSWORD, NEUTRON_DBPASSWORD, NEUTRON_PASSWORD, NOVA_PASSWORD 更改为自己使用的密码。

修改 /etc/neutron/plugins/ml2/ml2_conf.ini 文件,以配置 Modular Layer 2 (ML2) 插件:

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
[ml2]
# ...
type_drivers = flat, vlan
tenant_network_types = 		#就是空的,什么选项都不要写
mechanism_drivers = linuxbridge
extension_drivers = port_security

[ml2_type_flat]
# ...
flat_networks = provider

[securitygroup]
# ...
enable_ipset = true

修改 /etc/neutron/plugins/ml2/linuxbridge_agent.ini 文件,以配置 Linux bridge 代理:

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
[linux_bridge]
physical_interface_mappings = provider:PROVIDER_INTERFACE_NAME

[vxlan]
enable_vxlan = true

[securitygroup]
# ...
enable_security_group = true
firewall_driver = neutron.agent.linux.iptables_fiewall.IptablesFirewallDriver

PROVIDER_INTERFACE_NAME 是机器能够连通外网的网卡的名称,即处于服务提供商网络 Provider Network 中的网卡。

网络拓扑示例(图中红色 NIC 处在管理网络中,绿色 NIC 处在提供商网络中):

修改 /etc/neutron/dhcp_agent.ini 文件,以配置 DHCP 代理:

1
2
3
4
5
[DEFAULT]
# ...
interface_driver = linuxbridge
dhcp_driver = neutron.agent.linux.dhcp.Dnsmaq
enable_isolated_metadata = true

若已使用 网络选项一 配置完成,请跳过该节的 网络选项二

网络选项二

安装组件包:

1
# yum install openstack-neutron openstack-neutron-ml2 openstack-neutron-linuxbridge ebtables

修改 /etc/neutron/neutron.conf

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
[DEFAULT]
# ...
core_plugin = ml2
service_plugins = router
allow_overlapping_ips = true
transport_url = rabbit://openstack:RABBIT_PASSWORD@controller
auth_strategy = keystone
notify_nova_on_port_status_changes = true
notify_nova_on_port_data_changes = true


[database]
# ...
connection = mysql+pymysql://neutron:NEUTRON_DBPASSOWRD@controller/neutron

[keystone_authtoken]
# ...
auth_uri = http://controller:5000
auth_url = http://controller:35357
memcached_servers = controller:11211
auth_type = password
project_domain_name = default
user_domain_name = default
project_name = service
username = neutron
password = NEUTRON_PASSWORD

[nova]
# ...
auth_url = http://controller:35357
auth_type = password
project_domain_name = default
user_domain_name = default
region_name = RegionOne
project_name = service
username = nova
password = NOVA_PASSWORD

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

RABBIT_PASSWORD, NEUTRON_DBPASSWORD, NEUTRON_PASSWORD, NOVA_PASSWORD 更改为自己使用的密码。

修改 /etc/neutron/plugins/ml2/ml2_conf.ini 文件,以配置 Modular Layer 2 (ML2) 插件:

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
[ml2]
# ...
type_drivers = flat, vlan, vxlan
tenant_network_types = vxlan
mechanism_drivers = linuxbridge, l2population
extension_drivers = port_security

[ml2_type_flat]
# ...
flat_networks = provider

[ml2_type_vxlan]
# ...
vni_ranges = 1:1000

[securitygroup]
# ...
enable_ipset = true

Linux bridge 代理只支持 VXLAN 覆盖网络。

修改 /etc/neutron/plugins/ml2/linuxbridge_agent.ini 文件,以配置 Linux bridge 代理:

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
[linux_bridge]
physical_interface_mappings = provider:PROVIDER_INTERFACE_NAME

[vxlan]
enable_vxlan = true
local_ip = OVERLAY_INTERFACE_IP_ADDRESS
l2_population = true

[securitygroup]
# ...
enable_security_group = true
firewall_driver = neutron.agent.linux.iptables_firewall.IptablesFirewallDriver
  • PROVIDER_INTERFACE_NAME 是机器能够连通外网的网卡的名称,即处于服务提供商网络 Provider Network 中的网卡;
  • OVERLAY_INTERFACE_IP_ADDRESS 是机器之间通信的网卡的 IP 地址,即处于管理网络 Management Network 中的网卡。

网络拓扑示例(图中红色 NIC 处在管理网络中,绿色 NIC 处在提供商网络中):

网络拓扑示意
网络拓扑示意

修改 /etc/neutron/l3_agent.ini 文件,以配置第三层代理 Layer-3 (L3) agent

1
2
3
[DEFAULT]
# ...
interface_driver = linuxbridge

修改 /etc/neutron/dhcp_agent.ini 文件,以配置 DHCP 代理:

1
2
3
4
5
[DEFAULT]
# ...
interface_driver = linuxbridge
dhcp_driver = neutron.agent.linux.dhcp.Dnsmasq
enable_isolated_metadata = true

配置元数据代理

编辑 /etc/neutron/metadata_agent.ini 文件:

1
2
3
4
[DEFAULT]
# ...
nova_metadata_ip = controller
metadata_proxy_shared_secret = METADATA_SECRET

METADATA_SECRET 设置成自己需要的密码。

配置计算服务的网络项

编辑 /etc/nova/nova.conf 文件:

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
[neutron]
# ...
url = http://controller:9696
auth_url = http://controller:3537
auth_type = password
project_domain_name = default
user_domain_name = default
region_name = RegionOne
project_name = service
username = neutron
password = NEUTRON_PASSWORD
service_metadata_proxy = true
metadata_proxy_shared_secret = METADATA_SECRET

NEUTRON_PASSWORDMETADATA_SECRET 更改为之前设置的密码。

同步数据库

建立文件连接:

1
# ln -s /etc/neutron/plugins/ml2/ml2_conf.ini /etc/neutron/plugin.ini

填充 neutron 数据库:

1
# 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

启动网络服务

重启 nova 计算服务:

1
# systemctl restart openstack-nova-api

开启 neutron 网络服务:

1
2
# systemctl enable neutron-server neutron-linuxbridge-agent neutron-dhcp-agent neutron-metadata-agent
# systemctl start neutron-server neutron-linuxbridge-agent neutron-dhcp-agent neutron-metadata-agent

若选择的是选项二 Self-service Networks 的配置,则需要启动 L3 服务:

1
2
# systemctl enable neutron-l3-agent
# systemctl start neutron-l3-agent

安装于计算节点

安装配置组件

安装组件包:

1
# yum install openstack-neutron-linuxbridge ebtables ipset

修改 /etc/neutron/neutron.conf 文件:

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
[DEFAULT]
# ...
transport_url = rabbit://openstack:RABBIT_PASSWORD@controller
auth_strategy = keystone

[keystone_authtoken]
# ...
auth_uri = http://controller:5000
auth_url = http://controller:35357
memcached_servers = controller:11211
auth_type = password
project_domain_name = default
user_domain_name = default
project_name = service
username = neutron
password = NEUTRON_PASSWORD

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

RABBIT_PASSWORD, NEUTRON_PASSWORD 更改为自己的密码。

配置网络选项

遵循控制节点上选用的网络选项。

网络选项一

编辑 /etc/neutron/plugins/ml2/linuxbridge_agent.ini 文件:

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
[linux_bridge]
physical_interface_mappings = provider:PROVIDER_INTERFACE_NAME

[vxlan]
enable_vxlan = false

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

PROVIDER_INTERFACE_NAME 是机器能够连通外网的网卡的名称,即处于服务提供商网络 Provider Network 中的网卡。

若已使用 网络选项一 配置完成,请跳过该节的 网络选项二

网络选项二

编辑 /etc/neutron/plugins/ml2/linuxbridge_agent.ini 文件:

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
[linux_bridge]
physical_interface_mappings = provider:PROVIDER_INTERFACE_NAME

[vxlan]
enable_vxlan = true
local_ip = OVERLAY_INTERFACE_IP_ADDRESS
l2_population = true

[securitygroup]
# ...
enable_security_group = true
firewall_driver = neutron.agent.linux.iptables_firewall.IptablesFirewallDriver
  • PROVIDER_INTERFACE_NAME 是机器能够连通外网的网卡的名称,即处于服务提供商网络 Provider Network 中的网卡;
  • OVERLAY_INTERFACE_IP_ADDRESS 是机器之间通信的网卡的 IP 地址,即处于管理网络 Management Network 中的网卡。

配置计算服务的网络项

编辑 /etc/nova/nova.conf 文件:

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
[neutron]
# ...
url = http://controller:9696
auth_url = http://controller:35357
auth_type = password
project_domain_name = default
user_domain_name = default
region_name = RegionOne
project_name = service
username = neutron
password = NEUTRON_PASSWORD

NEUTRON_PASSWORD 替换为自己的密码。

启动网络服务

重启计算服务:

1
# systemctl restart openstack-nova-compute

启动网络服务:

1
2
# systemctl enable neutron-linuxbridge-agent
# systemctl start neutron-linuxbridge-agent

若对计算节点有所更改,也需要重启计算节点上的网络服务。

服务测试

在控制节点上操作。

导入 admin 环境变量:

1
$ . admin-openrc

查看 neutron-server 成功启动的网络进程:

1
$ openstack extension list --network

查看成功启动的 neutron 代理:

1
$ openstack network agent list

若没有出现计算节点的 Linux bridge 服务,可能是因为计算节点上的网络服务未能正确启动,要注意查看日志。

总结

网络服务的安装倒是出奇的顺利,简直超乎自己的预料一周完成就不错了Neutron 的配置文件比较多,也相对杂乱,还是要在配置时谨慎操作。小心使得万年船。


知识共享许可协议
本作品采用知识共享署名-相同方式共享 4.0 国际许可协议进行许可。