网络预留

https://blueprints.launchpad.net/blazar/+spec/basic-network-plugin

此插件支持预留网络段。

问题描述

在支持 VLAN 标记的交换机上的 OpenStack 部署中,Neutron 服务可以通过将 VLAN 标签与 Neutron 网络关联,以先到先服务的原则创建隔离的网络段。可用的 VLAN 标签限制在 12 位字段内,以符合 802.1Q 标准,并且在许多情况下,只有 4,096 个可能 VLAN 标签中的一小部分才能供用户使用。同样,如果云提供商提供外部 Layer-2 连接(桥接),用户只能使用有限数量的可用网络段来使用这些连接。

用例

  • 用户需要更多的网络隔离,用于研究或额外的安全性。

  • 用户希望使用外部 Layer 2 连接,并需要一个专用于提供商端点的 VLAN 标签。

  • 用户计划创建一个隔离的 VLAN,并希望确保在预留开始时可用 VLAN 标签。

  • 云管理员没有足够的 VLAN 标签提供给所有用户。

    • 管理员希望为用户提供一个隔离的 VLAN,并进行主机或实例预留。

提议的变更

Blazar 允许用户通过指定用户想要预留的物理网络类型来预留网络 VLAN 标签(以及,通过扩展,其他分段类型)。用户可以像往常一样处理预留的网络,除了创建网络操作之外。

网络预留的基本思路及其场景如下

  1. 管理员使用 Blazar 注册一些用于网络预留的 VLAN 标签。管理员使用包含物理网络名称、网络类型和段 ID 的请求体调用 Blazar 的网络 API。

  2. 用户调用创建租赁 API,指定网络预留以及租赁的开始和结束日期。可选参数包括段 ID、网络名称和网络类型。Blazar 检查请求的网络段的可用性。如果可用,Blazar 在网络段和预留之间创建一个分配,然后返回预留 ID。如果不可用,Blazar 不返回预留 ID。

  3. 在开始时间,Blazar 在用户的租户(项目)中创建预留的网络。然后,用户可以像往常一样创建、配置或将子网和路由器关联到网络。

  4. 在结束时间,Blazar 删除网络以及任何其他关联的网络组件,例如子网、路由器、端口等,除非用户已经删除了它们或取消了关联。

备选方案

数据模型影响

该插件引入了四个新表:“network_reservations”、“networksegment_extra_capabilities”、“network_allocations”、“network_segments”。

“network_reservations” 表保存用户对其网络预留的请求信息。此表的作用类似于主机预留插件中 computehost_reservations 表的作用。此表包含 id、resource_properties、network_properties、network_name、network_description 和 network_id 列。

“networksegment_extra_capabilities” 可以包含云提供商想要提供的特定网络段的附加信息。

“network_allocations” 表具有 “network_reservations” 表和 “network_segments” 表之间的关系。

“network_segments” 表存储关于网络段本身的信息。可预留的网络段注册在此表中。

表定义如下

CREATE TABLE `network_reservations` (
    `created_at` datetime DEFAULT NULL,
    `updated_at` datetime DEFAULT NULL,
    `deleted_at` datetime DEFAULT NULL,
    `deleted` varchar(36) DEFAULT NULL,
    `id` varchar(36) NOT NULL,
    `reservation_id` varchar(36) DEFAULT NULL,
    `resource_properties` mediumtext,
    `network_properties` mediumtext,
    `before_end` varchar(36) DEFAULT NULL,
    `network_name` varchar(255) DEFAULT NULL,
    `network_description` varchar(255) DEFAULT NULL,
    `network_id` varchar(255) DEFAULT NULL,
    PRIMARY KEY (`id`),
    KEY `reservation_id` (`reservation_id`),
    CONSTRAINT `network_reservations_ibfk_1`
    FOREIGN KEY (`reservation_id`) REFERENCES `reservations` (`id`)
);

CREATE TABLE `network_segments` (
    `created_at` datetime DEFAULT NULL,
    `updated_at` datetime DEFAULT NULL,
    `id` varchar(36) NOT NULL,
    `network_type` varchar(255) NOT NULL,
    `physical_network` varchar(255) DEFAULT NULL,
    `segmentation_id` int(11),
    `reservable` boolean NOT NULL,
    PRIMARY KEY (`id`),
    UNIQUE KEY `network_type`
    (`network_type`,`physical_network`,`segmentation_id`)
);

CREATE TABLE `networksegment_extra_capabilities` (
    `created_at` datetime DEFAULT NULL,
    `updated_at` datetime DEFAULT NULL,
    `id` varchar(36) NOT NULL,
    `network_id` varchar(36) NOT NULL,
    `capability_name` varchar(64) NOT NULL,
    `capability_value` mediumtext NOT NULL,
    PRIMARY KEY (`id`),
    KEY `network_id` (`network_id`),
    CONSTRAINT `networksegment_extra_capabilities_ibfk_1`
    FOREIGN KEY (`network_id`) REFERENCES `network_segments` (`id`)
);


