使用 Libvirt 存储池方法迁移 Libvirt 卷¶
https://blueprints.launchpad.net/nova/+spec/migrate-libvirt-volumes
目前,libvirt 驱动程序仅使用 SSH (rsync 或 scp) 来执行非共享存储上的冷迁移和调整大小。这需要在计算节点之间具有 SSH 权限,这存在许多问题。相反,我们可以使用 libvirt 存储池 API 中内置的方法来执行迁移。
注意:此提案需要 使用 libvirt 存储池 https://blueprints.launchpad.net/nova/+spec/use-libvirt-storage-pools
问题描述¶
主要问题是,当前 Nova libvirt 驱动程序需要在非共享存储上执行冷迁移和调整大小时,在计算节点之间使用 SSH 访问。这带来了一些问题
从安全角度来看,在计算节点之间提供 SSH 访问是不理想的。给予计算节点 SSH 访问权限可能会导致一个被攻陷的节点攻陷其他节点,并可能对云环境造成损害。
从设置角度来看,它增加了几个额外的步骤:系统管理员或他们的设置工具配置 libvirt 以使用源节点和目标节点之间的安全通信通道。例如,可以使用 TLS。他们还必须为每个计算节点生成一个密钥对,并将公钥上传到每个其他计算节点。
用例¶
部署者:这允许部署者无需设置计算节点之间的 SSH 访问权限,同时仍然支持非共享存储的调整大小和冷迁移,只要部署者使用新的 libvirt 存储池镜像后端即可。
提议的变更¶
如果部署者使用新的 libvirt 存储池镜像后端并启用了 [libvirt]vol_upload_migration 选项,则此蓝图中的功能将被使用。
在迁移时,将在目标节点存储池中创建一个新的卷,并使用 virStorageVolDownload 和 virStorageVolUpload 方法在计算节点之间流式传输磁盘的内容 (http://libvirt.org/html/libvirt-libvirt-storage.html#virStorageVolUpload)。
为了确保安全的迁移,应配置 libvirt 以使用它支持的各种形式的身份验证和加密,例如 Kerberos(通过 SASL – http://libvirt.org/auth.html)或 TLS 客户端证书 (http://libvirt.org/remote.html#Remote_libvirtd_configuration)。
为了启用挂起实例的迁移,将使用 virDomainSave() 来保存实例内存,而不是 virDomainManagedSave()。这将能够控制文件位置,以便可以在基于目录的存储池中创建它。这意味着您可以使用存储池 API 在冷迁移挂起实例期间上传和下载该数据
备选方案¶
要求共享存储用于冷迁移和调整大小:许多 OpenStack 用户希望能够在没有共享存储的情况下执行冷迁移和调整大小。
仅设置计算节点之间的 SSH 密钥:请参阅问题描述
在迁移期间临时配置 SSH 密钥:虽然这在某种程度上减轻了安全问题并消除了额外的设置步骤,但它仍然提供了一个计算节点容易受到攻击的窗口。使其安全化会更加困难,并且需要 Nova 能够安全地生成 SSH 密钥。
使用 rsync 守护程序:人们似乎反对要求使用 rsync 守护程序。此外,rsync 守护程序连接默认情况下无法加密,尽管可以通过 stunnel 运行。
数据模型影响¶
无。
REST API 影响¶
无。
安全影响¶
虽然此更改需要两个计算节点的 libvirt 守护程序相互连接,但此过程已经由实时迁移完成。虽然磁盘在传输时不再由 SSH 加密,但系统管理员可以简单地保护 libvirt 连接 (http://libvirt.org/auth.html)。Libvirt 支持使用 x509 客户端证书进行加密,以及 SASL 用于 GSSAPI/Kerberos 加密和身份验证。
通知影响¶
无。
其他最终用户影响¶
无。
性能影响¶
存在一些潜在的性能问题
rsync 可以压缩要传输的内容,尽管 nova 不使用此选项。但是,它默认情况下执行高效的稀疏处理。
Libvirt 不执行压缩或高效处理稀疏文件。已提交 libvirt 错误以请求更好的稀疏处理 https://bugzilla.redhat.com/show_bug.cgi?id=1282795
无论哪种情况,由于对源节点利用率的影响,不建议使用压缩。
当前的 rsync 实现将保持默认设置,直到解决 libvirt 性能问题为止。
其他部署者影响¶
为了使新方法有效,部署者必须在每个计算节点上启用 libvirt 守护程序以侦听远程 libvirt 连接(如果启用了实时迁移,则此操作已经完成)。如 安全影响 中所述,此类连接必须受到保护。
此外,需要启用配置选项:[libvirt]vol_upload_migration。这尤其重要,直到我们可以保证性能与当前的 SSH/rsync 功能相当(禁用时,我们将回退到当前的 SSH/rsync 基于的功能)。
开发人员影响¶
无。
实现¶
负责人¶
- 主要负责人
paul-carlton2
- 其他贡献者
无
工作项¶
在
migrate_disk_and_power_off方法中实现 virStorageVolUpload/virStorageVolDownload 代码,作为对现有调用libvirt_utils.copy_image的替代方案。后续:删除用于设置和拆除迁移的 SSH 实例(例如,用于共享存储检测)。这些可以很容易地以类似于实时迁移的方式完成(使用 pre_migrate_host 和 pre_migrate_dest 方法,而不是 SSHing)。
依赖项¶
测试¶
由于这只是更改了迁移的工作方式,因此可以简单地再次运行现有的迁移测试,并在使用 libvirt 存储池镜像后端设置的情况下启用 [libvirt]vol_upload_migration 配置选项。
启用这些代码路径并与正在创建的“最新”libvirt 测试一起工作。
文档影响¶
对于 OpenStack 安全指南,我们应该指出,新的功能可以用作替代方案,而不是在计算节点之间部署 SSH 访问权限,而是无需为计算节点配置 SSH 密钥,并提供保护远程 libvirtd 连接的说明。
在计算管理员指南中,我们应该提供有关如何启用远程 libvirtd 连接的说明(如 libvirt 实时迁移所需的),并指出这些连接需要按照安全指南进行保护。
由于这些文档中的大部分也适用于 libvirt 实时迁移,因此将说明放在“常规”部分并链接到 libvirt 冷迁移和 libvirt 实时迁移文档可能是有益的。