浮动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预留的基本思路及其场景如下
管理员使用Blazar注册一些用于浮动IP预留的浮动IP。 管理员使用包含公共网络ID及其浮动IP地址的请求体调用Blazar的浮动IP API。 浮动IP地址必须超出外部网络子网中的allocation_pools。
用户使用外部网络ID、开始日期和结束日期调用创建租赁API。 Blazar检查请求的浮动IP可用性。 如果可用,Blazar在浮动IP和预留之间创建关联,然后返回预留ID。 如果不可用,Blazar不会返回预留ID。
在开始时间,Blazar在用户的租户(项目)中创建预留的浮动IP。 然后用户可以像往常一样附加、分离和删除浮动IP。
在结束时间,如果用户尚未删除浮动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文档。
参考资料¶
历史记录¶
发布名称 |
描述 |
|---|---|
Stein |
引入 |