为网络感知调度 (Pike) 准备工作¶
https://blueprints.launchpad.net/nova/+spec/prep-for-network-aware-scheduling-pike
更改我们与 neutron 的通信方式,以便将来能够实现网络感知调度。
这延续了 Newton 中开始的工作:https://specs.openstack.org/openstack/nova-specs/specs/newton/implemented/prep-for-network-aware-scheduling.html
问题描述¶
由于运营商的网络配置,某些 IP 子网可能被限制到一部分主机。在这种环境下,这意味着你可能会在没有可用公共 IP 的地方构建。Neutron 的 Routed Networks 功能正在添加对这种 IP 地址管理方式的支持
为了使之成为可能,我们需要在请求调度器选择主机之前,了解用户请求的所有端口的详细信息以及所需的资源。此外,在选择位置后,我们应该检查是否有可用的 IP 地址,然后再继续执行其余的构建过程。
顺便说一下,`allocate_for_instance` 调用目前包含该操作的两个部分,并且很难维护和演进。在 Newton 中,我们更改了代码以分离更新和创建操作,因此我们现在可以考虑移动这些操作的发生位置。
用例¶
这主要是一个代码重构。
提议的变更¶
在 Newton 中,我们已经将 `allocate_for_instance` 内部的代码更改为清晰的获取/创建和更新阶段。我们需要完成拆分,确保网络信息缓存包含所有需要在操作的两个阶段之间共享的信息(获取/创建端口和更新端口)。如果构建请求失败,并且构建在不同的主机上重试,Nova 创建的端口应该被用于新的构建尝试,就像传递到 Nova 的端口一样。这个错误修复需要以非常相似的方式正确传递数据,因此这将是这项工作的初始重点。
其次,我们希望在调用调度器之前移动获取/创建端口的操作。在升级方面,我们需要确保旧的计算节点不会重新创建 conductor 已经创建的端口。同样,在删除实例时,旧节点仍然应该正确知道 Nova 创建了哪些端口,并且可以在实例删除时以通常的方式删除这些端口。对于 nova-network 用户,获取/创建端口可以是一个空操作。
为了避免升级期间出现问题,在所有 nova-compute 节点升级到理解端口是否已被创建的版本之前,不允许提前创建端口。一旦所有节点都升级,并且凭据在 nova-conductor 节点上可用,端口将在调用调度器之前创建。
第三步是将端口更新移动到 conductor,紧接在调度器选择合适的宿主机之后。我们无法在所有计算节点都升级到最新版本之前运行此代码。在所有节点都升级之前,新节点仍然必须在计算节点上运行此代码。虽然令人烦恼,但此移动只是为了帮助更快地重试,因此不应阻止任何进展。请注意,此端口更新步骤包括在端口上设置宿主机,并且在未来将是分配 IP 的点,如果端口尚未具有 IP 地址。
更新 conductor 中的端口绑定很有用,这样可以快速触发特定主机的端口绑定失败的重试。这尤其是在使用路由网络时,段可以独立耗尽 IP 地址的情况下。
对于 nova-network,我们可以在调用调度器之后,在 conductor 中运行现有的 `allocate-for-instance` 逻辑。对于 cells v1 用户,这应该正确地在子 cell conductor 中,因为每个 cells v1 cell 都有自己独立的 nova-network 实例,具有不同的 IP 地址集。(对于 cells v2 用户,网络是全局的 nova 部署,因此发生位置并不重要。)
备选方案¶
我们可以尝试向现有的 allocate_for_instance 代码添加更多的复杂性。但历史表明这可能会产生许多回归。
数据模型影响¶
无
REST API 影响¶
无
安全影响¶
最终,这可能意味着我们不需要任何计算节点上的任何 neutron 相关凭据。这项工作不会实现该目标,但这是朝着正确方向迈出的一步。
通知影响¶
通知可能具有不同的宿主机和服务,但除此之外应该完全相同。
其他最终用户影响¶
无
性能影响¶
当前 neutron 端口绑定与计算节点在启动过程中执行的其他长期运行任务并行进行。这将端口创建和绑定移动到启动过程的关键路径中。
当 Nova 为用户创建端口时,不再只是使用所有参数调用 port create,而是先创建端口,然后更新端口。这将略微增加启动过程中 Neutron API 的负载。但是,这应该很小,因为我们没有复制任何代价高昂的过程,例如端口绑定和 IP 分配。
这通常会将更多负载转移到 nova-conductor 节点,但好的一面是,这减少了 nova-compute 节点的负载。
其他部署者影响¶
我们需要 nova-conductor 上的 neutron 凭据,这可能目前还没有发生。
为了维护我们的升级承诺,我们将回退到旧行为一个周期,以便向部署者发出关于缺少凭据的警告。下一个周期将要求凭据存在于 nova-conductor 上。
开发人员影响¶
改进了对 allocate_for_instance 及其替代方案的理解。
实现¶
负责人¶
- 主要负责人
John Garbutt (IRC: johnthetubaguy)
工作项¶
将 allocate_for_instance 分成两个函数
将创建/获取端口调用移动到 conductor,在调用调度器之前,使得 allocate_for_instance 不再创建端口,对于 nova-net 来说是一个空操作。这可能通过向 neutron 和 nova-net 的网络 API 中添加新方法来实现。
将 allocate_for_instance 的其余调用移动到 conductor,对于 nova-net 和 neutron
依赖项¶
无(但是,有几件事依赖于这项工作)
测试¶
Grenade + neutron 应该确保覆盖预升级流程,常规的 gate 测试应该确保覆盖升级后的流程。
我们应该添加功能测试来测试重新调度流程。我们可能还需要功能测试来检查预升级和升级后流程之间的过渡。
文档影响¶
需要在发布说明中描述过渡,并至少提供特定于发布的升级文档。
参考资料¶
历史¶
发布名称 |
描述 |
|---|---|
Newton |
引入 |
Ocata |
继续 |
Pike |
重新提出 |