Agent Driver¶
https://blueprints.launchpad.net/ironic/+spec/agent-driver
Ironic 需要一个部署驱动程序来与 Ironic Python Agent 交互。
问题描述¶
目前,Ironic 在裸机节点上执行的任务有限。诸如“更新固件”和“安全擦除磁盘”之类的操作是不可能的。这并非 Ironic 本身存在缺陷所致,而是 Ironic 的 PXE 驱动程序使用的部署 ramdisk 的限制。
Ironic Python Agent (IPA) 是一个项目,旨在为 Ironic 提供一个部署代理。该代理设计在 ramdisk 中运行,并对裸机节点执行维护操作,包括硬件配置和管理、服务器配置和退役。该代理公开一个 REST API,Ironic 可以调用该 API 来执行各种任务。
潜在用例
通常,服务器运行最新的 BIOS 固件是有利的。更新固件是 Ironic 中的一项关键功能。
最终用户通常希望在服务器释放时擦除其数据。能够在裸机节点的磁盘上运行安全擦除是 Ironic 的另一项关键功能。
最终用户可能希望将不同的工作负载部署到裸机节点。有些用户可能希望在裸机上运行应用程序,而另一些用户可能希望运行虚拟机监控程序。这些不同的工作负载可能需要不同的 BIOS 配置,例如切换 VT 位开或关。这个实用 ramdisk 使 Ironic 能够管理这些配置。
有些用户可能希望单个裸机节点具有更快的启动时间。可以通过让节点运行 ramdisk 来实现此目的,以便随时准备部署。与 PXE 驱动程序相比,这消除了一个 POST 周期。此外,ramdisk 可以在部署时间之前将常用镜像写入启动设备,以消除写入镜像所花费的时间。
最终用户可能希望使用 configdrive 和 cloud-init 加载 SSH 密钥或网络配置等数据。ramdisk 可以写入包含 configdrive 的分区,供最终用户及其镜像使用。
Ironic 需要一个与代理交互的部署驱动程序,而不是现有的部署 ramdisk。
提议的变更¶
应实现一个与代理交互的完整部署驱动程序。
该驱动程序将
允许代理查找 Ironic 为代理运行的节点存储的 UUID。
允许代理定期发送心跳。驱动程序应使用此心跳来验证代理是否在线。
利用定期心跳作为回调机制。
调用代理的 REST API,以指示代理执行与部署相关的任务,例如写入镜像。
调用代理的 REST API 以执行退役任务。
行为类似于现有的 PXE 驱动程序,明确目标是最终合并这两个驱动程序(如果这不可行,则此目标可以放弃)。
备选方案¶
构建此驱动程序的唯一替代方案是继续使用现有的 PXE 部署驱动程序,以提供此规范中标识的功能。今天,此驱动程序与建议的代理驱动程序具有非常不同的模型。从与 Ironic 领导层的讨论来看,最好从两个端点开始工作,并朝着单个驱动程序的方向收敛。
数据模型影响¶
将在
driver_info字段中存在两个字段:“agent_url”和“agent_last_heartbeat”。
REST API 影响¶
将添加两个 vendor_passthru 方法
节点查找方法
描述:代理将在启动时将包含详细硬件信息的 JSON blob 发布到此端点。Ironic 将使用此信息来确定代理正在运行的节点(第一次迭代将查找匹配的 MAC 地址),并将节点的 UUID 返回,以及定义从代理接收下一个心跳的超时的整数(以秒为单位)。
方法类型:POST
正常响应代码:200
预期错误
400:发送的硬件数据结构版本无效。
404:未找到具有提供的硬件信息的节点。
URL:/{api_version}/drivers/{driver}/vendor_passthru/lookup
参数:无。
Body JSON schema
{ "version": 2 "inventory": { "interfaces": [{...}, ...], "cpu": {...}, "disks": [{...}, ...], "memory": {...} } }
Response JSON schema
{ "heartbeat_timeout": 300, "node": { "uuid": "some-uuid" } }
心跳方法
描述:代理将定期向 Ironic 发送心跳,以指示其仍在运行,以及在从 Ironic 收到命令后立即发送。代理驱动程序将利用此心跳作为回调机制。如果节点已上电,未配置,并且未在可配置的超时时间内收到心跳,则 Ironic 将对此节点采取操作;也许尝试重新启动或将节点置于维护模式。作为心跳请求的一部分,代理提供其端点 URL,Ironic 可以在此处向代理发出请求。Ironic 将心跳时间和代理的 URL 存储在
Node.driver_info中。方法类型:POST
正常响应代码:202
预期错误:* 404:找不到指定的节点。
URL:/{api_version}/nodes/{node_uuid}/vendor_passthru/heartbeat
参数:节点的 UUID 是 URL 的一部分。
Body JSON schema
{ "agent_url": "http://1.2.3.4:9999/" }
Response JSON schema:无
驱动程序 API 影响¶
对驱动程序 API 没有影响。
Nova 驱动程序影响¶
对 Nova 驱动程序没有影响。
安全影响¶
需要实现某种身份验证方法。今天,Ironic 的 PXE 驱动程序在启动部署 ramdisk 时通过 PXE 配置发送一个令牌,代理驱动程序可以执行类似的操作。更可取的是通过某种带外机制发送密钥,并使用该密钥将代理 ramdisk 验证到 Ironic。
这尚未确定,并且可能不会在此规范的第一个迭代中实现。
其他最终用户影响¶
最终用户不会直接与此驱动程序提供的功能交互。
可扩展性影响¶
此更改涉及代理和 Ironic 之间的通信,这可能会对性能产生一定影响。但是,由于代理可以直接下载和写入镜像,Ironic 将不再有镜像流量通过它,因此 Ironic 的整体网络流量可能会减少。
此外,此驱动程序可能允许单个 conductor 管理更多节点,因为 conductor 仅对代理进行 API 调用,而不是写入镜像数据。
如果使用长期运行的模型,Ironic 的 API 服务器可能会完成更多工作,因为代理将通过 API 定期发送心跳。
每次心跳都会更新数据库,因此在此场景中也可能会看到额外的负载。但是,此更新调用应该相当快,相当不频繁,并且在 conductor 中后台完成,因此应该只会产生很小的影响。可以通过扩展 conductor 集群来缓解这种情况。
性能影响¶
此驱动程序不会更改任何现有代码的性能特征。
驱动程序有时会锁定节点 - 但是,只有在部署和 tear_down 期间,锁才会被长时间持有。
当哈希环重新平衡时,驱动程序应表现得类似于 PXE 驱动程序。
其他部署者影响¶
要使用此驱动程序,部署者需要
在配置中显式启用驱动程序。
使用该驱动程序注册节点。
使用 ironic-python-agent 项目中提供的工具构建代理镜像。
将添加一个配置选项
agent.heartbeat_timeout:在确定代理不再运行时等待多长时间。默认值为 300 秒。
添加的驱动程序类包括
agent_ssh (AgentDeploy + SSHPower)
agent_ipmitool (AgentDeploy + IPMIPower)
agent_pyghmi (AgentDeploy + NativeIPMIPower)
fake_agent (AgentDeploy + FakePower)
代理将依赖于对以下服务的访问
Glance 和/或 Swift
Neutron 用于 DHCP
下面的参考部分包含使用代理驱动程序运行 Ironic 的示例架构图。
开发人员影响¶
此更改不会影响其他 Ironic 开发人员。
实现¶
负责人¶
主要负责人:JoshNang
其他贡献者
jroll
russell_h
JayF
dwalleck
工作项¶
实现驱动程序。
为 IPA 添加 diskimage-builder 元素。
为 DevStack 添加支持,以便同时运行 Ironic 和 IPA 以及 PXE 驱动程序。这对于测试至关重要。
为使用代理驱动程序的 Ironic 编写 Tempest 测试。
依赖项¶
无。
测试¶
计划使用现有的 tempest 测试,但指定此驱动程序。这将需要对 tempest 和 devstack 进行更改。
部署者能够在同一环境中同时使用 PXE 和 IPA 驱动程序至关重要。Tempest 测试应明确测试对此支持。
文档影响¶
需要有关于如何使用代理驱动程序的清晰文档。