图形控制台支持

https://bugs.launchpad.net/ironic/+bug/2086715

硬件厂商正在增加对通过非标准 Redfish 接口实现远程图形控制台的支持。最终用户希望有一种一致的方式来通过 Ironic 使用命令行、Nova 驱动程序或 Horizon Web 界面访问这些控制台。

问题描述

Nova 长期以来一直通过 NoVNC 代理为虚拟机提供 VNC 图形控制台支持。Ironic 最终用户希望以相同的方式访问裸机图形控制台。目前,没有 Redfish 标准化的方法来管理裸机控制台,并且每个厂商都暴露不同的方法和功能

  • Dell iDRAC:VNC 可通过 sushy-oem-idrac 支持的 oem 属性完全管理,包括更改密码。还提供一个 BMC Web 界面,显示基于 html5 的控制台。

  • HPE iLO:需要 html5/java/.net/windows 客户端,与 VNC 无关。没有密码管理。还提供一个 BMC Web 界面,显示基于 html5 的控制台。

  • Supermicro:可以通过 IPMI 调用,基于 VNC,但具有自定义颜色空间和其他附加操作码,因此与标准 VNC 客户端不兼容。需要 html5/java 或 NoVNC 的一个分支[1]。KVMIP 端口 5900 在 redfish/v1/Managers/1/NetworkProtocol 中列出,但它不能通过 Redfish 进行管理。还提供一个 BMC Web 界面,显示基于 html5 的控制台。

基础设施运营商还需要图形控制台的只读视图。

提议的变更

NoVNC 代理

Nova 有一个单独的 novnc-proxy 服务,它提供 NoVNC Web 资源,并向浏览器打开一个 websocket,该 websocket 代理到 VNC 服务器 TCP 连接。这允许在 Web 浏览器中显示 VNC 会话,而无需直接与 VNC 服务器的网络连接。这段代码相当独立,因此将其直接从 nova 移植到 ironic 代码库是可行的,只需要进行以下更改

  • 将 token 查找替换为简单的节点查找和 token 验证

  • 调整进程启动以使用 ironic.common.service。这增加了 novnc-proxy 服务可以集成到 all-in-one singleprocess 启动器中的可能性。

  • nova.conf 选项从三个组合并到一个 ironic.conf [vnc] 组。

对于某些驱动程序,novnc-proxy 将直接连接到 BMC 暴露的 VNC 服务器。这意味着它需要同时访问 BMC 网络,并能够向最终用户暴露 HTTP 服务。

对于其他驱动程序,需要为每个连接运行一个中间 VNC 服务器。驱动程序或 novnc-proxy 需要启动(但不直接管理)这些容器。

只读支持

一个 ironic.conf [vnc] 选项将默认将连接设置为只读。运营商可以根据基于浏览器的控制台可能暴露的非控制台操作,更改此默认设置。

基于容器的驱动程序提案

所有厂商的共同实现是基于浏览器的 BMC 界面,其中包括基于 html5 的控制台。

建议的方法是为每个图形控制台会话启动一个容器,该容器运行以下堆栈

  • 由 Xvfb 提供的无头 X11 会话

  • 显示会话的 VNC 服务器,例如 x11vnc

  • 以应用模式(全屏、单个站点)运行的 chromium 浏览器

  • 一个入口脚本,它运行一个(python)Selenium 脚本来登录 BMC 并加载基于 html5 的控制台。

可以采用模板驱动的方法,为每个活动的控制台编写一个文件,该文件提供足够的信息供外部工具启动和停止容器。驱动程序可以负责根据这些模板编写文件,并等待写入包含 VNC 端点地址和端口的另一个文件。novnc-proxy 然后可以连接到此 VNC 服务器并开始代理流量。