CREATE TABLE `network_allocations` (
    `created_at` datetime DEFAULT NULL,
    `updated_at` datetime DEFAULT NULL,
    `deleted_at` datetime DEFAULT NULL,
    `deleted` varchar(36) DEFAULT NULL,
    `id` varchar(36) NOT NULL,
    `network_id` varchar(36) DEFAULT NULL,
    `reservation_id` varchar(36) DEFAULT NULL,
    PRIMARY KEY (`id`),
    KEY `network_id` (`network_id`),
    KEY `reservation_id` (`reservation_id`),
    CONSTRAINT `network_allocations_ibfk_1`
    FOREIGN KEY (`network_id`) REFERENCES `network_segments` (`id`),
    CONSTRAINT `network_allocations_ibfk_2`
    FOREIGN KEY (`reservation_id`) REFERENCES `reservations` (`id`)
);

REST API 影响

网络段预留为租赁 API 引入了一种新的 resource_type,并引入了五个新的管理 API 来管理段。

租赁 API 中的更改

  • URL: POST /v1/leases

    • 为预留引入了新的 resource_type,network。

请求示例

{
  "name": "network-reservation-1",
  "reservations": [
    {
      "resource_type": "network",
      "network_name": "my-network-1",
      "physical_network": "physnet-name", # optional
      "segmentation_id": 1234,            # optional
      "network_type": "vlan"              # optional
    }
  ],
  "start_date": "2019-05-17 09:07",
  "end_date": "2019-05-17 09:10",
  "events": []
}

响应示例

{
  "lease": {
    "name": "network-reservation-1"
    "reservations": [
      {
        "id": "reservation-id",
        "status": "pending",
        "lease_id": "lease-id-1",
        "resource_id": "resource_id",
        "resource_type": "network",
        "created_at": "2019-05-17 10:00:00",
        "updated_at": "2017-05-01 11:00:00",
      }],
    "start_date": "2019-05-17 09:07",
    "end_date": "2019-05-17 09:10",
    ..snip..
  }
}
  • URL: GET /v1/leases

  • URL: GET /v1/leases/{lease-id}

  • URL: PUT /v1/leases/{lease-id}

  • URL: DELETE /v1/leases/{lease-id}

  • 更改与 POST /v1/leases 相同

新的网络 API

这五个新 API 默认是管理 API。

  • URL: POST /v1/networks

    • segmentation_id 是管理员想要添加的特定 VLAN 标签。该标签必须超出 Neutron 中的分配池。目前,只有使用 VLAN 标记的网络才需要根据 IEEE 802.1Q 标准使用段 ID。可预留的扁平网络将此字段留空。

    • network_type 是与网络段关联的物理机制的类型。示例包括 flat、geneve、gre、local、vlan、vxlan。

    • physical_network 是网络段可用的物理网络的名称。这对于 VLAN 来说是必需的。

请求示例

{
  "network_type": "vlan",
  "physical_network": "physical-network-1",
  "segmentation_id": 1234
}
  • reservable 键是一个标志,描述网络段是否可预留。该标志始终为 True,直到网络插件支持资源修复功能。(对网络段支持资源修复在本规范的范围之外)

响应示例

{
  "network": {
      "id": "network-id",
      "network_type": "vlan",
      "physical_network": "physical-network-1",
      "segmentation_id": 1234,
      "reservable": true,
      "created_at": "2020-01-01 10:00:00",
      "updated_at": null
  }
}
  • URL: GET /v1/networks

响应示例

{
  "networks": [
      {
          "id": "network-id",
          "network_type": "vlan",
          "physical_network": "physical-network-1",
          "segmentation_id": 1234,
          "reservable": true,
          "created_at": "2020-01-01 10:00:00",
          "updated_at": null
      }
  ]
}
  • URL: GET /v1/networks/{network-id}

响应示例

{
  "network": {
      "id": "network-id",
      "network_type": "vlan",
      "physical_network": "physical-network-1",
      "segmentation_id": "1234",
      "reservable": true,
      "created_at": "2020-01-01 10:00:00",
      "updated_at": null
  }
}
  • URL: DELETE /v1/networks/{network-id}

无请求体或响应体。

  • URL: PUT /v1/networks/{network-id}

    请求示例

{
  "extra_capability_sample": "bar"
}

Response Example:

{
  "network": {
      "id": "network-id",
      "network_type": "vlan",
      "physical_network": "physical-network-1",
      "segmentation_id": "1234",
      "reservable": true,
      "created_at": "2020-01-01 10:00:00",
      "updated_at": null,
      "extra_capability_sample": "bar"
  }
}

安全影响

通知影响

其他最终用户影响

用户可以在同一租赁中预留网络段以及主机、实例或浮动 IP。

python-blazarclient 将支持网络段预留。

性能影响

其他部署者影响

开发者影响

升级影响

一些配置选项将引入到 blazar.conf 的 Neutron util 类中。如果云管理员想要激活网络预留,他们需要设置配置。

实现

负责人

主要负责人

priteau

其他贡献者

diurnalist jakecoll

工作项

  • 创建新的 DB 表

  • 创建网络预留插件

  • 在 blazar.api.v1 中创建网络 API 对象及其路由

  • 在 python-blazarclient 中添加网络预留支持

  • 在 blazar-tempest-plugin 中添加场景测试和 API 测试

  • 更新 Blazar 文档、API 参考和用户指南

依赖项

测试

需要实现 API 测试和场景测试。

文档影响

此 BP 为租赁 API 添加了新的 API 和资源类型。需要更新 API 参考和 Blazar 文档。

参考资料

  1. https://etherpad.openstack.org/p/network-resource-reservation

  2. https://etherpad.openstack.org/p/blazar-ptg-stein

历史记录

修订版

发布名称

描述

Train

引入

Ussuri

重新提出