libvirt SPICE 直接控制台

https://blueprints.launchpad.net/nova/+spec/libvirt-spice-direct-consoles

本规范建议修改 Nova 的 libvirt 驱动程序,以支持“直接”SPICE VDI 控制台。这些控制台是“直接的”,因为它们不打算使用 HTML5 转码代理来访问,而是用户将使用原生 SPICE 客户端,如 remote-viewer。这种功能能够提供比 Nova 当前支持的更丰富的虚拟桌面体验,但只需对 Nova 进行相对较小的更改。还需要一个新的 Nova API 微版本来添加这种新的控制台类型。

虽然不建议将超visor上的 SPICE TCP 端口暴露到互联网上,但此功能允许 SPICE 协议原生代理将流量从用户引导到正确的超visor端口。为了确保超visor端口信息受到保护,它仅暴露给具有管理员权限的 API 调用者。

问题描述

SPICE 协议很早以前就已添加到 Nova 中,并且仍然是使用 Nova 进行远程桌面最丰富和性能最高的选择。但是,目前,Nova 的 HTML5 转码代理是访问这些 SPICE 控制台的唯一方法,并且 HTML5 界面不支持 SPICE 协议的许多新功能,也不太支持高分辨率桌面。

用例

作为开发人员,我不想让这些更改使 Nova 代码库变得更加复杂。 提出的更改相对集中 – 一个新的 API 微版本,两个额外的额外规范(用于声音和 USB 直通)以及相关的域 XML 生成代码和相关的测试。

作为部署者,我希望能够使用 OpenStack 为我的用户提供丰富的虚拟桌面。 此更改促进了此功能,但需要额外的部署步骤,例如为您的超visor设置 TLS 证书以及管理 SPICE 原生代理。有一个使用 Kolla-Ansible 的示例实现,但其他部署系统需要集成此功能才能使其普遍可用。

作为不希望使用丰富的桌面控制台的部署者,我不想让此功能使我的部署复杂化。 在禁用状态下,对部署的更改很小 – 例如,域 XML 中的额外 USB 直通设备和声音设备除非由相关的额外规范请求,否则都将被禁用。

作为最终用户,我希望能够访问比当前可用的更丰富的桌面体验。 一旦这些更改被集成并且部署了 SPICE 原生代理,Horizon 或 Skyline 的进一步更改将需要协调控制台访问。预计完整的端到端功能需要几个版本才能实现,然后才能提供完全无缝的体验。完全实施后,Horizon 和 Skyline 将能够为特定控制台提供一个 .vv 配置文件给客户端,然后客户端将能够无缝访问他们的虚拟桌面。但是,用户可以立即使用 openstack console url show 命令在我们的 Web 客户端之外创建控制台会话。

提议的变更

拟议的解决方案相对简单 – 添加一个 API 微版本,使其能够创建一个“spice-direct”控制台,并从 API 查找该控制台的连接详细信息。需要新的控制台类型和微版本,因为我们需要能够指定新的控制台类型,这是一个 API 模式更改。

get_spice_consolecreate 调用返回的响应,该调用请求“spice-direct”控制台,将返回一个从 CONF.spice.spice_direct_proxy_base_url 派生的 URL,并将包含控制台访问令牌。然后用户将请求此 URL,并且 SPICE 原生代理将通过 /os-console-auth-tokens/ API 从 nova 查找控制台连接详细信息。这些详细信息将用于生成 virt-viewer .vv` 配置文件,然后用户可以使用它来访问代理的 SPICE 控制台。

由于从 /os-console-auth-tokens/ 返回的响应包括 SPICE 控制台在超visor上运行的主机和端口,因此一致认为这些 API 方法应该具有受限的可访问性。但是,这是一个预先存在的 API,应该已经如此。这可以防止敏感的网络配置信息提供给不太受信任的用户。

本规范还涵盖了对 libvirt 域 XML 的调整,以丰富此类直接控制台提供的桌面体验,例如

  • 通过额外规范可配置的 usbredir 支持从客户端到客户机的 USB 设备直通(WIP 实现位于 I791b16c5bf0e860a188783c863e95dc423998b0a)

  • 通过额外规范指定声音设备的声音支持(WIP 实现位于 I2faeda0fd0fb9c8894d69558a1ccaab8da9f6a1b)

请注意,允许来自多个用户的并发控制台访问在技术上是可行的,但 Nova 的策略禁止直接操作 qemu` 命令行。有关该问题的讨论,请参阅 I65f94771abdc1a6ef54637ea81f25ce1daaf4963。

拟议的更改允许从 SPICE 原生客户端(如 remote-viewer)直接连接到 SPICE 控制台。在没有其他软件的情况下,这意味着这样的客户端将具有到托管实例的超visor上相对任意 TCP 端口的网络连接。但是,现在存在 SPICE 协议原生代理,并且与此提案并行,提出了将其添加到 Kolla-Ansible 的支持。该代理称为 Kerbside,更多详细信息可在 https://github.com/shakenfist/kerbside 上找到。也就是说,部署了代理后,Nova 超visor的网络暴露实际上没有变化。

实施后,用户可以获取 Kerbside 连接 URL,如下所示