将编写一个可选的服务,该服务将由 devstack 启动,该服务将通过 podman 管理这些 VNC 容器的生命周期。此服务可能适合某些部署架构,但不适合所有架构。例如,由 kubernetes 管理的 Ironic 需要类似 operator 的东西来监视这些文件的更改并管理 VNC pod。此基于文件的接口将记录下来,以便支持其他容器管理实现。

如果厂商具有 Redfish API 来提供基于浏览器的控制台作为其 KVMIP 功能,则可以使用它来生成加载到浏览器容器中的 URL。这可能适用于 Dell[3] 和 Supermicro[4]。在其他情况下,需要一个完整的 Selenium 脚本,该脚本将 BMC 凭据输入到登录表单并导航到控制台。

对于厂商的可用驱动程序,初始优先级将是

HPE iLO

加载 /irc.html 页面以显示控制台。在 iLO 6 中,显示内联登录表单。在 iLO 5 中,显示“无效会话密钥”消息。Selenium 脚本可以处理此差异,并为 iLO 6 采用快速登录,并为 iLO 5 加载主登录页面。

Dell iDRAC

加载 /console 页面,显示登录页面。登录会加载虚拟控制台配置页面,该页面会立即触发一个弹出窗口,显示实际控制台。在 Chromium 应用模式下,弹出窗口会显示在顶部,因此可以使用 Selenium 对其进行脚本编写。

可能对 [3] 进行 POST 可以提供一次性凭据来构建直接加载弹出窗口 URL,需要进一步研究。

Supermicro

/redfish/v1/Managers/1/Oem/Supermicro/IKVM [4] 进行 Redfish GET 调用将返回直接指向 html5 控制台的临时 URL,可以用作初始浏览器加载页面。

会话管理

ironic-novncproxy 会话管理

Nova 为每个图形控制台会话实现了一个简单的 bearer token,并配置了过期时间。它有一个专用的 token 数据库表,并且 token 是 NoVNC URL 查询字符串的一部分,该字符串传递到 websocket。通过查找 token 条目来发现实例,该条目具有关联的实例。

不建议对 Ironic 采用这种方法,因为目标是避免数据模型更改。NoVNC 将所有查询参数传递到 websocket 的 URL,因此将能够包含一个节点 UUID 的查询参数,以及一个 token 的查询参数。token 和过期时间由驱动程序在节点 driver_internal_info 中设置,并借助 novnc 会话实用程序。当会话启动时,其他实用程序会验证 token。Nova 还具有一个选项,可以在 token 过期时终止现有会话。如果证明有必要,将来可以实现这一点。

浏览器控制台会话管理

BMC Web 界面有自己的会话超时,并且有可能这些会话超时与 Ironic 的控制台会话管理产生不良交互。理想情况下,正在运行的容器应该意识到新的 VNC 连接,并在建立连接之前延迟浏览器登录,然后在终止最后一个连接时注销。但是,初始实现可能需要更简单,要求用户在启用控制台后不久访问控制台。

备选方案

与其为所有驱动程序都使用中间浏览器容器,不如某些驱动程序可以将 novncproxy 直接连接到 BMC VNC 端点,具体而言

  • iDRAC 完全暴露一个可以通过 OEM 扩展管理的 VNC 端点

  • Supermicro 暴露一个不合规的 VNC 端点,如果支持合并此过时的 PR[5],则 NoVNC 可以支持它。

这不是建议的方法,因为它使只读支持更加困难,并且也使 nova-novncproxy 到 BMC VNC 端点的网络连接复杂化。

总体方法

之前曾提出过一个专用 API 和模型,这与 Nova 的实现非常接近。但在 PTG[2] 期间,决定这过于复杂,现有的串行控制台驱动程序和 API 接口足以提供此功能。

数据模型影响

无。所有状态都存储在节点的 driver_internal_info 中。NoVNC token 信息将一致地存储在所有图形控制台驱动程序中。此外,每个驱动程序将根据厂商特定的实现存储自己的状态。

状态机影响

REST API 影响

