图形控制台支持¶
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-onesingleprocess启动器中的可能性。将
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_host 和 vnc_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