在路由提供商网络之前,网络服务不能将多段三层网络呈现为单个实体。因此,每个运营商通常选择以下架构之一:
单大二层网络
多个较小的第2层网络
单个大型二层网络在规模上变得复杂,并且涉及显着的故障域。
多个较小的二层网络可以更好地扩展和收缩故障域,但是将网络选择留给用户。没有附加信息,用户不能轻易地区分这些网络。
路由提供商网络使得单个提供商网络能够表示多个二层网络(广播域)或段,并且使得运营商能够向用户呈现一个网络。然而,实例可用的特定IP地址取决于特定计算节点上可用的网络段。
类似于常规网络,层2(交换)处理在同一段上的端口之间的业务的传输,并且层3(路由)处理段之间的业务的传输。
每个分段需要至少一个明确属于该分段的子网。段和子网之间的关联将路由提供商网络与其他类型的网络区分开。网络服务强制将特定网络上的零个或所有子网与段关联。例如,尝试在包含具有段的子网的网络上创建不包含段的子网将生成错误。
网络服务不提供段之间的三层服务。相反,它依靠物理网络基础设施来路由子网。因此,网络服务和物理网络基础设施必须包含与常规提供商网络类似的路由提供商网络的配置。在将来,动态路由协议的实现可以缓解路由网络的配置。
限制
牛顿实现包含以下限制:
Compute调度程序缺少对路由网络上的IP地址资源的感知。因此,调度器可以在从另一个段分配IP地址之前耗尽一个段中的IP地址。 Computa调度程序的Ocata版本应提供在没有可用IP地址的段周围进行调度的能力。在Newton中,Compute调度程序选择提供商网络上的任何计算节点。如果该计算节点上的段缺少可用的IP地址,则端口绑定失败,并且Compute调度程序选择另一个计算节点而不考虑段。重新计划持续到最大重试次数。运营商应该监控IP使用,并在IP地址耗尽之前将段子网添加到段。
路由提供商网络也不能用作路由器:外部网络,它会阻止与浮动IPv4地址的兼容性。额外的路由,可能使用BGP动态路由,可能在未来解决这个问题。
先决条件
路由提供商网络需要比传统提供商网络更多的先决条件。我们建议使用以下过程:
1.从段开始。网络服务使用以下组件定义段:
- 唯一的物理网络名称
- 分段类型
- 细分ID
例如,provider1,VLAN和2016.有关详细信息,请参阅API参考。
在网络中,为每个段使用唯一的物理网络名称,这样可以在子网之间重复使用相同的细分细节。例如,在特定提供商网络的所有段中使用相同的VLAN ID。与传统的提供商网络类似,运营商必须相应地提供第2层物理网络基础设施。
2.实现段之间的路由。
网络服务不在段之间设置路由。运营商必须实现在提供商网络的段之间的路由。段上的每个子网必须包含该特定子网上的路由器接口的网关地址。例如:
段 | 版本 | 地址 | 网关 |
---|---|---|---|
segment1 | 4 | 203.0.113.0/24 | 203.0.113.1 |
segment1 | 6 | fd00:203:0:113::/64 | fd00:203:0:113::1 |
segment2 | 4 | 198.51.100.0/24 | 198.51.100.1 |
segment2 | 6 | fd00:198:51:100::/64 | fd00:198:51:100::1 |
3.将段映射到计算节点。
路由提供商网络暗示计算节点驻留在不同的段上。 运营商应该维护此映射以帮助配置代理。
主机 | 架 | 物理网络 |
---|---|---|
compute001 | rack1 | segment1 |
compute002 | rack1 | segment1 |
… | … | … |
compute0101 | rack2 | segment2 |
compute0102 | rack2 | segment2 |
compute0102 | rack2 | segment2 |
… | … | … |
4.部署DHCP代理。
与传统的提供商网络不同,DHCP代理不能支持网络中的多个段。 运营商必须为每个分段部署至少一个DHCP代理。 考虑在包含段而不是一个或多个网络节点的计算节点上部署DHCP代理,以减少节点计数。
主机 | 架 | 物理网络 |
---|---|---|
network001 | rack1 | segment1 |
network002 | rack2 | segment2 |
… | … | … |
配置样例
控制节点
1.通过在运行neutron-server服务的所有节点上的neutron.conf文件中的service_plugins列表中添加段来启用段服务插件:
[DEFAULT]
...
service_plugins = ..., segments
2.重启neutron服务
网络和计算节点
在每个节点上配置第2层代理,以将一个或多个段映射到适当的物理网络桥接或接口,并重新启动代理。
创建一个路由提供商网络
以下步骤创建具有两个段的路由提供程序网络。 每个段包含一个IPv4子网和一个IPv6子网。
1.源管理项目凭据。
2.创建包含默认段的VLAN提供程序网络。 在此示例中,网络使用具有VLAN ID 2016的provider1物理网络。
$ openstack network create --share --provider-physical-network provider1 \
--provider-network-type vlan --provider-segment 2016 multisegment1
+---------------------------+--------------------------------------+
| Field | Value |
+---------------------------+--------------------------------------+
| admin_state_up | UP |
| id | 6ab19caa-dda9-4b3d-abc4-5b8f435b98d9 |
| ipv4_address_scope | None |
| ipv6_address_scope | None |
| l2_adjacency | True |
| mtu | 1500 |
| name | multisegment1 |
| port_security_enabled | True |
| provider:network_type | vlan |
| provider:physical_network | provider1 |
| provider:segmentation_id | 2016 |
| router:external | Internal |
| shared | True |
| status | ACTIVE |
| subnets | |
| tags | [] |
+---------------------------+--------------------------------------+
将默认分段重命名为segment1
$ openstack network segment list --network multisegment1
+--------------------------------------+----------+--------------------------------------+--------------+---------+
| ID | Name | Network | Network Type | Segment |
+--------------------------------------+----------+--------------------------------------+--------------+---------+
| 43e16869-ad31-48e4-87ce-acf756709e18 | None | 6ab19caa-dda9-4b3d-abc4-5b8f435b98d9 | vlan | 2016 |
+--------------------------------------+----------+--------------------------------------+--------------+---------+
$ openstack network segment set --name segment1 43e16869-ad31-48e4-87ce-acf756709e18
4.在提供商网络上创建第二个段。 在此示例中,段使用具有VLAN ID 2016的provider2物理网络。
$ openstack network segment create --physical-network provider2 \
--network-type vlan --segment 2016 --network multisegment1 segment2
+------------------+--------------------------------------+
| Field | Value |
+------------------+--------------------------------------+
| description | None |
| headers | |
| id | 053b7925-9a89-4489-9992-e164c8cc8763 |
| name | segment2 |
| network_id | 6ab19caa-dda9-4b3d-abc4-5b8f435b98d9 |
| network_type | vlan |
| physical_network | provider2 |
| segmentation_id | 2016 |
+------------------+--------------------------------------+
5.验证网络是否包含segment1和segment2段。
$ openstack network segment list --network multisegment1
+--------------------------------------+----------+--------------------------------------+--------------+---------+
| ID | Name | Network | Network Type | Segment |
+--------------------------------------+----------+--------------------------------------+--------------+---------+
| 053b7925-9a89-4489-9992-e164c8cc8763 | segment2 | 6ab19caa-dda9-4b3d-abc4-5b8f435b98d9 | vlan | 2016 |
| 43e16869-ad31-48e4-87ce-acf756709e18 | segment1 | 6ab19caa-dda9-4b3d-abc4-5b8f435b98d9 | vlan | 2016 |
+--------------------------------------+----------+--------------------------------------+--------------+---------+
6.在segment1段上创建子网。在本示例中,IPv4子网使用203.0.113.0/24,IPv6子网使用fd00:203:0:113 :: / 64。
$ openstack subnet create \
--network multisegment1 --network-segment segment1 \
--ip-version 4 --subnet-range 203.0.113.0/24 \
multisegment1-segment1-v4
+-------------------+--------------------------------------+
| Field | Value |
+-------------------+--------------------------------------+
| allocation_pools | 203.0.113.2-203.0.113.254 |
| cidr | 203.0.113.0/24 |
| enable_dhcp | True |
| gateway_ip | 203.0.113.1 |
| id | c428797a-6f8e-4cb1-b394-c404318a2762 |
| ip_version | 4 |
| name | multisegment1-segment1-v4 |
| network_id | 6ab19caa-dda9-4b3d-abc4-5b8f435b98d9 |
| segment_id | 43e16869-ad31-48e4-87ce-acf756709e18 |
+-------------------+--------------------------------------+
$ openstack subnet create \
--network multisegment1 --network-segment segment1 \
--ip-version 6 --subnet-range fd00:203:0:113::/64 \
--ipv6-address-mode slaac multisegment1-segment1-v6
+-------------------+------------------------------------------------------+
| Field | Value |
+-------------------+------------------------------------------------------+
| allocation_pools | fd00:203:0:113::2-fd00:203:0:113:ffff:ffff:ffff:ffff |
| cidr | fd00:203:0:113::/64 |
| enable_dhcp | True |
| gateway_ip | fd00:203:0:113::1 |
| id | e41cb069-9902-4c01-9e1c-268c8252256a |
| ip_version | 6 |
| ipv6_address_mode | slaac |
| ipv6_ra_mode | None |
| name | multisegment1-segment1-v6 |
| network_id | 6ab19caa-dda9-4b3d-abc4-5b8f435b98d9 |
| segment_id | 43e16869-ad31-48e4-87ce-acf756709e18 |
+-------------------+------------------------------------------------------+
7.在segment2段上创建子网。 在此示例中,IPv4子网使用198.51.100.0/24,IPv6子网使用fd00:198:51:100 :: / 64。
$ openstack subnet create \
--network multisegment1 --network-segment segment2 \
--ip-version 4 --subnet-range 198.51.100.0/24 \
multisegment1-segment2-v4
+-------------------+--------------------------------------+
| Field | Value |
+-------------------+--------------------------------------+
| allocation_pools | 198.51.100.2-198.51.100.254 |
| cidr | 198.51.100.0/24 |
| enable_dhcp | True |
| gateway_ip | 198.51.100.1 |
| id | 242755c2-f5fd-4e7d-bd7a-342ca95e50b2 |
| ip_version | 4 |
| name | multisegment1-segment2-v4 |
| network_id | 6ab19caa-dda9-4b3d-abc4-5b8f435b98d9 |
| segment_id | 053b7925-9a89-4489-9992-e164c8cc8763 |
+-------------------+--------------------------------------+
$ openstack subnet create \
--network multisegment1 --network-segment segment2 \
--ip-version 6 --subnet-range fd00:198:51:100::/64 \
--ipv6-address-mode slaac multisegment1-segment2-v6
+-------------------+--------------------------------------------------------+
| Field | Value |
+-------------------+--------------------------------------------------------+
| allocation_pools | fd00:198:51:100::2-fd00:198:51:100:ffff:ffff:ffff:ffff |
| cidr | fd00:198:51:100::/64 |
| enable_dhcp | True |
| gateway_ip | fd00:198:51:100::1 |
| id | b884c40e-9cfe-4d1b-a085-0a15488e9441 |
| ip_version | 6 |
| ipv6_address_mode | slaac |
| ipv6_ra_mode | None |
| name | multisegment1-segment2-v6 |
| network_id | 6ab19caa-dda9-4b3d-abc4-5b8f435b98d9 |
| segment_id | 053b7925-9a89-4489-9992-e164c8cc8763 |
+-------------------+--------------------------------------------------------+
8.验证每个IPv4子网与至少一个DHCP代理相关联。
$ neutron dhcp-agent-list-hosting-net multisegment1
+--------------------------------------+-------------+----------------+-------+
| id | host | admin_state_up | alive |
+--------------------------------------+-------------+----------------+-------+
| c904ed10-922c-4c1a-84fd-d928abaf8f55 | compute0001 | True | :-) |
| e0b22cc0-d2a6-4f1c-b17c-27558e20b454 | compute0101 | True | :-) |
+--------------------------------------+-------------+----------------+-------+
9.启动一个或多个实例。 每个实例根据其在特定计算节点上使用的段获得IP地址。
创建端口并将其传递给实例会产生与传统网络不同的行为。 网络服务将IP地址分配给端口,直到特定的计算节点变得明显。 例如:
$ openstack port create --network multisegment1 port1
+-----------------------+--------------------------------------+
| Field | Value |
+-----------------------+--------------------------------------+
| admin_state_up | UP |
| binding_vnic_type | normal |
| id | 6181fb47-7a74-4add-9b6b-f9837c1c90c4 |
| ip_allocation | deferred |
| mac_address | fa:16:3e:34:de:9b |
| name | port1 |
| network_id | 6ab19caa-dda9-4b3d-abc4-5b8f435b98d9 |
| port_security_enabled | True |
| security_groups | e4fcef0d-e2c5-40c3-a385-9c33ac9289c5 |
| status | DOWN |
+-----------------------+--------------------------------------+