VNC 图形控制台

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

除了串口控制台之外,允许通过图形控制台访问 ironic 节点。本提案介绍了创建用于访问节点图形控制台的新驱动程序接口所需的工作。

注意

此规范已退役。这是基于社区对设计多个方面的共识做出的决定。主要原因是现有的控制台接口可以同时服务于串口控制台和图形控制台,而无需引入另一个不同的接口,从而避免了额外的开销和操作员的困惑。从次要方面来看,自此特性设计以来,串口控制台的使用和交互已经变得不那么流行,这部分是由于转向 UEFI 固件以及现代硬件中串口的整体建模,作为由 CPU 中断触发的主要输出,这可能会对正在运行的工作负载产生不利的性能影响。

问题描述

最终用户经常需要排查他们的实例,因为他们可能破坏了启动配置或使用防火墙把自己锁定了。键盘-视频-鼠标 (KVM) 访问通常是解决这些类型问题的必需条件,因为串口访问并非总是可用或正确配置。此外,与串口控制台相比,KVM 提供了更好的用户体验。

目前,ironic 没有暴露节点的 KVM 功能。因此,管理员和部署者必须找到替代方案来为他们的用户提供 KVM 访问权限。此外,Horizon 的 VNC 控制台不支持由 Nova 调配的 ironic 节点。

提议的变更

  • 将添加一个新的接口 GraphicalConsoleInterface。该接口将基本上与当前的 ConsoleInterface 接口具有相同的类 API(具有 start_consolestop_consoleget_console 方法),但可以独立于串口访问启用/禁用/配置它。与其他 ironic 驱动程序接口和硬件类型一样,操作员可以通过将其设置为相应硬件类型实现中启用和支持的实现来自由选择要使用的图形控制台访问实现。新接口将具有以下方法

    class GraphicalConsoleInterface(BaseInterface):
        """Interface for graphical console-related actions."""
        interface_type = "graphical_console"
    
        @abc.abstractmethod
        def start_console(self, task):
            """Start a remote graphical console for the task's node.
    
            This method should not raise an exception if console already started.
    
            :param task: a TaskManager instance containing the node to act on.
            """
    
        @abc.abstractmethod
        def stop_console(self, task):
            """Stop the remote graphical console session for the task's node.
    
            :param task: a TaskManager instance containing the node to act on.
            """
    
        @abc.abstractmethod
        def get_console(self, task):
            """Get connection information about the graphical console.
    
            This method should return the necessary information for the
            client to access the graphical console.
    
            :param task: a TaskManager instance containing the node to act on.
            :returns: the graphical console connection information.
            """
    
  • 将创建以下新的硬件接口实现 GraphicalConsoleInterface

    • ipmitool-vnc - 使用 VNC 访问图形控制台。

    • no-graphical-console - 没有图形控制台。

    • fake - 用于测试的假图形控制台。

  • 将为该接口引入新的配置选项,如下所示

    • [DEFAULT]enabled_graphical_console_interfaces - 此配置选项表示 ironic 中启用的图形控制台接口列表。默认值为 ['no-graphical-console']

    • [DEFAULT]default_graphical_console_interface - 此配置选项表示要与各种驱动程序一起使用的默认图形控制台接口。默认值将为 no-graphical-console

  • 将向 Node 对象添加两个新字段

    • graphical_console_interface - 此字段表示节点的受支持的图形控制台接口。

    • graphical_console_enabled - 此字段将是一个布尔值,表示控制台的状态。它将在请求启动图形控制台时设置为 True。

  • 在节点取消调配时,Ironic 将停止所有到该节点的图形连接。

备选方案

  • 接受此限制并仅提供串口控制台。

  • 使用管理员提供的带外 KVM 访问,无需 Ironic 支持。

  • 推广和形式化 console 接口的概念,并允许对特定节点激活和启用任意数量的控制台接口(从硬件类型声明为受支持的接口)。

数据模型影响

  • 在升级/转换期间,新的节点字段 graphical_console_enabled 将从配置选项 default_graphical_console_interface(默认值为 no-graphical-console)填充。

  • 将添加新的节点字段 graphical_console_interface

