libvirt SPICE 直接控制台¶
https://blueprints.launchpad.net/nova/+spec/libvirt-spice-direct-consoles
本规范建议修改 Nova 的 libvirt 驱动程序,以支持“直接”SPICE VDI 控制台。这些控制台是“直接的”,因为它们不打算使用 HTML5 转码代理来访问,而是用户将使用原生 SPICE 客户端,如 remote-viewer。这种功能能够提供比 Nova 当前支持的更丰富的虚拟桌面体验,但只需对 Nova 进行相对较小的更改。还需要一个新的 Nova API 微版本,以便这些控制台的用户可以查找控制台的连接详细信息。
问题描述¶
SPICE 协议很早以前就已添加到 Nova 中,并且仍然是使用 Nova 进行远程桌面最丰富和性能最高的选项。但是,目前,Nova 的 HTML5 转码代理是访问这些 SPICE 控制台的唯一方式,并且 HTML5 界面不支持 SPICE 协议的许多新功能,也不太支持高分辨率桌面。
用例¶
作为开发者,我不想让这些更改使 Nova 代码库变得更加复杂。 提出的更改相对集中——一个新的 API 微版本、对域 XML 生成代码的一些可选更改以及相关的测试。
作为部署者,我希望能够使用 OpenStack 为我的用户提供丰富的虚拟桌面。 此更改促进了此功能,但需要额外的部署步骤,例如为您的 hypervisor 设置 TLS 证书以及管理 SPICE 原生代理。有一个使用 Kolla-Ansible 的示例实现,但其他部署系统需要集成此功能才能使其普遍可用。
作为不希望使用丰富的桌面控制台的部署者,我不想让此功能使我的部署复杂化。 在禁用状态下,对部署的更改很小——例如,域 XML 中的额外的 USB 直通设备和声音设备都是部署者可配置的并且可以禁用。
作为最终用户,我希望能够访问比当前可用的更丰富的桌面体验。 一旦这些更改被集成并 Kerbside 部署,Horizon 或 Skyline 的进一步更改将需要协调通过 Kerbside 访问控制台。预计完整的端到端功能需要几个版本才能实现,然后才能提供完全无缝的体验。完全实施后,Horizon 和 Skyline 将能够为特定控制台提供一个 .vv 配置文件给客户端,然后客户端将能够无缝访问其虚拟桌面。但是,用户可以立即使用 openstack console url show 命令在我们的 Web 客户端之外创建控制台会话。
提议的变更¶
拟议的解决方案相对简单——添加一个 API 微版本,使创建“spice-direct”控制台成为可能,并从 API 查找该控制台的连接详细信息。由于我们需要能够指定新的控制台类型,而这是一种 API 模式更改,因此需要新的控制台类型和微版本。
从请求“spice-direct”控制台的 get_spice_console 或 create 调用返回的响应将返回一个源自 CONF.spice.kerbside_base_url 的 URL,并将包含控制台访问令牌。然后用户将请求此 URL,Kerbside 将通过 /os-console-auth-tokens/ API 从 nova 查找控制台连接详细信息。这些详细信息将用于生成 virt-viewer still .vv 配置文件,然后用户可以使用它来访问代理的 SPICE 控制台。
由于从 /os-console-auth-tokens/ 返回的响应包括 hypervisor 上 SPICE 控制台正在运行的主机和端口,因此一致认为这些 API 方法应该具有受限的可访问性。但是,这是一个预先存在的 API,应该已经如此。这可以保护敏感的网络配置信息,防止提供给不太受信任的用户。
本规范还涵盖了对 libvirt 域 XML 的调整,以丰富此类直接控制台提供的桌面体验,例如
需要加密连接(WIP 实现于 Ica7083b0836f8d66cad8a4b4097613103fc91560)
允许 SPICE 支持的并发用户(WIP 实现于 I65f94771abdc1a6ef54637ea81f25ce1daaf4963)
从客户端到客户机的 USB 设备直通(WIP 实现于 I0cbd28be272991f95c8fb9d76ee65b2b99a8bcf1)
声音支持(WIP 实现于 I4c98a0d6307c5e331df5caea80cb760512370058)
拟议的更改允许从 SPICE 原生客户端(如 remote-viewer)直接连接到 SPICE 控制台。在没有其他软件的情况下,这意味着此类客户端将具有到托管实例的 hypervisor 上相对任意 TCP 端口的网络连接。但是,现在存在 SPICE 协议原生代理,并且与此提案并行,提出了将其添加到 Kolla-Ansible 的支持。该代理称为 Kerbside,更多详细信息可在 https://github.com/shakenfist/kerbside 上找到。也就是说,部署了代理后,Nova hypervisor 的网络暴露实际上没有变化。
作为原型化此功能的的一部分,开发了一系列 Nova 的补丁。它们可在 https://github.com/shakenfist/kerbside-patches/tree/develop/nova 以及 gerrit 上 https://review.opendev.org/q/topic:%22kerbside-spice-direct-consoles%22 上找到。
它们是
允许 Nova 通过 SPICE 配置组中的一个新的 require_secure 配置选项来要求安全的 SPICE 连接。
添加一个 API 微版本以暴露“spice-direct”控制台类型。
允许并发连接到 SPICE 控制台,以便人们可以共享控制台会话。
支持 USB 直通。
可选地在 qemu 中启用 SPICE 调试。
添加一个声音设备,以便控制台可以进行音频。这将通过一个
添加 Nova 对 Kerbside API 客户端库的可选依赖项,以便 Nova 可以获取控制台连接详细信息以代理给请求用户。
实施后,用户可以像这样获取 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”,它提供了将直接与 hypervisor 上的 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 端口,这将需要响应模式更改。
安全影响¶
本提案具有中等安全影响。虽然 hypervisor 主机/端口详细信息仅会暴露给具有 service 角色或 admin 权限的请求者,但 Kerbside 需要具有到云中 hypervisor 上 SPICE TCP 端口的网络连接。但是,Kerbside 为这些 TCP 端口提供保护层,并且不打算将此信息提供给不太受信任的请求者。
通知影响¶
无。
其他最终用户影响¶
无。
性能影响¶
无。
其他部署者影响¶
如上所述,完整的实施需要部署系统集成 Kerbside SPICE 代理,以及对 Horizon 和 Skyline 等前端的修改,以通过 Kerbside 协调控制台。但是,这些超出了 Nova 规范的范围。
拟议的更改添加了以下配置选项
spice.kerbside_base_url:默认为实际上对于非平凡安装不起作用的示例 URL(就像 HTML5 转码代理一样)。这是 Nova 发出的 Kerbside URL 的基本 URL。
spice.require_secure:默认为 False,当前的硬编码默认值。是否需要安全的 TLS 连接到 SPICE 控制台。如果您正在提供对 SPICE 控制台的直接访问而不是使用 HTML5 代理,您可能希望这些连接被加密。如果是这样,请将此值设置为 True。请注意,使用安全的控制台需要在每个 hypervisor 上设置 TLS 证书。
spice.allow_concurrent:默认为 False,当前的硬编码默认值。是否允许并发访问 SPICE 控制台。SPICE 支持多个用户同时访问同一个控制台,但第二个和后续用户的某些功能会受到限制。将此选项设置为 True 以启用对 SPICE 控制台的并发访问。
spice.debug_logging:默认为 False,当前的硬编码默认值。是否向 qemu 日志发出 SPICE 调试日志。这些调试日志很详细,但可以帮助诊断一些连接问题。
将添加以下额外的镜像属性
hw_audio_model:默认为 None,当前的硬编码默认值。是否在启用 SPICE 控制台时为实例包含声音设备,如果是,则是什么类型。
此外,如果启用了 SPICE 控制台,则将在客户机中创建 USB 直通设备。如果客户端无法使用 USB 直通,则这些设备是无害的。
开发人员影响¶
无。
升级影响¶
无。
实现¶
负责人¶
- 主要负责人
mikal
- 其他贡献者
无
功能联络人¶
需要联络人。
工作项¶
按照此处指定的顺序将补丁着陆到 https://github.com/shakenfist/kerbside-patches/tree/develop/nova,并根据 Nova 团队在代码审查期间提出的任何修改。
依赖项¶
无。
测试¶
在 gate 中测试图形用户界面很困难。但是,将添加一个 API 微版本测试,并且原型上的控制台功能进行了手动测试,并将随着补丁的着陆而重新进行测试。
文档影响¶
操作员指南需要更新,以涵盖新的功能和配置选项。最终用户指南需要更新,以解释在完全集成功能后如何使用它。
参考资料¶
无。
历史¶
发布名称 |
描述 |
|---|---|
2024.2 达尔马提安 |
引入 |