子网池¶
子网池功能自 Kilo 版本发布以来可用。这是一个简单的功能,但有可能大大改善您的工作流程。它还提供了一个构建块,OpenStack Networking 中的其他新功能将基于此构建。
要查看您的云是否具有此功能,您可以检查它是否列在受支持的别名中。您可以使用 OpenStack 客户端执行此操作。
$ openstack extension list | grep subnet_allocation
| Subnet Allocation | subnet_allocation | Enables allocation of subnets
from a subnet pool |
您需要它们的原因¶
在 Kilo 之前,Networking 在用于创建子网的地址方面没有自动化。要创建一个,您必须自己想出地址,而无需系统提供任何帮助。对于这种情况有有效的用例,但如果您对以下功能感兴趣,那么子网池可能适合您。
首先,如果您可以将地址池交给 Neutron 来处理,那该多好?当您需要创建子网时,只需请求从池中分配地址。您不必担心已经使用过的内容以及池中的地址。子网池可以做到这一点。
其次,子网池可以管理跨项目的地址。保证地址不会重叠。如果地址来自外部可路由的池,那么您就知道所有项目都具有可路由且唯一的地址。这在以下场景中很有用。
IPv6,因为 OpenStack Networking 没有 IPv6 浮动 IP。
直接从外部网络路由到项目网络。
它们的工作原理¶
子网池管理一个地址池,子网可以从中分配。它确保从同一池分配的任何两个子网之间没有重叠。
作为 OpenStack 云中的常规项目,您可以创建自己的子网池并使用它来管理自己的地址池。这不需要任何管理员权限。您的池对任何其他项目都不可见。
如果您是管理员,您可以创建一个可以被任何常规项目访问的池。作为共享资源,存在一个配额机制来仲裁访问。
配额¶
子网池具有与其他 Neutron 配额略有不同的配额系统。Neutron 中的其他配额会计算对象的一个离散实例与配额的对比。每次您创建诸如路由器、网络或端口之类的东西时,它都会使用您的总配额中的一个。
对于子网,资源是 IP 地址空间。有些子网占用比其他子网更多的空间。例如,203.0.113.0/24 使用一个子网中的 256 个地址,但 198.51.100.224/28 仅使用 16 个。如果地址空间有限,配额系统可以鼓励有效地使用空间。
对于 IPv4,default_quota 可以设置为任何给定项目允许从池中消耗的绝对地址数。例如,如果配额为 128,我可能会获得 203.0.113.128/26、203.0.113.224/28,并且仍然有空间在未来分配 48 个更多地址。
对于 IPv6,情况略有不同。计算单个地址是不切实际的。为了避免过大的数字,配额表示可以分配的 /64 子网的数量。例如,如果 default_quota 为 3,我可能会获得 2001:db8:c18e:c05a::/64、2001:db8:221c:8ef3::/64,并且仍然有空间在未来分配一个更多前缀。
默认子网池¶
从 Mitaka 开始,子网池可以标记为默认值。这通过一个新的扩展来处理。
$ openstack extension list | grep default-subnetpools
| Default Subnetpools | default-subnetpools | Provides ability to mark
and use a subnetpool as the default |
管理员可以将一个池标记为默认值。每个地址族只能标记一个池为默认值。
$ openstack subnet pool set --default 74348864-f8bf-4fc0-ab03-81229d189467
如果存在默认值,可以通过在创建子网时传递 --use-default-subnet-pool 而不是 --subnet-pool SUBNETPOOL 来请求它。
演示¶
如果您可以访问基于 OpenStack Kilo 或更高版本的 neutron,您现在可以尝试此功能。试试看。以下所有命令都同样适用于 IPv6 地址。
首先,作为管理员,创建一个共享子网池
$ openstack subnet pool create --share --pool-prefix 203.0.113.0/24 \
--default-prefix-length 26 demo-subnetpool4
+-------------------+--------------------------------+
| Field | Value |
+-------------------+--------------------------------+
| address_scope_id | None |
| created_at | 2016-12-14T07:21:26Z |
| default_prefixlen | 26 |
| default_quota | None |
| description | |
| headers | |
| id | d3aefb76-2527-43d4-bc21-0ec253 |
| | 908545 |
| ip_version | 4 |
| is_default | False |
| max_prefixlen | 32 |
| min_prefixlen | 8 |
| name | demo-subnetpool4 |
| prefixes | 203.0.113.0/24 |
| project_id | cfd1889ac7d64ad891d4f20aef9f8d |
| | 7c |
| revision_number | 1 |
| shared | True |
| tags | [] |
| updated_at | 2016-12-14T07:21:26Z |
+-------------------+--------------------------------+
default_prefix_length 定义了如果您在创建子网时未指定 --prefix-length 将获得的子网大小。
对 IPv6 执行基本相同的操作,现在有两个子网池。常规项目可以看到它们。(输出略有修剪以供显示)
$ openstack subnet pool list
+------------------+------------------+--------------------+
| ID | Name | Prefixes |
+------------------+------------------+--------------------+
| 2b7cc19f-0114-4e | demo-subnetpool | 2001:db8:a583::/48 |
| f4-ad86-c1bb91fc | | |
| d1f9 | | |
| d3aefb76-2527-43 | demo-subnetpool4 | 203.0.113.0/24 |
| d4-bc21-0ec25390 | | |
| 8545 | | |
+------------------+------------------+--------------------+
现在,使用它们。从池中创建一个子网很容易
$ openstack subnet create --ip-version 4 --subnet-pool \
demo-subnetpool4 --network demo-network1 demo-subnet1
+-------------------+--------------------------------------+
| Field | Value |
+-------------------+--------------------------------------+
| allocation_pools | 203.0.113.194-203.0.113.254 |
| cidr | 203.0.113.192/26 |
| created_at | 2016-12-14T07:33:13Z |
| description | |
| dns_nameservers | |
| enable_dhcp | True |
| gateway_ip | 203.0.113.193 |
| headers | |
| host_routes | |
| id | 8d4fbae3-076c-4c08-b2dd-2d6175115a5e |
| ip_version | 4 |
| ipv6_address_mode | None |
| ipv6_ra_mode | None |
| name | demo-subnet1 |
| network_id | 6b377f77-ce00-4ff6-8676-82343817470d |
| project_id | cfd1889ac7d64ad891d4f20aef9f8d7c |
| revision_number | 2 |
| service_types | |
| subnetpool_id | d3aefb76-2527-43d4-bc21-0ec253908545 |
| tags | [] |
| updated_at | 2016-12-14T07:33:13Z |
+-------------------+--------------------------------------+
您可以请求池中的特定子网。您需要指定位于池的子网前缀内的子网。如果子网尚未分配,则请求成功。您可以省略 IP 版本,因为它从子网池中推断出来。
$ openstack subnet create --subnet-pool demo-subnetpool4 \
--network demo-network1 --subnet-range 203.0.113.128/26 subnet2
+-------------------+--------------------------------------+
| Field | Value |
+-------------------+--------------------------------------+
| allocation_pools | 203.0.113.130-203.0.113.190 |
| cidr | 203.0.113.128/26 |
| created_at | 2016-12-14T07:27:40Z |
| description | |
| dns_nameservers | |
| enable_dhcp | True |
| gateway_ip | 203.0.113.129 |
| headers | |
| host_routes | |
| id | d32814e3-cf46-4371-80dd-498a80badfba |
| ip_version | 4 |
| ipv6_address_mode | None |
| ipv6_ra_mode | None |
| name | subnet2 |
| network_id | 6b377f77-ce00-4ff6-8676-82343817470d |
| project_id | cfd1889ac7d64ad891d4f20aef9f8d7c |
| revision_number | 2 |
| service_types | |
| subnetpool_id | d3aefb76-2527-43d4-bc21-0ec253908545 |
| tags | [] |
| updated_at | 2016-12-14T07:27:40Z |
+-------------------+--------------------------------------+
如果池耗尽,则加载更多前缀
$ openstack subnet pool set --pool-prefix \
198.51.100.0/24 demo-subnetpool4
$ openstack subnet pool show demo-subnetpool4
+-------------------+--------------------------------------+
| Field | Value |
+-------------------+--------------------------------------+
| address_scope_id | None |
| created_at | 2016-12-14T07:21:26Z |
| default_prefixlen | 26 |
| default_quota | None |
| description | |
| id | d3aefb76-2527-43d4-bc21-0ec253908545 |
| ip_version | 4 |
| is_default | False |
| max_prefixlen | 32 |
| min_prefixlen | 8 |
| name | demo-subnetpool4 |
| prefixes | 198.51.100.0/24, 203.0.113.0/24 |
| project_id | cfd1889ac7d64ad891d4f20aef9f8d7c |
| revision_number | 2 |
| shared | True |
| tags | [] |
| updated_at | 2016-12-14T07:30:32Z |
+-------------------+--------------------------------------+