Service Subnets

Service Subnets 允许操作员为网络上的每个子网定义有效的端口类型,而无需将网络限制为单个子网,或手动创建具有特定子网 ID 的端口。使用此功能,操作员可以确保实例和路由器接口的端口始终使用不同的子网。

操作

为特定网络上的一个或多个子网定义一个或多个服务类型。每个服务类型必须对应于端口模型中的有效设备所有者,才能使用它。

在 IP 分配期间,IPAM 驱动程序将从具有与端口设备所有者匹配的服务类型的子网返回一个地址。如果没有匹配的子网,或者所有匹配的子网都没有可用的 IP 地址,IPAM 驱动程序将尝试使用没有服务类型的子网以保持兼容性。如果网络上的所有子网都有服务类型,IPAM 驱动程序将无法保持兼容性。但是,此功能可以从具有匹配设备所有者的子网进行严格的 IP 分配。如果多个子网包含相同的服务类型,或者存在没有服务类型的子网,IPAM 驱动程序将选择第一个具有匹配服务类型的子网。例如,浮动 IP 代理网关端口使用以下选择过程

  • network:floatingip_agent_gateway

注意

具有设备所有者 network:dhcp 的端口免于上述 IPAM 逻辑,适用于 dhcp_enabled 设置为 True 的子网。这保留了 DHCP 启用子网的现有自动 DHCP 端口创建行为。

使用特定子网创建或更新端口会跳过此选择过程,并显式使用给定的子网。

用法

注意

使用服务类型创建子网需要管理员权限。

示例 1 - 概念验证

以下示例并非实际部署的典型情况。它用于允许用户试验配置 Service Subnets。

  1. 创建一个网络。

    $ openstack network create demo-net1
    +---------------------------+--------------------------------------+
    | Field                     | Value                                |
    +---------------------------+--------------------------------------+
    | admin_state_up            | UP                                   |
    | availability_zone_hints   |                                      |
    | availability_zones        |                                      |
    | description               |                                      |
    | headers                   |                                      |
    | id                        | b5b729d8-31cc-4d2c-8284-72b3291fec02 |
    | ipv4_address_scope        | None                                 |
    | ipv6_address_scope        | None                                 |
    | mtu                       | 1450                                 |
    | name                      | demo-net1                            |
    | port_security_enabled     | True                                 |
    | project_id                | a3db43cd0f224242a847ab84d091217d     |
    | provider:network_type     | vxlan                                |
    | provider:physical_network | None                                 |
    | provider:segmentation_id  | 110                                  |
    | revision_number           | 1                                    |
    | router:external           | Internal                             |
    | shared                    | False                                |
    | status                    | ACTIVE                               |
    | subnets                   |                                      |
    | tags                      | []                                   |
    +---------------------------+--------------------------------------+
    
  2. 在网络上创建一个具有一个或多个服务类型的子网。例如,compute:nova 服务类型允许实例使用此子网。

    $ openstack subnet create demo-subnet1 --subnet-range 192.0.2.0/24 \
      --service-type 'compute:nova' --network demo-net1
    +-------------------+--------------------------------------+
    | Field             | Value                                |
    +-------------------+--------------------------------------+
    | id                | 6e38b23f-0b27-4e3c-8e69-fd23a3df1935 |
    | ip_version        | 4                                    |
    | cidr              | 192.0.2.0/24                         |
    | name              | demo-subnet1                         |
    | network_id        | b5b729d8-31cc-4d2c-8284-72b3291fec02 |
    | revision_number   | 1                                    |
    | service_types     | ['compute:nova']                     |
    | tags              | []                                   |
    | tenant_id         | a8b3054cc1214f18b1186b291525650f     |
    +-------------------+--------------------------------------+
    
  3. 可选地,在网络上创建另一个具有不同服务类型的子网。例如,任意的 compute:foo 服务类型。

    $ openstack subnet create demo-subnet2 --subnet-range 198.51.100.0/24 \
      --service-type 'compute:foo' --network demo-net1
    +-------------------+--------------------------------------+
    | Field             | Value                                |
    +-------------------+--------------------------------------+
    | id                | ea139dcd-17a3-4f0a-8cca-dff8b4e03f8a |
    | ip_version        | 4                                    |
    | cidr              | 198.51.100.0/24                      |
    | name              | demo-subnet2                         |
    | network_id        | b5b729d8-31cc-4d2c-8284-72b3291fec02 |
    | revision_number   | 1                                    |
    | service_types     | ['compute:foo']                      |
    | tags              | []                                   |
    | tenant_id         | a8b3054cc1214f18b1186b291525650f     |
    +-------------------+--------------------------------------+
    
  4. 使用网络启动一个实例。例如,使用 cirros 镜像和 m1.tiny flavor。

    $ openstack server create demo-instance1 --flavor m1.tiny \
      --image cirros --nic net-id=b5b729d8-31cc-4d2c-8284-72b3291fec02
    +--------------------------------------+-----------------------------------------------+
    | Field                                | Value                                         |
    +--------------------------------------+-----------------------------------------------+
    | OS-DCF:diskConfig                    | MANUAL                                        |
    | OS-EXT-AZ:availability_zone          |                                               |
    | OS-EXT-SRV-ATTR:host                 | None                                          |
    | OS-EXT-SRV-ATTR:hypervisor_hostname  | None                                          |
    | OS-EXT-SRV-ATTR:instance_name        | instance-00000009                             |
    | OS-EXT-STS:power_state               | 0                                             |
    | OS-EXT-STS:task_state                | scheduling                                    |
    | OS-EXT-STS:vm_state                  | building                                      |
    | OS-SRV-USG:launched_at               | None                                          |
    | OS-SRV-USG:terminated_at             | None                                          |
    | accessIPv4                           |                                               |
    | accessIPv6                           |                                               |
    | addresses                            |                                               |
    | adminPass                            | Fn85skabdxBL                                  |
    | config_drive                         |                                               |
    | created                              | 2016-09-19T15:07:42Z                          |
    | flavor                               | m1.tiny (1)                                   |
    | hostId                               |                                               |
    | id                                   | 04222b73-1a6e-4c2a-9af4-ef3d17d521ff          |
    | image                                | cirros (4aaec87d-c655-4856-8618-b2dada3a2b11) |
    | key_name                             | None                                          |
    | name                                 | demo-instance1                                |
    | os-extended-volumes:volumes_attached | []                                            |
    | progress                             | 0                                             |
    | project_id                           | d44c19e056674381b86430575184b167              |
    | properties                           |                                               |
    | security_groups                      | [{u'name': u'default'}]                       |
    | status                               | BUILD                                         |
    | updated                              | 2016-09-19T15:07:42Z                          |
    | user_id                              | 331afbeb322d4c559a181e19051ae362              |
    +--------------------------------------+-----------------------------------------------+
    
  5. 检查实例状态。 Networks 字段包含来自具有 compute:nova 服务类型的子网的 IP 地址。

    $ openstack server list
    +--------------------------------------+-----------------+---------+---------------------+--------+---------+
    | ID                                   | Name            | Status  | Networks            | Image  | Flavor  |
    +--------------------------------------+-----------------+---------+---------------------+--------+---------+
    | 20181f46-5cd2-4af8-9af0-f4cf5c983008 | demo-instance1  | ACTIVE  | demo-net1=192.0.2.3 | cirros | m1.tiny |
    +--------------------------------------+-----------------+---------+---------------------+--------+---------+
    