` openstack console url show --spice-direct 52b2e44e-e561-464c-88f3-2fc6a1ecea2b +----------+------------------------------------------------------------------+ | Field    | Value                                                            | +----------+------------------------------------------------------------------+ | protocol | spice                                                            | | type     | spice-direct                                                     | | url     | http://127.0.0.1:13002/nova?token=bf2e6883-...                   | +----------+------------------------------------------------------------------+ `

然后用户获取该 URL,Kerbside 提供一个包含 SPICE 客户端连接信息的 .vv` 文件。Kerbside 使用对 /os-console-auth-tokens/bf2e6883-… 的调用来确定控制台身份验证令牌的有效性以及控制台的连接信息。

备选方案

不幸的是,SPICE HTML5 代理无法满足许多远程桌面用户的需求。实际上,OpenStack 目前没有一种为这些丰富的桌面控制台提供给用户的方式。相反,Citrix 等其他系统用于此功能。

数据模型影响

控制台身份验证令牌表需要添加一个额外的列,以便可以跟踪 TLS 端口以及未加密的端口。此更改很小,部署者应该不难支持,因为鉴于身份验证令牌已经过期,此表不应该特别大。

REST API 影响

本规范添加了一种新的控制台类型“spice-direct”,它提供了与超visor上的 qemu 直接通信所需的原生 SPICE 协议的连接信息。这旨在由一个代理前端处理身份验证。

引入了一个新的微版本,它将类型“spice-direct”添加到现有的“spice”协议。

这意味着 create 控制台调用的 JSON 模式将更改为如下所示

create_v297 = {
    'type': 'object',
    'properties': {
        'remote_console': {
            'type': 'object',
            'properties': {
                'protocol': {
                    'type': 'string',
                    'enum': ['vnc', 'spice', 'rdp', 'serial', 'mks'],
                },
                'type': {
                    'type': 'string',
                    'enum': ['novnc', 'xvpvnc', 'spice-html5',
                             'spice-direct', 'serial', 'webmks'],
                },
            },
            'required': ['protocol', 'type'],
            'additionalProperties': False,
        },
    },
    'required': ['remote_console'],
    'additionalProperties': False,
}

并且 get_spice_console 的 JSON 模式将更改为如下所示

get_spice_console_v297 = {
    'type': 'object',
    'properties': {
        'os-getSPICEConsole': {
            'type': 'object',
            'properties': {
                'type': {
                    'type': 'string',
                    'enum': ['spice-html5', 'spice-direct'],
                },
            },
            'required': ['type'],
            'additionalProperties': False,
        },
    },
    'required': ['os-getSPICEConsole'],
    'additionalProperties': False,
}

还需要调整从 /os-console-auth-tokens/ 返回的响应,以便在配置了控制台的 TLS 端口时返回 TLS 端口,这将需要响应模式更改。

安全影响

本提案具有中等安全影响。虽然超visor 主机/端口详细信息仅会暴露给具有 service 角色或 admin 权限的请求者,但 Kerbside 需要具有到云中超visor上 SPICE TCP 端口的网络连接。但是,Kerbside 为这些 TCP 端口提供保护层,并且不打算将此信息提供给不太受信任的请求者。

通知影响

无。

其他最终用户影响

无。

性能影响

无。

其他部署者影响

如上所述,完整的实施需要部署系统集成 Kerbside SPICE 代理,以及对 Horizon 和 Skyline 等前端的修改,以通过 Kerbside 协调控制台。但是,这些超出了 Nova 规范的范围。

拟议的更改添加了以下配置选项

  • spice.spice_direct_proxy_base_url:默认为实际上对于非平凡安装不起作用的示例 URL(就像 HTML5 转码代理一样)。这是 Nova 分发的 Kerbside URL 的基本 URL。

  • spice.require_secure:默认为 False,当前的硬编码默认值。是否需要安全的 TLS 连接到 SPICE 控制台。如果您正在提供对 SPICE 控制台的直接访问而不是使用 HTML5 代理,您可能希望这些连接被加密。如果是这样,请将此值设置为 True。请注意,使用安全的控制台需要在每个超visor上设置 TLS 证书。

将添加以下额外的镜像属性

  • hw_audio_model:默认为 None,当前的硬编码默认值。是否在启用 SPICE 控制台时包含声音设备,如果是,则是什么类型。

  • hw_usb_model:默认为 None,当前的硬编码默认值。如果配置了 hw_redirected_usb_ports,则这是必需的。

  • hw_redirected_usb_ports:默认为 None,当前的硬编码默认值。如果配置了,这将指定在实例域 XML 中创建的 usbredir 设备的数量。

开发人员影响

无。

升级影响

无。

实现

负责人

主要负责人

mikal

其他贡献者

功能联络人

需要联络人。

工作项

所有代码当前都已提请 Gerrit 进行审核。

依赖项

无。

测试

在 gate 中测试图形用户界面很困难。但是,将添加 API 微版本测试,并且原型上的控制台功能进行了手动测试,并且将在补丁着陆时重新进行测试。

文档影响

操作员指南需要更新,以涵盖新的功能和配置选项。最终用户指南需要更新,以解释在功能完全集成后的使用方法。

参考资料

无。

历史

修订版

发布名称

描述

2024.2 达尔马提安

引入

2025.1 Epoxy

已更新并重新提出