调整加密卷大小

https://blueprints.launchpad.net/cinder/+spec/sizing-encrypted-volumes

问题描述

如果您有一个未加密的卷并迁移到加密类型,则会失败,因为目标上没有足够的空间来容纳整个源卷。这是因为加密卷必须有一个头部,这会占用一些空间。

实际上,确切的损失空间量尚不清楚,它可能因 LUKSv1/LUKSv2 和 PLAIN dm-crypt 格式而异。它可能在 1-2 MB 左右,但我们以 GB 为单位分配空间。是否可以进行非常细粒度的空间分配可能取决于包含该卷的后端。但是,我们还需要为了会计目的(使用量、配额、费用等)保留千兆字节边界,因为这是每个人工具所期望的。

此外,驱动程序以不同的方式优化迁移,并且由于我们之前没有新的大小参数,因此无法轻松地将此信息传递到驱动程序中。

考虑到所有因素,我们可以有一个标志,指示如果重新类型化成功需要增加卷的大小,则可以这样做。 这样我们就不会在用户不知情的情况下进行操作——如果卷不合适,我们会失败,如果他们希望重新类型化成功,则允许他们重新类型化为新大小。

用例

这里的核心用例是在升级旧部署时,希望在升级后加密旧卷。

提议的变更

  • manager.py 将创建一个更大的目标卷,大小为 GB,如果标志 ‘allow-resize==on_demand’ 并且目标卷类型已加密。

  • 使用块设备时,驱动程序特定的方法 ‘_copy_volume_data’ 用于复制卷数据(即 LVM 仍将使用实际的 _migrate_volume_generic)。此方法将在卷迁移期间的 _before_volume_copy 之后调用。

  • RPC 次要版本,用于新参数 3.x - 将 allow_resize 添加到 retype 方法,并将 increase_size 添加到 migrate 方法。

  • 将一个新的可选字段“allow_resize”添加到 os-retype 操作。可能的值将是“on-demand”或“never”(与当前的“migration_policy”字段相同)。如果未指定,则默认值为“never”。

  • 将一个新的可选字段“increase_size”添加到 os-migrate 操作。操作员指定卷增长多少 GB(因此最终大小为当前大小 + increase_size)。

  • 将以下参数添加到 Python-cinderclient 的 retype 和 migrate 命令

    • Retype:新的标志 --allow-resize 指示如果重新类型化成功需要增加卷的大小,则可以这样做。

      Optional Arguments:
      --allow-resize <never|on-demand>
      Allow the volume to be increased in size during the retype if the system
      decides it is necessary. This argument is recommended when retyping to
      an encryption type.
      ...
      
    • Migration:允许在卷迁移期间指定新的大小。添加了新的可选参数 --increase-size'

      Optional Arguments:
      --increase-size [<size>] Number of GiBs to grow the volume during migration.
      This is recommended when migrating to an encrypted host.
      ...
      
  • 卷显示的实际大小将是卷的实际大小。

备选方案

保持一切不变,不允许这种迁移。为了帮助用户,在文档中添加一些解决方法(例如,备份卷,然后将卷恢复到更大的卷)。如上文问题描述中所述,不允许小于 1GB 的大小增加。

数据模型影响

REST API 影响

  • 微版本更新

  • 应将新参数传递给 retype 和 migrate 命令,如“拟议的更改”部分中所述。

安全影响

无。如果您被允许迁移,您应该能够增加大小,如果您被允许重新类型化,您应该能够 allow-resize。

通知影响

其他最终用户影响

性能影响

其他部署者影响

开发人员影响

实现

负责人

主要负责人

Sofia Enriquez <lsofia.enriquez@gmail.com>

工作项

  • 在 cinder 中实现新的逻辑

  • 在 python-cinderclient 中实现新的逻辑

  • 单元测试

  • Tempest 测试

依赖项

测试

单元测试和当前的基于 devstack 的作业不足以测试这些更改。至少应在 cinder_tempest_plugin/api/volume/admin/test_volume_retype.py 中添加两个测试

  1. 将未加密的卷重新类型化为 LUKS 类型。

  2. 将加密的 LUKS 卷重新类型化为常规类型。

文档影响

目前,我添加了一些文档说明,警告关于重新类型化未加密/加密卷。但是,这些说明应替换为正确的文档。

要删除的注释 - https://review.opendev.org/#/c/732988/ - https://review.opendev.org/#/c/745199/

参考资料