示例 2 - DVR 配置

以下示例概述了如何在启用了 DVR 的部署中配置 Service Subnets,目标是最大限度地减少公共 IP 地址的消耗。此示例在同一外部网络上使用三个子网

  • 192.0.2.0/24 用于实例浮动 IP 地址

  • 198.51.100.0/24 用于配置在计算节点上的浮动 IP 代理网关 IP

  • 203.0.113.0/25 用于外部网络上的所有其他 IP 分配

此示例再次使用私有网络,demo-net1 (b5b729d8-31cc-4d2c-8284-72b3291fec02),该网络是在 示例 1 - 概念验证 中创建的。

  1. 创建外部网络

    $ openstack network create --external demo-ext-net
    
  2. 在外部网络上创建一个用于实例浮动 IP 地址的子网。这将使用 network:floatingip 服务类型。

    $ openstack subnet create demo-floating-ip-subnet \
      --subnet-range 192.0.2.0/24 --no-dhcp \
      --service-type 'network:floatingip' --network demo-ext-net
    
  3. 在外部网络上创建一个用于浮动 IP 代理网关 IP 地址的子网,这些地址由 DVR 在计算节点上配置。这将使用 network:floatingip_agent_gateway 服务类型。

    $ openstack subnet create demo-floating-ip-agent-gateway-subnet \
      --subnet-range 198.51.100.0/24 --no-dhcp \
      --service-type 'network:floatingip_agent_gateway' \
      --network demo-ext-net
    
  4. 在外部网络上创建一个用于外部网络上分配的所有其他 IP 地址的子网。它将不使用任何服务类型。它充当不匹配上述两个子网的分配的后备。

    $ openstack subnet create demo-other-subnet \
      --subnet-range 203.0.113.0/25 --no-dhcp \
      --network demo-ext-net
    
  5. 创建路由器

    $ openstack router create demo-router
    
  6. 将接口添加到路由器上的 demo-subnet1

    $ openstack router add subnet demo-router demo-subnet1
    
  7. 设置路由器的外部网关,这将创建一个接口并在 demo-ext-net 上分配一个 IP 地址

    $ openstack router set --external-gateway demo-ext-net demo-router
    
  8. 在私有网络上启动一个实例,并检索分配的 neutron 端口 ID。如上所述,使用 cirros 镜像和 m1.tiny flavor

    $ openstack server create demo-instance1 --flavor m1.tiny \
      --image cirros --nic net-id=b5b729d8-31cc-4d2c-8284-72b3291fec02
    $ openstack port list --server demo-instance1
    +--------------------------------------+------+-------------------+--------------------------------------------------+--------+
    | ID                                   | Name | MAC Address       | Fixed IP Addresses                               | Status |
    +--------------------------------------+------+-------------------+--------------------------------------------------+--------+
    | a752bb24-9bf2-4d37-b9d6-07da69c86f19 |      | fa:16:3e:99:54:32 | ip_address='203.0.113.130',                      | ACTIVE |
    |                                      |      |                   | subnet_id='6e38b23f-0b27-4e3c-8e69-fd23a3df1935' |        |
    +--------------------------------------+------+-------------------+--------------------------------------------------+--------+
    
  9. 将浮动 IP 与实例端口关联,并验证它是否从正确的子网分配了 IP 地址

    $ openstack floating ip create --port \
      a752bb24-9bf2-4d37-b9d6-07da69c86f19 demo-ext-net
    +---------------------+--------------------------------------+
    | Field               | Value                                |
    +---------------------+--------------------------------------+
    | fixed_ip_address    | 203.0.113.130                        |
    | floating_ip_address | 192.0.2.12                           |
    | floating_network_id | 02d236d5-dad9-4082-bb6b-5245f9f84d13 |
    | id                  | f15cae7f-5e05-4b19-bd25-4bb71edcf3de |
    | port_id             | a752bb24-9bf2-4d37-b9d6-07da69c86f19 |
    | project_id          | d44c19e056674381b86430575184b167     |
    | revision_number     | 1                                    |
    | router_id           | 5a8ca19f-3703-4f81-bc29-db6bc2f528d6 |
    | status              | ACTIVE                               |
    | tags                | []                                   |
    +---------------------+--------------------------------------+
    
  10. 作为 admin 用户,验证 neutron 路由器是否从其正确的子网分配了 IP 地址。使用 openstack port list 查找与路由器关联的端口。

    首先,路由器网关外部端口

    $ openstack port show f148ffeb-3c26-4067-bc5f-5c3dfddae2f5
    +-----------------------+--------------------------------------------------------------------------+
    | Field                 | Value                                                                    |
    +-----------------------+--------------------------------------------------------------------------+
    | admin_state_up        | UP                                                                       |
    | device_id             | 5a8ca19f-3703-4f81-bc29-db6bc2f528d6                                     |
    | device_owner          | network:router_gateway                                                   |
    | extra_dhcp_opts       |                                                                          |
    | fixed_ips             | ip_address='203.0.113.11',                                               |
    |                       | subnet_id='67c251d9-2b7a-4200-99f6-e13785b0334d'                         |
    | id                    | f148ffeb-3c26-4067-bc5f-5c3dfddae2f5                                     |
    | mac_address           | fa:16:3e:2c:0f:69                                                        |
    | network_id            | 02d236d5-dad9-4082-bb6b-5245f9f84d13                                     |
    | revision_number       | 1                                                                        |
    | project_id            |                                                                          |
    | status                | ACTIVE                                                                   |
    | tags                  | []                                                                       |
    +-----------------------+--------------------------------------------------------------------------+
    

    其次,路由器浮动 IP 代理网关外部端口

    $ openstack port show a2d1e756-8ae1-4f96-9aa1-e7ea16a6a68a
    +-----------------------+--------------------------------------------------------------------------+
    | Field                 | Value                                                                    |
    +-----------------------+--------------------------------------------------------------------------+
    | admin_state_up        | UP                                                                       |
    | device_id             | 3d0c98eb-bca3-45cc-8aa4-90ae3deb0844                                     |
    | device_owner          | network:floatingip_agent_gateway                                         |
    | extra_dhcp_opts       |                                                                          |
    | fixed_ips             | ip_address='198.51.100.10',                                              |
    |                       | subnet_id='67c251d9-2b7a-4200-99f6-e13785b0334d'                         |
    | id                    | a2d1e756-8ae1-4f96-9aa1-e7ea16a6a68a                                     |
    | mac_address           | fa:16:3e:f4:5d:fa                                                        |
    | network_id            | 02d236d5-dad9-4082-bb6b-5245f9f84d13                                     |
    | project_id            |                                                                          |
    | revision_number       | 1                                                                        |
    | status                | ACTIVE                                                                   |
    | tags                  | []                                                                       |
    +-----------------------+--------------------------------------------------------------------------+