无,使用现有的控制台 API。

客户端 (CLI) 影响

“openstack baremetal” CLI

“openstacksdk”

RPC API 影响

驱动程序 API 影响

Nova 驱动程序影响

在 Ironic 驱动程序中实现 ComputeDriver.get_vnc_console 方法应该足以使用可用的图形控制台,就像使用任何其他 nova 驱动程序一样。这要求 Ironic 驱动程序提供实际的 VNC 主机和端口,而不是 NoVNC URL。Ironic 驱动程序可以直接读取 driver_internal_info 以获取 vnc_hostvnc_port 值。这些将成为内部 API 合同的一部分。

Ramdisk 影响

安全影响

这打开了一种获得正在运行的裸机特权访问的新方式,因此需要在所有级别进行考虑,包括

  • RFP 协议身份验证从 Nova 移植而来

  • 启动图形控制台会话的 bearer token 实现

  • 无头 VNC 容器的隔离

  • 任何只读模式的实现

  • 访问裸机 VNC/KVMIP 的凭据管理

  • 限制对基于浏览器控制台暴露的任何非控制台功能的访问

其他最终用户影响

Horizon 将在通过 Nova 管理裸机时显示图形控制台,但也有望修改 ironic-ui,以便在 Horizon 中为 Ironic 管理的节点显示图形控制台。

可扩展性影响

novncproxy 服务可以像 ironic-api 一样扩展为无状态服务,并且其资源使用量将很小。每个控制台会话都需要一个运行嵌入式浏览器的容器。每个容器将在运行它的主机上消耗大约以下资源

  • ~300MB 内存

  • 1 个 TCP 端口

  • 一些处理开销

性能影响

其他部署者影响

部署工具需要管理 novnc-proxy 服务和管理无头 VNC 容器的工具。

开发人员影响

实现

负责人

主要负责人

Steve Baker <sbaker@redhat.com>

其他贡献者

欢迎志愿者!

工作项

  • 将 novnc-proxy 从 Nova 移植到 Ironic 并调整为建议的模型

  • 编写 iDRAC 驱动程序和支持的实用程序

  • 在 devstack 中启动 novnc-proxy

  • 编写基于模板的驱动程序类,用于 iLO 驱动程序

  • 编写 iLO 驱动程序和相关的无头 VNC 服务器容器

  • 编写一个 devstack 适当的服务来管理无头 VNC 容器

  • 采纳上游 NoVNC 贡献以启用 Supermicro 变体

  • 修改 Nova 中的 ironic 驱动程序以启用图形控制台

  • 修改 ironic-ui 以显示图形控制台,就像 nova 实例一样

依赖项

测试

完整的单元测试覆盖率。使用模拟驱动程序的函数覆盖率。

供应商特定驱动程序的自动化集成测试将是一个有趣的挑战,可能需要从手动测试开始。

升级和向后兼容性

没有向后兼容性问题。升级工具需要管理新的 novnc-proxy 服务以及用于管理无头 VNC 容器的任何工具。

文档影响

需要记录以下内容

  • 启用和配置 novnc-proxy 的配置选项

  • 启动 novnc-proxy 的基础设施说明

  • 配置需要无头 VNC 容器管理组件的驱动程序的说明

  • 为节点启用特定驱动程序的先决条件

参考资料

[1] https://github.com/kelleyk/noVNC [2] https://etherpad.opendev.org/p/ironic-ptg-october-2024#L252 [3] https://developer.dell.com/apis/2978/versions/7.xx/openapi.yaml/paths/~1redfish~1v1~1Managers~1%7BManagerId%7D~1Oem~1Dell~1DelliDRACCardService~1Actions~1DelliDRACCardService.GetKVMSession/post [4] https://www.supermicro.com/manuals/other/redfish-user-guide-4-0/Content/general-content/bmc-configuration-examples.htm#ikvm [5] https://github.com/novnc/noVNC/pull/614