Conductor/node grouping affinity¶
https://storyboard.openstack.org/#!/story/2001795
本规范建议向节点添加 conductor_group 属性,该属性可以匹配具有匹配 conductor_group 配置选项配置的一个或多个 conductor,从而将这些节点的控制限制于这些 conductor。
问题描述¶
目前,没有办法控制 conductor 到节点之间的映射关系。出于多种原因,这是期望的
操作员可能有一个跨多个站点的 Ironic 部署。如果无法控制此映射,镜像可能会通过广域网链路拉取。这会导致部署速度变慢,并且可能安全性较低。
类似地,操作员可能希望将节点映射到物理上更靠近节点在同一站点的 conductor,以减少节点和 conductor 之间的网络跳数。一个很好的例子是在每个机架中放置一个 conductor,从而将路径缩短到仅通过机架顶端交换机。
部署者可能具有多个用于带外控制的网络,这些网络必须完全隔离。此功能将允许将 conductor 隔离到单个带外网络。
部署者可能具有多个物理网络,并非所有 conductor 都连接到这些网络。通过正确配置映射,conductor 只能管理它们可以与之通信的节点。这在另一个 RFE 中有更详细的描述。[0]
提议的变更¶
我们建议为 conductor 添加一个 conductor_group 配置选项,该选项是一个单独的任意字符串,用于指定 conductor 的分组特征。
我们还建议在节点记录中添加一个 conductor_group 字段,该字段将用于将节点映射到 conductor。此匹配将不区分大小写,以便为操作员提供一些便利。
空白的 conductor_group 字段或配置是默认值。没有组的 conductor 只能管理没有组的节点,并且没有组的节点只能由没有组的 conductor 管理。
哈希环需要修改以考虑分组,如下面的 RPC API 影响 部分所述。
备选方案¶
另一个 RFE[1] 提出了一种复杂的硬性和软性亲和性系统、亲和性和反亲和性,以及对具有多个标签的 conductor 的放置评分。这非常复杂,我认为我们短期内无法完成。完成这项更基础的工作不会阻止这项更复杂的工作,因此我们应该一步一步地进行。
数据模型影响¶
将在节点表中添加一个 conductor_group 字段,类型为 VARCHAR(255)。其默认值为 "",即空字符串。此字符串将用于哈希环计算,因此没有必要将其默认为 NULL。
还将添加一个 conductor_group 字段到 conductor 表中,类型也为 VARCHAR(255)。其默认值也为 "",即空字符串。这将用于构建哈希环,以查找节点应该放置在哪里。
状态机影响¶
无。
REST API 影响¶
节点的 conductor_group 字段将添加到 REST API 中的节点对象中,并使用微版本号,如通常所做的那样。它将允许在 POST 和 PATCH 请求中使用。与数据库一样,它将限制为 255 个字符。必须有一个在该组中的 conductor 可用,因为 conductor 服务节点创建和更新,并且通过哈希环选择。
值得注意的是,我们最终希望通过 REST API 暴露 conductor 的分组。但是,最佳方法尚不清楚,因此我们暂时将其排除在本规范的范围之外。另一个 RFE[3] 提出了一种服务管理 API,可能是一个不错的选择。
客户端 (CLI) 影响¶
“ironic” CLI¶
无,它已被弃用。
“openstack baremetal” CLI¶
节点的 conductor_group 字段将在客户端输出中公开,并添加到 node create 和 node set 命令中。
RPC API 影响¶
这将影响与给定节点对应的 RPC 调用的目标 conductor,但不会直接影响 RPC API 本身。
哈希环将更改,以便哈希环的内部键现在将具有 "$conductor_group:$drivername" 的结构。冒号 (:) 用于分隔两者,以消除 conductor 组和驱动程序或硬件类型之间的冲突。例如,一个 agent_ilo 键没有分隔符可能意味着没有组的节点和 agent_ilo 驱动程序,或者它可能意味着组 agent_ 使用 ilo 硬件类型的节点。为了处理升级,在服务固定到此功能之前的版本时,将构建不带 conductor 组的哈希环键,并在服务取消固定或固定到此功能实现之后的版本时,构建带有 conductor 组的哈希环键。
我们通过忽略对 RPC 版本小于此功能发布的服务的分组来处理升级。一旦一切升级并取消固定,我们便开始使用配置的分组标签。
操作员应保留足够数量的没有配置分组标签的 conductor 以运行集群,直到节点可以配置分组标签。任何没有分组标签的节点都只能由没有分组标签的 conductor 管理。
驱动程序 API 影响¶
哈希环生成和查找将包括分组标签,如 RPC API 影响 部分所述。
Nova 驱动程序影响¶
此更改对 Nova 是透明的。
Ramdisk 影响¶
无。
安全影响¶
没有直接影响;但是,这通过启用逻辑基础设施隔离提供了另一种保护部署的机制。
其他最终用户影响¶
无。
可扩展性影响¶
无。
性能影响¶
无。
其他部署者影响¶
希望使用此功能的部署者需要管理标记 conductor 和节点以启用它的过程,这可能是一项非平凡的任务。
开发人员影响¶
无。
实现¶
负责人¶
- 主要负责人
jroll
- 其他贡献者
dtantsur
工作项¶
添加数据库字段。
添加 conductor 配置并填充 conductor DB 字段。
更改哈希环计算,并更新 RPC API,以便我们可以在升级期间固定。
在节点和 conductor 对象中添加字段。
进行 REST API 更改。
更新客户端库/CLI。
记录该功能。
依赖项¶
无。
测试¶
单元测试应该足够,因为这就是我们现在测试哈希环的方式。在没有通过 REST API 暴露 conductor 分组的情况下,很难使用 Tempest 进行测试。
升级和向后兼容性¶
这在 RPC API 影响 部分中描述。
文档影响¶
这应该在安装指南和管理员指南中记录。
参考资料¶
[0] https://storyboard.openstack.org/#!/story/1734876
[1] https://storyboard.openstack.org/#!/story/1739426
- [2] Rocky PTG 会议记录
https://etherpad.openstack.org/p/ironic-rocky-ptg-location-awareness