网络拓扑自动分配

Mitaka 版本中引入的自动分配功能简化了为最终用户设置外部连接的过程,也被称为 为我创建一个网络

此前,用户必须配置一系列网络资源才能启动服务器并访问互联网。例如,需要执行以下步骤:

  • 创建网络

  • 创建一个子网

  • 创建路由器

  • 将路由器连接到外部网络

  • 将路由器连接到之前创建的子网

这些步骤需要在虚拟机需要连接的每个逻辑段上执行,并且可能需要用户不具备的网络知识。

此功能旨在自动化项目的基础网络配置。配置基本网络的步骤在实例启动期间运行,从而实现免手动设置的网络配置。

为此,提供一个默认的外部网络和默认的子网池(IPv4 的一个,或 IPv6 的一个,或两者都有),以便网络服务可以在没有输入的情况下选择要执行的操作。一旦这些设置就绪,用户就可以在不指定任何网络细节的情况下启动他们的虚拟机。计算服务将自动使用此功能为用户虚拟机接线。

启用自动分配的部署

要使用此功能,neutron 服务必须启用以下扩展:

  • auto-allocated-topology

  • subnet_allocation

  • external-net

  • router

在最终用户可以使用自动分配功能之前,操作员必须创建将用于自动分配网络拓扑创建的资源。要执行此任务,请按照以下步骤操作:

  1. 设置默认外部网络

    假设要用于自动分配功能的外部网络名为 public,请使用以下命令将其设为 default 外部网络:

    $ openstack network set public --default
    

    注意

    标志 --default(以及 --no-default 标志)仅对外部网络有效,对常规(或内部)网络没有影响。

  2. 创建默认子网池

    自动分配功能至少需要一个默认子网池。IPv4 的一个,或 IPv6 的一个,或两者都有。

    $ openstack subnet pool create --share --default \
      --pool-prefix 192.0.2.0/24 --default-prefix-length 26 \
      shared-default
    
      +-------------------+--------------------------------------+
      | Field             | Value                                |
      +-------------------+--------------------------------------+
      | address_scope_id  | None                                 |
      | created_at        | 2017-01-12T15:10:34Z                 |
      | default_prefixlen | 26                                   |
      | default_quota     | None                                 |
      | description       |                                      |
      | headers           |                                      |
      | id                | b41b7b9c-de57-4c19-b1c5-731985bceb7f |
      | ip_version        | 4                                    |
      | is_default        | True                                 |
      | max_prefixlen     | 32                                   |
      | min_prefixlen     | 8                                    |
      | name              | shared-default                       |
      | prefixes          | 192.0.2.0/24                         |
      | project_id        | 86acdbd1d72745fd8e8320edd7543400     |
      | revision_number   | 1                                    |
      | shared            | True                                 |
      | tags              | []                                   |
      | updated_at        | 2017-01-12T15:10:34Z                 |
      +-------------------+--------------------------------------+
    
    $ openstack subnet pool create --share --default \
      --pool-prefix 2001:db8:8000::/48 --default-prefix-length 64 \
      default-v6
    
    +-------------------+--------------------------------------+
    | Field             | Value                                |
    +-------------------+--------------------------------------+
    | address_scope_id  | None                                 |
    | created_at        | 2017-01-12T15:14:35Z                 |
    | default_prefixlen | 64                                   |
    | default_quota     | None                                 |
    | description       |                                      |
    | headers           |                                      |
    | id                | 6f387016-17f0-4564-96ad-e34775b6ea14 |
    | ip_version        | 6                                    |
    | is_default        | True                                 |
    | max_prefixlen     | 128                                  |
    | min_prefixlen     | 64                                   |
    | name              | default-v6                           |
    | prefixes          | 2001:db8:8000::/48                   |
    | project_id        | 86acdbd1d72745fd8e8320edd7543400     |
    | revision_number   | 1                                    |
    | shared            | True                                 |
    | tags              | []                                   |
    | updated_at        | 2017-01-12T15:14:35Z                 |
    +-------------------+--------------------------------------+
    

为我创建一个网络

在操作员已按照上述说明设置资源的部署中,他们可以按如下方式获取或创建其自动分配的网络拓扑:

$ openstack network auto allocated topology create --or-show
+------------+--------------------------------------+
| Field      | Value                                |
+------------+--------------------------------------+
| id         | a380c780-d6cd-4510-a4c0-1a6ec9b85a29 |
| project_id | cfd1889ac7d64ad891d4f20aef9f8d7c     |
+------------+--------------------------------------+

注意

当使用 --or-show 选项时,该命令如果拓扑已经存在则返回拓扑信息,如果不存在则创建它。

操作员(以及具有管理员角色的用户)可以通过指定项目 ID 来获取或创建项目的自动分配拓扑:

$ openstack network auto allocated topology create --project \
  cfd1889ac7d64ad891d4f20aef9f8d7c --or-show
+------------+--------------------------------------+
| Field      | Value                                |
+------------+--------------------------------------+
| id         | a380c780-d6cd-4510-a4c0-1a6ec9b85a29 |
| project_id | cfd1889ac7d64ad891d4f20aef9f8d7c     |
+------------+--------------------------------------+

此命令返回的 ID 是一个网络,可用于启动虚拟机。

$ openstack server create --flavor m1.small --image \
  cirros-0.3.5-x86_64-uec --nic \
  net-id=8b835bfb-cae2-4acc-b53f-c16bb5f9a7d0 vm1

用户的自动分配拓扑永远不会更改。实际上,当用户启动服务器而不省略 --nic 选项,并且有多个网络可用时,计算服务将调用 auto allocated topology create 背后的 API,获取网络 UUID,并在启动过程中传递它。

或者,可以按如下方式删除其自动分配的网络拓扑:

$ openstack network auto allocated topology delete

验证自动分配的要求

要验证所需的资源是否已正确设置为自动分配,而无需实际配置任何内容,请使用 --check-resources 选项:

$ openstack network auto allocated topology create --check-resources
Deployment error: No default router:external network.

$ openstack network set public --default

$ openstack network auto allocated topology create --check-resources
Deployment error: No default subnetpools defined.

$ openstack subnet pool set shared-default --default

$ openstack network auto allocated topology create --check-resources
+---------+-------+
| Field   | Value |
+---------+-------+
| dry-run | pass  |
+---------+-------+

验证选项对所有用户表现相同。但是,它被认为主要是管理员或服务实用程序,因为操作员必须设置要求。

自动分配创建的项目资源

自动分配功能在每个使用它的项目中创建一个网络拓扑。项目的自动分配网络拓扑包含以下资源:

资源

名称

network

auto_allocated_network

子网 (IPv4)

auto_allocated_subnet_v4

子网 (IPv6)

auto_allocated_subnet_v6

router

auto_allocated_router

兼容性说明

Nova 使用 API 微版本 2.37 或更高版本的 auto allocated topology 功能。这是因为,与 Mitaka 版本中实现的 neutron 功能不同,nova 的集成是在 Newton 版本周期中完成的。请注意,只要项目没有超过一个可用网络,就可以省略 CLI 选项 --nic,否则 nova 将以 400 错误失败,因为它不知道使用哪个网络。此外,nova 不会开始使用该功能,无论用户是否请求微版本 2.37 或更高版本,除非所有 nova-compute 服务都在运行 Newton 级别的代码。