子网池

子网池功能自 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 来处理,那该多好?当您需要创建子网时,只需请求从池中分配地址。您不必担心已经使用过的内容以及池中的地址。子网池可以做到这一点。

其次,子网池可以管理跨项目的地址。保证地址不会重叠。如果地址来自外部可路由的池,那么您就知道所有项目都具有可路由且唯一的地址。这在以下场景中很有用。

  1. IPv6,因为 OpenStack Networking 没有 IPv6 浮动 IP。

  2. 直接从外部网络路由到项目网络。

它们的工作原理

子网池管理一个地址池,子网可以从中分配。它确保从同一池分配的任何两个子网之间没有重叠。

作为 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                 |
+-------------------+--------------------------------------+