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_console 或 create 调用返回的响应,该调用请求“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 |
已更新并重新提出 |