浮动IP预留

https://blueprints.launchpad.net/blazar/+spec/floatingip-reservation

此网络插件支持浮动IP预留。

问题描述

Neutron服务以先到先服务的原则创建和关联浮动IP到项目。 这种顺序有时会导致云中缺乏浮动IP,尤其是在私有云中,因为云提供商可用的浮动IP数量有限。

用例

  • 用户计划在特定时间窗口内扩展服务,并且该服务需要一个新的浮动IP才能进行全局访问。

  • 用户计划启动一项新服务,并希望确保在启动时可用一个浮动IP。

  • 云管理员没有足够的浮动IP可以提供给所有用户

    • 管理员希望向用户提供一个浮动IP,并进行主机或实例预留。

提议的变更

Blazar允许用户通过指定要预留的浮动IP的外部网络ID来预留浮动IP。 用户可以像往常一样处理预留的浮动IP,除了创建浮动IP操作之外。

浮动IP预留的基本思路及其场景如下

  1. 管理员使用Blazar注册一些用于浮动IP预留的浮动IP。 管理员使用包含公共网络ID及其浮动IP地址的请求体调用Blazar的浮动IP API。 浮动IP地址必须超出外部网络子网中的allocation_pools。

  2. 用户使用外部网络ID、开始日期和结束日期调用创建租赁API。 Blazar检查请求的浮动IP可用性。 如果可用,Blazar在浮动IP和预留之间创建关联,然后返回预留ID。 如果不可用,Blazar不会返回预留ID。

  3. 在开始时间,Blazar在用户的租户(项目)中创建预留的浮动IP。 然后用户可以像往常一样附加、分离和删除浮动IP。

  4. 在结束时间,如果用户尚未删除浮动IP,Blazar会从用户的租户中删除预留的浮动IP。

Blazar将Neutron的allocation_pools参数之外的IP地址视为可预留资源。 allocation_pools只是一个IP地址范围,Neutron会自动从中创建浮动IP。 当管理员使用超出该范围的特定IP地址创建浮动IP时,Neutron接受该请求,并且新的浮动IP具有请求的IP地址。 这使得Blazar能够自行管理预留浮动IP的创建。

Blazar为预留的浮动IP添加两个标签,“blazar”和“reservation:<reservation-id>”,以便用户可以轻松查询其预留的浮动IP。

为了实现该场景,此蓝图引入了一个新的资源插件,名为Blazar的“virtual:floatingip”。

备选方案

专用外部网络方法

Blazar将预留的浮动IP映射到专用的外部网络。 外部网络通过neutron的policy.json对普通用户隐藏。 Blazar在租赁开始时为预留用户创建外部网络,并在租赁结束时代表用户删除网络。

此方法的优点是预留资源与用户的非预留资源分离。 Blazar在开始日期和结束日期处理预留资源变得容易。

缺点是此方法需要与预留网络数量相同数量的物理网络/配置。 例如,如果云管理员将其外部网络配置为type_driver是flat,mechanical_driver是ovs,Neutron需要与预留外部网络数量一样多的OVS桥接器。

关联端口方法

在浮动IP预留有效期间,Blazar将预留的浮动IP附加到特定的端口。 当可预留的浮动IP未被使用时,IP属于Blazar的服务租户。 它防止用户使用可预留的IP创建浮动IP。

优点是Blazar可以处理浮动IP的创建和删除,并且可预留的浮动IP属于allocation_pools参数的范围。

缺点是用户需要使用新的工作流程来管理预留的浮动IP。 在没有Blazar的情况下,用户可以将浮动IP关联到/从端口解关联。 但是Blazar在本方法中代替用户执行此操作。 这要求用户拥有两个管理浮动IP的工作流程。

数据模型影响

此插件引入了四个新的表,“floatingip_reservations”、“required_floatingips”、“floatingip_allocations”和“floatingips”。

“floatingip_reservations”表保存用户对其浮动IP预留的请求信息。 此表的作用类似于主机预留插件中的computehost_reservations表。 此表具有id、network_id和amount列。 该表与用户请求的浮动IP集合具有关系。

“required_floatingips”表表示用户为预留请求的浮动IP。

“floatingip_allocations”表具有“floatingip_reservations”表和“floatingips”表之间的关系。

“floatingips”表存储浮动IP本身的信息。 可预留的浮动IP在表中注册。 floating_ip_address列具有唯一约束,因为id列由Blazar生成。 Neutron在创建浮动IP期间生成浮动IP的id。

表定义如下

CREATE TABLE floatingip_reservations (
    id VARCHAR(36) NOT NULL,
    reservation_id VARCHAR(255) NOT NULL,
    network_id VARCHAR(255) NOT NULL,
    amount INT UNSIGNED NOT NULL,

    PRIMARY key (id),
    INDEX (id, reservation_id)
    FOREIGN KEY (reservation_id)
      REFERENCES reservations(id)
      ON DELETE CASCADE,
);

CREATE TABLE required_floatingips (
    id VARCHAR(36) NOT NULL,
    floatingip_reservation_id VARCHAR(36) NOT NULL,
    address VARCHAR(255) NOT NULL,

    PRIMARY key (id),
    FOREIGN KEY (floatingip_reservation_id)
      REFERENCES floatingip_reservations(id)
      ON DELETE CASCADE,
);

