分配 openstack 浮动 IP,同时确保它不会从其他服务器上删除

Assign openstack floating IP while making sure it will not be removed from other server

(我正在使用 openstack4j 通过 REST 与 OpenStack 通信 API)

我想重用我的租户中分配的一些未分配的浮动 IP(分配给新配置的服务器)。但是,似乎 addFloatingIp 操作在分配未使用的浮动 IP 和在服务器之间重新分配它之间没有区别。

我想自动化这个过程,但我害怕以下竞争条件:一个客户端检查特定 IP 是否空闲,并且在它设法将它与服务器 A 关联之前,另一个客户端将它与服务器 B 关联。从角度来看第二个客户端的,关联的浮动IP可以在关联成功后随时移除。

有没有更好的方法?

可能的解决方法是:

  • 只删除和创建浮动IP。正如您所说,这是首选方式。小型虚拟机可以定期从内部清理不再使用的浮动 IP。但是应该首选 API 客户端从外部进行清理。因此,每个客户端都应该集成此功能,但是必须注意,这是用户的意图,至少他们会丢失一些重要的东西。示例:您用于删除 VM 的网站 UI 可能会询问是否也应删除关联的浮动 VM。 Openstack Heat(通过模板进行编排)会自动执行此操作。 CLI 客户端可以在删除 VM 后提供删除释放的资源。
  • 使用支持同步的东西来协调。示例:etcd、具有事务支持的数据库(SQL 或不)、可以确保交付恰好完成一次的队列(例如,具有声明功能的 OpenStack Zaqar)。
  • 使用时间流逝进行同步:读取、更改、等待特定时间,最后再次读取以检查没有人覆盖更改。如果此更改花费的时间太长,则在特定等待时间之前中止。如果更改被覆盖,请使用不同的浮动 ip 重试。这很难做到正确,因为有很多极端情况,尤其是足够快地正确中止,这可能会导致失败。例如,如果不是更改经过的每个地方都确保不会发生这种情况,那么高负载可能会在更改被中止后很长时间内使更改成功。

其他 OpenStack API 也有同样的问题,例如updating security groups. In general this could be avoided by adding revision counters to APIs, for example kubernetes (resourceVersion from ObjectMeta) and etcd (modifiedIndex in v2, v3 中的 mod_revision) 执行此操作。

即使 API 实现了无种族变化的选项,大多数 UI 人类也可能只将其用于种族检测而不是避免,因为 UI 告诉他们有一场比赛,它覆盖的内容优于要求他们在每次比赛发生时重试他们的行动的比赛。

有问题的挑战涉及使用(现已弃用)计算服务的浮动 IP 扩展,它将浮动 IP 分配分为两个步骤:分配(/os-floating-ips 端点)和分配(addFloatingIp 服务器操作).

目前支持的方式是通过允许在一个请求中创建和关联浮动 IP 的 Neutron 服务来操作浮动 IP(POST/v2.0/floatingips)。至少在理论上,这消除了希望重用浮动 IP 的客户端同时将一个与其他客户端关联的可能性。如果所有客户端都同意使用这种浮动 IP 分配模式,则未关联的浮动 IP 可以安全地作为悬空实体进行处理。