Nova 兼容的串口控制台

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

此方案使用“socat”实现控制台接口,从而提供 Nova 兼容的串口控制台功能。

问题描述

目前,Ironic 的唯一控制台接口基于 shellinabox,它提供了一个独立的 Web 控制台,并且与 nova-serialproxy 不兼容。

提议的变更

为了解决没有与 Nova 兼容的串口控制台的问题,此规范建议使用命令行工具 socat [1] 结合 IPMI Serial-Over-Lan 功能。socat 是一个基于命令行的实用程序,它建立两个双向字节流并在它们之间传输数据。此应用程序允许我们激活 ipmitool Serial-over-LAN 进程并通过 TCP 连接重定向它,然后该连接可以被 nova-serialproxy 服务消费。

每个控制台(socat + ipmitool)将在同一主机上运行自己的进程,该主机当前正在管理该节点的 ironic-conductor 正在运行。socat 将首先运行,然后在从 nova-serialproxy 收到连接后执行 ipmitool,并充当它们之间的 桥接

ironic-conductor 进程的启动/停止

  • 当 ironic-conductor 启动时,如果节点的控制台模式为 true,则启动 socat。

  • 当 ironic-conductor 停止时,如果控制台已启动,则停止它。

  • 关于接管工作,我们正在计划

    • 当 ironic-conductor 停止时,由于安全原因,控制台会话将被停止。在这种情况下,如果有其他 ironic-conductors,它们将接管节点并再次启用它们的控制台会话。

    • 当 ironic-conductor 启动时,如果有启用了控制台的节点,则 ironic-conductor 将启动它们的控制台。

  • 控制台的启动/停止将使用 subprocess.Popen 实现。

  • 关于启动/停止 socat,我们计划实现一个新的控制台接口 IPMISocatConsole 并实现与 shellinabox 类相同的方法。关于此,讨论在:[2]

  • 关于重新连接,例如,在使用 Horizon 时出现临时网络问题,将显示“已关闭”消息。并且 socat 本身支持客户端侧的会话重新连接,因此,当网络问题解决后,用户可以尝试重新连接。

指定使用 shellinabox 还是 socat

我们计划通过设置驱动程序(例如 pxe_ipmitool_socatagent_ipmitool_socat)来指定使用哪个驱动程序 shellinabox 或 socat。(请参阅 其他 部署器 影响 部分。)

备选方案

不将新的 ConsoleInterface 添加到 ironic-conductor,而是创建一个新的服务“ironic-xxx”。新服务的优点是可以独立扩展,并且对 conductor 故障转移没有影响。但是,它也需要自己的 HA 模型,并且对开发人员来说会更多的工作(API、DB、驱动程序……)。

数据模型影响

状态机影响

REST API 影响

“GET /v1/nodes/<UUID>/states/console”的响应体包含如下 JSON 对象

{
  "console_enabled": true,
  "console_info": {
    "url": <url>,
    "type": <type>
  }
}

在使用的 socat 而不是 shellinabox 的情况下,<type> 将为“socat”,<url> 类似于“tcp://<host>:<port>”。

客户端 (CLI) 影响

RPC API 影响

驱动程序 API 影响

Nova 驱动程序影响

get_serial_console() 将在 Nova 的 ironic 驱动程序中实现。它返回一个字典,类似于 nova.virt.libvirt.driver.LibvirtDriver.get_serial_console()。对 Nova 没有其他影响,nova-serialproxy 可以很好地与新的驱动程序配合使用。并且,Nova 也同意了 Nova 方面的这项工作 [3]

Ramdisk 影响

安全影响

nova-serialproxy 和 socat 之间的连接是基于 TCP 的,就像 KVM 一样。Socat 支持 OpenSSL 连接,因此我们可以在未来提高安全性。

其他最终用户影响

可扩展性影响

如果一个 conductor 可以服务 1000 个节点,并且为每个节点创建一个进程,但它与 shellinabox 相同的问题。

性能影响

其他部署者影响

要使用 socat 串口控制台,部署程序需要指定新的驱动程序。例如,要使用 PXE + IPMItool + socat,请指定 pxe_ipmitool_socat。要使用 IPA + IPMItool + socat,请指定 agent_ipmitool_socat。要使用现有的 shellinabox 控制台,部署程序无需更改任何内容。新的控制台接口 IPMISocatConsole 将由两个新的驱动程序支持:pxe_ipmitool_socatagent_ipmitool_socat。在 驱动程序 组合 重构 [4] 实现后,此功能将适用于更多的驱动程序(或硬件类型)。

关于配置选项,现有的选项 terminal_pid_dirsubprocess_checking_intervalsubprocess_timeout 以与 shellinabox 相同的方式对 socat 可用。terminal_cert_dir 在 socat 的情况下不使用,因为不支持 SSL。terminal 在 socat 的情况下不使用,因为代码中使用了硬编码的 socat,并且不需要绝对路径,因为它特定于发行版,例如在 Ubuntu 中是 /usr/bin/socat,但在其他发行版中可能不同。

开发人员影响

实现

负责人

主要负责人

其他贡献者

工作项

  • 实现 IPMISocatConsoleNativeIPMISocatConsole 类,从 base.ConsoleInterface 继承。

依赖项

测试

将添加单元测试。

升级和向后兼容性

文档影响

将配置描述添加到安装指南中。

参考资料