为网络感知调度做准备

https://blueprints.launchpad.net/nova/+spec/prep-for-network-aware-scheduling

更改我们与 neutron 的通信方式,以便将来能够实现网络感知调度。

问题描述

由于运营商的网络配置,某些 IP 子网可能被限制到一部分主机。在这种环境下,这意味着你可能在没有可用公共 IP 的地方构建实例。这个功能正在 Neutron 中通过 Routed Networks 特性添加。

为了使之成为可能,我们需要在请求调度器选择主机之前,了解用户请求的所有端口的详细信息以及所需的资源。此外,在选择位置后,我们应该检查是否有可用的 IP 地址,然后再继续执行其余的构建过程。

顺便说一下,`allocate_for_instance` 调用目前包含该操作的两个部分,并且证明很难维护和演进。将该代码拆分为单独的获取/创建端口和绑定端口阶段,应该有助于使代码更易于导航。

用例

这主要是一个代码重构。

提议的变更

第一步是将 nova-compute 管理器的 `allocate_for_instance` 拆分为两个不同的阶段:获取/创建端口和绑定端口。目前,我们根据是否传递了端口来创建或更新端口。这改变了逻辑,可以选择性地创建端口,然后始终使用绑定细节更新端口。

其次,我们希望在调用调度器之前移动获取/创建端口的操作。在升级方面,我们需要确保旧的计算节点不会重新创建调度器已经创建的端口。同样,在删除实例时,旧节点应该正确知道哪些端口是由 Nova 创建的,可以被删除。对于 nova-network 用户,获取/创建端口可以是一个空操作。

第三步是将端口更新移动到 conductor,紧接在调度器选择合适的宿主机之后。我们无法在所有计算节点都升级到最新版本之前运行此代码。在所有节点都升级之前,新节点仍然必须在计算节点上运行此代码。虽然令人烦恼,但此移动只是为了帮助更快地重试,因此不应阻止任何进展。请注意,此端口更新步骤包括在端口上设置宿主机,并且在未来将是分配 IP 的点,如果端口尚未具有 IP 地址。

关于在端口创建期间发生的 MAC 地址更新,仍然存在一些未解决的问题。此过程仅对基于 ironic 的虚拟机是必需的。该代码的当前状态正在破坏我们使用 Nova 外部创建的端口启动 ironic 实例的能力。解决此问题可能会延迟这项工作。DNS 更新预计在此过渡期间不会发生变化,但随着这项工作的进展,我预计会出现类似 MAC 地址问题的问题。

对于 nova-network,我们可以在调用调度器之后,在 conductor 中运行现有的 `allocate-for-instance` 逻辑。对于 cells v1 用户,这应该正确地在子单元 conductor 中。对于 cells v2 用户,将此放在 api conductor 中无关紧要。

备选方案

我们可以尝试向现有的 allocate_for_instance 代码添加更多的复杂性。但历史表明这可能会产生许多回归。

数据模型影响

REST API 影响

安全影响

最终,这可能意味着我们不需要任何计算节点上的任何 neutron 相关凭据。这项工作不会实现该目标,但这是朝着正确方向迈出的一步。

通知影响

通知可能具有不同的宿主机和服务,但除此之外应该完全相同。

其他最终用户影响

性能影响

当前 neutron 端口绑定与计算节点在启动过程中执行的其他长期运行任务并行进行。这将端口创建和绑定移动到启动过程的关键路径中。

当 Nova 为用户创建端口时,不再只是使用所有参数调用 port create,而是先创建端口,然后更新端口。这将略微增加启动过程中 Neutron API 的负载。但是,这应该很小,因为我们没有复制任何代价高昂的过程,例如端口绑定和 IP 分配。

这通常会将更多负载转移到 nova-conductor 节点,但好的一面是,这减少了 nova-compute 节点的负载。

其他部署者影响

我们需要 nova-conductor 上的 neutron 凭据,这可能目前还没有发生。

开发人员影响

改进了对 allocate_for_instance 及其替代方案的理解。

实现

负责人

主要负责人

John Garbutt (IRC: johnthetubaguy)

工作项

  • 解决在新系统中 MAC 地址分配将如何工作

  • 将 allocate_for_instance 分成两个函数

  • 将创建/获取端口调用移动到 conductor,在调用调度器之前,使得 allocate_for_instance 不再创建端口,对于 nova-net 来说是一个空操作。这可能通过向 neutron 和 nova-net 的网络 API 中添加新方法来实现。

  • 将 allocate_for_instance 的其余调用移动到 conductor,对于 nova-net 和 neutron

依赖项

测试

Grenade + neutron 应该能很好地覆盖这一点。

文档影响

参考资料

历史

修订版

发布名称

描述

Newton

引入