状态机影响

无。

REST API 影响

  • GET /v1/nodes/{node_ident}/states/consolePUT /v1/nodes/{node_ident}/states/console API 添加一个新的可选 console_type 参数。此参数定义了 Ironic 用户想要访问的控制台类型。默认值为 serial。可能的值如下

    • serial - 用于访问串口控制台。

    • graphical - 用于访问图形控制台。

    此参数将包含在查询字符串中。

示例

GET /v1/nodes/{node_ident}/states/console?console_type=graphical

响应将与控制台接口相同。如果用户提供无效的 console_type,将返回一个新的 400 HTTP 响应。

需要增加 API 微版本。

客户端 (CLI) 影响

  • 将向 OSC 命令 openstack baremetal node console enableopenstack baremetal node console disable 添加一个新的选项 --type

  • 将向 OSC 命令 openstack baremetal node console show 添加一个新的选项 --type

RPC API 影响

  • get_console_information 添加一个新的 console_type 参数

  • set_console_mode 添加一个新的 console_type 参数

需要增加 RPC API 微版本。

驱动程序 API 影响

  • 新的 GraphicalConsoleInterface 将包含在标准化的接口组中。它不是一个强制接口。

Nova 驱动程序影响

Nova 的影响在 Nova 驱动程序的 VNC 控制台支持 [1] Nova 蓝图中有完整描述。

本质上,Ironic virt 驱动程序将不得不实现 get_vnc_console 并使用 graphical 类型调用 Ironic 的 get/set-console-mode。

根据 Nova 中的策略,在 ironic 和 python-ironicclient 的更改着陆之前,更改无法着陆。Nova 方面的更改非常简单。

Ramdisk 影响

无。

安全影响

  • VNC 连接到节点由在 Nova 中创建控制台时生成的令牌保护。

  • 对于独立的 Ironic 部署,这将返回一个 URL,用户可以直接连接到它。连接到裸机节点将不安全。

其他最终用户影响

  • 每个控制台(特别是 VNC 控制台)的最大连接数是特定于实现的。有些服务器能够处理多个连接,而另一些则不能。

可扩展性影响

  • 如上一节所述,连接数因硬件而异。

  • TODO(mkrai):更新导体可以处理的连接数,以解决 PS7 上的 Ruby 的评论。

性能影响

无。

其他部署者影响

  • 添加 enabled_graphical_console_interfaces 配置选项。

  • 添加 default_graphical_console_interface 配置选项。

开发人员影响

驱动程序开发人员现在可以提供多个控制台接口,而不是坚持使用单个接口。这实际上更符合服务器通常提供串行端口访问以及键盘-视频-鼠标访问的现实。

实现

负责人

主要负责人
  • mkrai

其他贡献者
  • anupn

工作项

  • 引入 ipmitool.IPMIVNCConsole(BaseInterface)

  • 向控制台 REST API 添加 console_type 支持。

  • 向 RPC 方法添加 console_type 支持。

  • 向 OSC 插件添加 console_type 支持。

  • 为 VirtualBMC 添加图形控制台支持

  • 在 devstack 中实现基本的启用-禁用 + 连接测试

  • 更新文档以说明如何使用图形控制台

依赖项

无。

测试

  • 单元测试

  • 使用基本启用-禁用连接测试对 ipmitool.IPMIVNCConsole 进行 CI 测试。

  • 为 gate 测试添加对 virtual BMC 中图形控制台支持的支持。

升级和向后兼容性

将确保与 Nova 的兼容性。较新的 Nova 在与较旧的 ironic 运行时将继续表现为当前的行为。较新的 ironic 将暴露 Nova 根本不会使用的功能。

通过 RPC 版本确保 ironic 内部的向后兼容性。特别注意确保即使未切换到新的硬件类型,旧的驱动程序仍然兼容,因为代码将专门处理未切换到新硬件类型的驱动程序。将添加涵盖这部分的特定测试。最后,通过 REST API 微版本确保与旧的 API 客户端的兼容性。

文档影响

  • 将更新文档。

参考资料