CREATE TABLE floatingip_allocations (
    id VARCHAR(36) NOT NULL,
    reservation_id VARCHAR(255) NOT NULL,
    floatingip_id VARCHAR(255) NOT NULL,
);

CREATE TABLE floatingips (
    id VARCHAR(36) NOT NULL,
    floating_network_id VARCHAR(255) NOT NULL,
    subnet_id VARCHAR(255) NOT NULL,
    floating_ip_address VARCHAR(255) NOT NULL,
    reservable BOOLEAN NOT NULL,

    UNIQUE (subnet_id, floating_ip_address)
);

REST API 影响

浮动IP预留为租赁API引入了一种新的resource_type,并引入了四个新的管理浮动IP的管理员API。

租赁API中的更改

  • URL: POST /v1/leases

    • 为预留引入了新的resource_type,virtual:floatingip。

    • network_id是用户想要预留浮动IP的外部网络ID。

    • required_floatingips是一个可选键。 该键表示必须包含在预留中的浮动IP列表。 在请求示例中,用户想要3个浮动IP,并想要指定3个浮动IP中的2个,而不关心3个浮动IP中的1个。

请求示例

{
  "name": "floatingip-reservation-1",
  "reservations": [
    {
      "resource_type": "virtual:floatingip",
      "network_id": "external-network-id",
      "required_floatingips": [
        "172.24.4.10",
        "172.24.4.11"
      ],
      "amount": 3
    }
   ],
  "start_date": "2017-05-17 09:07",
  "end_date": "2017-05-17 09:10",
  "events": []
}

响应示例

{
  "lease": {
    "name": "floatingip-reservation-1",
    "reservations": [
      {
        "id": "reservation-id",
        "status": "pending",
        "lease_id": "lease-id-1",
        "resource_id": "resource_id",
        "resource_type": "virtual:floatingip",
        "network_id": "external-network-id",
        "required_floatingips": [
          "172.24.4.10",
          "172.24.4.11"
        ],
        "allocated_floatingips": [
          "172.24.4.10",
          "172.24.4.11",
          "172.24.4.100"
        ],
        "amount": 3,
        "created_at": "2017-05-01 10:00:00",
        "updated_at": "2017-05-01 11:00:00",
      }],
    "start_date": "2017-05-17 09:07",
    "end_date": "2017-05-17 09:07",
    ..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 相同

新的浮动IP API

这四个新的API默认是管理员API。

  • URL: POST /v1/floatingips

    • floating_network_id是管理员作为Blazar资源添加的外部网络ID。

    • floating_ip_address是管理员想要添加的特定浮动IP地址。 IP地址必须超出allocation_pools。 当管理员调用API时,Blazar从Neutron获取子网信息,并验证浮动IP是否超出allocation_pools并位于其CIDR网络内。

    • floating_ip_address不能是可选参数,因为allocation_pool之外的IP通常由网络设备、路由器、负载均衡器等使用。

请求示例

{
  "floating_network_id": "external-network-id",
  "floating_ip_address": "floating_ip_address"
}
  • reservable键是一个标志,描述浮动IP是否可预留。 该标志始终为True,直到浮动IP插件支持资源修复功能。(在本规范中,对浮动IP支持资源修复功能不在范围内)

响应示例

{
  "floatingip": {
      "id": "floating-ip-id",
      "floating_network_id": "external-network-id",
      "floating_ip_address": "floating_ip_address",
      "subnet_id": "subnet-id",
      "reservable": true,
      "created_at": "2020-01-01 10:00:00",
      "updated_at": null
  }
}
  • URL: GET /v1/floatingips

响应示例

{
  "floatingips": [
      {
        "id": "floating-ip-id",
        "floating_network_id": "external-network-id",
        "floating_ip_address": "floating_ip_address",
        "subnet_id": "subnet-id",
        "reservable": true,
        "created_at": "2020-01-01 10:00:00",
        "updated_at": null
      }
  ]
}
  • URL: GET /v1/floatingips/{floatingip-id}

响应示例

{
  "floatingip": {
      "id": "floating-ip-id",
      "floating_network_id": "external-network-id",
      "floating_ip_address": "floating_ip_address",
      "subnet_id": "subnet-id",
      "reservable": true,
      "created_at": "2020-01-01 10:00:00",
      "updated_at": null
  }
}
  • URL: DELETE /v1/floatingips/{floatingip-id}

无请求体和响应体。

浮动IP API没有更新API,因为所有信息都从Neutron API获取。

安全影响

通知影响

其他最终用户影响

用户可以在一个租赁中预留浮动IP以及主机或实例预留。

python-blazarclient将支持浮动IP预留。

性能影响

其他部署者影响

开发者影响

这是网络资源的首个实现。

升级影响

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

实现

负责人

主要负责人

muroi-masahito

其他贡献者

工作项

  • 创建Neutron API实用类

  • 创建新的DB表

  • 创建浮动IP预留插件

  • 在blazar.api.v1中创建浮动IP API对象及其路由

  • 在python-blazarclient中添加浮动IP预留支持

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

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

依赖项

测试

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

文档影响

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

参考资料

  1. 浮动IP预留草案:https://etherpad.openstack.org/p/network-resource-reservation

  2. 丹佛PTG讨论:https://etherpad.openstack.org/p/blazar-ptg-stein

历史记录

修订版

发布名称

描述

Stein

引入