使用 node-set-provision-state 发现节点属性¶
蓝图 URL: https://blueprints.launchpad.net/ironic/+spec/ironic-node-properties-discovery
该提案增加了执行带外节点检查并使用 node-set-provision-state(新的目标‘inspect’)进程自动更新节点属性的能力。相同的 API 集也可以用于带内属性发现。
问题描述¶
目前,Ironic 无法自动检测节点属性,而这些属性是调度或部署(端口创建)所必需的。
调度/部署所需的属性
内存大小
磁盘大小
CPU 数量
CPU 架构
网卡(s) MAC 地址
提议的变更¶
该规范建议添加以下功能
发现硬件属性并更新 node.properties。即使这些值已经设置,它也会使用新的值集更新所有属性。
为发现的网卡 MAC 地址创建端口。在发现 NIC 后会自动完成此操作。如果端口已存在,则不会为该 MAC 地址创建新端口。它将负责添加和删除 NIC 更改的端口。在发现时不再与节点关联的端口将自动删除。理想情况下,端口应为启用 PXE 的 MAC 地址创建,但是,获取硬件上启用 PXE 的 MAC 地址列表是每个驱动程序的责任。
以下操作将用于实现属性检查
将在端点 provision /v1/nodes/<uuid>/states/provision 中添加一个新的目标‘inspect’
当检查完成时,将 node.provision_state 设置为 MANAGED,并将 node.target_provision_state 设置为 None。
可能的新状态是:INSPECTING、INSPECTFAIL、MANAGED、INSPECTED。
有关每个状态的更多详细信息,请参阅 [1]。
初始状态:node.provision_state = INSPECTING node.target_provision_state = INSPECTED
成功时:最终状态:node.provision_state = MANAGED node.target_provision_state = None
失败时:最终状态:node.provision_state = INSPECTFAIL node.target_provision_state = None 并且错误将更新到最后一个错误。
如果无法检查任何属性(调度程序所需的属性),则预置状态将标记为 INSPECTFAIL。在这种情况下,将不会更新任何属性。因此,要么全部成功,要么全部失败。
在启动检查之前,节点必须处于 MANAGED 状态。
属性值将在每次调用发现 API 时被覆盖。这是因为两次调用发现 CLI/API 之间硬件可能会发生添加/删除。
为检查实施超时。Conductor 中应有一个定期任务,检查每个映射的节点是否未处于 INSPECTING 状态超过
inspect_timeout。这将作为 /etc/ironic/ironic.conf 中的配置选项添加。
内省的 Node.properties 将在每次执行内省时更新。
要发现的硬件属性:¶
将发现以下属性
网卡 MAC 地址
CPU
CPU 架构
local_gb
memory_mb
NIC 数据将用于自动创建端口。其他属性是调度程序所需的属性,因此将在 Node.properties 字段中更新。
备选方案¶
可以使用以下 API 请求使用 node-create 启动发现
POST /v1/nodes/?discover=true
在这种情况下,Nodes.post 需要完全异步。这将与 node-create 产生兼容性问题,因为它需要返回一个节点对象。另一方面,如果同步完成发现,Nodes.post 将会变慢。在这种情况下,如果 Nodes.post 仍然返回未更新属性的节点对象给 CLI,并在后台执行发现,那么 Nodes.post 将会变成半同步半异步,这与 REST API 的结构不符,因为 REST API 应该是同步或异步的。因此,这里 node-create 变成部分同步和部分异步。鉴于以上原因,没有选择这种方法。
自动发现也可以用于发现节点属性,但它也不能提供在 node-create 和 node-set-provision-state 时发现属性的能力。
数据模型影响¶
发现的属性将存储在节点的‘properties’字段中。它将在 nodes 表中添加两个字段
last_inspected:它将使用时间(上次检查完成的时间)更新。inspection_started_at:它将存储调用检查的开始时间。这将需要计算inspection_timeout。检查完成后或超时后,它将被清除。
Ironic CLI 影响¶
需要定义 node-set-provision-state 目标‘inspect’。语法如下
usage: ironic node-set-provision-state <UUID> inspect
REST API 影响¶
将通过一个新的目标增强‘provision’端点
PUT /v1/nodes/<uuid>/states/provision {“target”: “inspect”}
将 provision_state 更改为 INSPECTING。
将 target_provision_state 更改为 INSPECTED。
方法类型:PUT
正常响应代码:202
预期错误
如果节点不存在,则返回 404。
如果找不到节点的驱动程序的 conductor,则返回 400。
如果节点无法过渡到 INSPECTING 状态,则返回 409 CONFLICT。
URL: /v1/nodes/<uuid>/states/provision {“target”: “inspect”}
URL 参数:无。
如果成功,响应体为空。
当检查完成时,将 node.provision_state 设置为 MANAGED,并将 node.target_provision_state 设置为 None。
RPC API 影响¶
将添加一个新的 rpcapi 方法 inspect_hardware()。它将是对 conductor 的同步调用,并将生成一个工作线程来执行发现。这将允许 API 服务从 conductor 接收到已启动检查的确认,并向客户端返回状态 202。
驱动程序 API 影响¶
它将添加新的接口 InspectInterface,其中包含方法 inspect_hardware()
def inspect_hardware(self, task):
"""Inspect hardware.
:param task: a task from TaskManager.
"""
驱动程序可以选择实现 InspectInterface。
由于 InspectInterface 是一个标准接口,因此还将添加以下方法
validate()
get_properties()
Nova 驱动程序影响¶
无。
安全影响¶
无。
其他最终用户影响¶
此功能将改善用户体验,因为用户不再需要手动更新节点属性信息。
可扩展性影响¶
无。
性能影响¶
无。
其他部署者影响¶
在 ironic.conf 的 conductor 下引入 inspect_timeout。与带内实现一样,其默认值应为 1800 秒。
开发人员影响¶
需要实现 base.InspectInterface() 的驱动程序可以选择实现/定义此提案添加的抽象方法。
实现¶
负责人¶
- 主要负责人
Nisha Agarwal (launchpad ID: agarwalnisha1980, IRC 登录 ID: Nisha)
- 其他贡献者
Wan-Yen Hsu (launchpad ID : wan-yen-hsu, IRC 登录 ID: wanyen)
工作项¶
添加一个新的 rpcapi 方法 inspect_hardware(),它将调用 InspectInterface 以发现、更新节点属性和创建/更新端口。
向 ironic 驱动程序添加一个新的接口 InspectInterface。
向 InspectInterface 类添加新的方法 inspect_hardware。
向
nodes表添加新的元素last_inspected和inspection_started_at。运行ironic node-show时,Ironic cli 将更改为显示这些字段。node.last_inspected 将使用上次发现的时间更新。
node.inspection_started_at 将使用启动检查的时间更新。这将有助于检查超时。需要为同一目的创建定期任务。
iLO 驱动程序将完成参考实现。
为更新已注册节点的硬件属性,向 node-set-provision-state 添加一个新的目标‘inspect’。(ironic-client 更改)
依赖项¶
需要实现 https://specs.openstack.org/openstack/ironic-specs/specs/kilo/new-ironic-state-machine.html 以实现状态 MANAGED、INSPECTED、INSPECTING 和 INSPECTFAIL。
测试¶
将添加符合 ironic 测试要求的单元测试。可以为特定实现编写 tempest 测试套件。
升级和向后兼容性¶
没有影响。
文档影响¶
需要正确记录。
参考资料¶
[1] ironic 节点的所有可能状态规范:https://specs.openstack.org/openstack/ironic-specs/specs/kilo/new-ironic-state-machine.html