交互式基于 Web 的串行控制台¶
https://blueprints.launchpad.net/nova/+spec/serial-ports
此蓝图是关于通过 websocket 代理向 openstack 虚拟机暴露交互式基于 Web 的串行控制台。主要原因是 openstack 面临的串行控制台日志问题,这些日志难以维护,并且会无限增长等。 重点不是消除串行控制台日志,而是为用户提供除了记录到文件之外的另一种选择,并暴露一个交互式串行控制台。
问题描述¶
目前,串行控制台在日志记录方面存在未解决的问题,这些问题从一个发布周期跳到另一个发布周期,并且没有开发出合适的解决方案。 大多数问题在 juno 的串行控制台日志蓝图 https://review.openstack.org/#/c/80865/ 中得到了很好的总结,但是,该提案并不涉及向最终用户暴露交互式串行控制台。
提议的变更¶
此蓝图提出添加一项新服务 - serialproxy(websocket 代理),该服务将处理与串行控制台的 websocket 连接。websocket 代理可以部署在与 hypervisor 不同的机器上,因此 unix 域套接字行不通。 最佳方法是为每个串行控制台打开一个 TCP 套接字。 http://libvirt.org/formatdomain.html#elementsCharTCP 此服务将类似于 novncproxy,并以或多或少相同的方式扩展。
一个串行端口一次只能被一个用户访问,即它不能被复用,因为没有 hypervisor 具有与“connect”命令分离的“清除此行”命令(或者与原始“connect”调用集成的标志)。 多个用户访问同一串行端口的建议方案如下:如果用户已经连接,则拒绝第二个用户访问控制台的尝试,但提供一个 API 以强制断开现有的会话。 这对于处理挂起的会话特别重要,在这些会话中,客户端网络在控制台干净关闭之前消失了。
为了允许多个客户端连接到串行端口,我们需要在实例启动时创建端口,但我们需要提前知道需要创建的端口数量。 该数字可以通过镜像元数据中的属性传递,例如“serial_ports”。 由于串行端口通过 TCP 套接字暴露,我们还需要一个模块来测试空闲 TCP 端口并分配它们,以便 libvirt 驱动程序在创建串行端口时可以使用它们。 这应该是持久的,以便已经测试过的端口不会为新的串行端口再次测试。
备选方案¶
无
数据模型影响¶
无
REST API 影响¶
REST API 将具有一个额外的用于获取最终用户串行控制台 URL 或在仪表板中显示的额外方法。
V2 API 规范:POST: v2/{tenant_id}/servers/{server_id}/get-serial-console
V3 API 规范:POST: v3/servers/{server_id}/get-serial-console
请求参数
tenant_id:多租户云中租户或帐户的 ID。
server_id:要获取串行控制台的服务器的 UUID。
JSON 响应
{
"serial_console":
{
"url": "http://example.com:6083/serial.html?token=b40ac1c3-b640-4a6a-ae34-bf347ef089d6"
}
}
JSON schema 定义
serial_console = {
'type': 'object',
'properties': {
'serial_console': {
'type': ['object', 'null'],
'properties': {},
'additionalProperties': False,
},
},
'additionalProperties': False,
}
HTTP 响应代码:v2
正常 HTTP 响应代码:成功时为 200
v3
正常 HTTP 响应代码:成功时为 202
安全影响¶
在 hypervisor 节点中打开 TCP 端口可能会使任何人通过扫描开放端口来访问任何串行控制台,如果 port_range 配置参数中指定的端口对公众可见。 通常,hypervisor 端口不会对外暴露,因此这不会比 VNC 更好或更差。 VNC 的安全性正在通过一个蓝图来解决,该蓝图将在内部网络上为 VNC 添加强大的身份验证。 这不是阻止此串行控制台功能的理由。 我们可以稍后与 QEMU 社区合作,为它暴露的字符设备套接字获取 SSL 支持。
通知影响¶
无
其他最终用户影响¶
python-novaclient 将不得不实现一个新的命令。
命令:get-serial-console <server> <console-type>
参数 server:服务器的名称或 Id。
性能影响¶
使用串行控制台而不是图形控制台会更优化,因为它通过文本流与实例交互。
其他部署者影响¶
在 serial_console 组中添加的配置选项:[serial_console] - enabled (type=BoolOpt, default=False) - base_url (type=StrOpt, default=’http://127.0.0.1:6083/serial.html’) - listen (type=StrOpt, default=’0.0.0.0’) - proxyclient_address (type=StrOpt, default=’127.0.0.1’) - port_range (type=StrOpt, default=’10000:20000’) - record (type=BoolOpt, default=False) - daemon (type=BoolOpt, default=False) - ssl_only (type=BoolOpt, default=False) - source_is_ipv6 (type=BoolOpt, default=False) - cert (type=StrOpt, default=’self.pem’) - key (type=StrOpt) - web (type=StrOpt, default=’/usr/share/serialproxy-static’)
“enabled” 配置参数的默认值为 False,因此在合并此更改后无需考虑任何事情。
引入了一项新服务 - serialproxy,需要单独部署才能使此功能与 websocket 一起工作。 命令行参数将与 novnc 相同,这将覆盖配置文件中指定的某些配置参数。
开发人员影响¶
无
实现¶
负责人¶
- 主要负责人
Vladan Popovic
- 其他贡献者
Ian Wells Sushma Korati
工作项¶
Websocket 代理
在 nova 中添加一个配置参数,以启用基于 Web 的串行控制台,例如 enabled=True|False,其中 False 将是默认值。
配置 libvirt 以在 http://libvirt.org/formatdomain.html#elementsCharTCP 上打开 TCP 通道
添加一个端口分配器模块,该模块将生成/测试 TCP 端口并在找到空闲端口时将其分配给实例的 libvirt 配置。 这需要 nova 中的另一个配置参数,例如 port_range=10000:20000
在 libvirt 驱动程序中实现串行控制台配置生成和检索。
在计算管理器中添加一个用于获取串行控制台的方法。
在 consoleauth 中添加方法以授权令牌。
添加 API 调用以使用生成的 consoleauth 令牌获取串行控制台 URL。
添加一个 serialproxy 服务,该服务将作为串行控制台的 websocket 代理
添加将从代理服务器提供(如果可能,支持 SSL/TLS)的静态文件,包括终端模拟器,可能为 https://github.com/chjj/term.js/
依赖项¶
可能需要对 websocket 代理和终端模拟器的静态文件进行打包。
测试¶
单元测试足以覆盖 libvirt 和 API 部分。
文档影响¶
由于此提案引入了一个新的控制台和服务,因此至少应记录以下内容
部署 serialproxy(如果可能,支持 SSL/TLS)
镜像元数据中的更改(如果该解决方案适合多用户串行控制台的需求)
现在从 API 或 python-novaclient 获取串行控制台 URL
管理 port_range 中指定的端口的示例,以便它们只能从部署 serialproxy 的节点访问,而不能从外部访问。
参考资料¶
无