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 测试应明确测试对此支持。

文档影响

需要有关于如何使用代理驱动程序的清晰文档。

参考资料