支持没有本地临时磁盘的 flavor

https://blueprints.launchpad.net/nova/+spec/flavor-root-disk-none

此特性增加了定义 flavor 的可能性,该 flavor 不会在 hypervisor 上本地创建任何临时磁盘。建议添加一个新的 flavor 键 local_disks。如果 local_disks 设置为 False,则不会创建 hypervisor 本地根磁盘或任何其他本地临时磁盘。需要创建一个可启动的卷才能从该 flavor 启动实例。所有其他附加磁盘也只能基于卷。

问题描述

目前没有办法强制根磁盘位于 cinder 上,并且完全没有 hypervisor 本地临时磁盘。将 root_gb 设置为 0 默认会创建一个大小等于 glance 镜像的临时根磁盘。

我们不希望在 hypervisor 上本地拥有临时磁盘;既不在本地文件系统上,也不在挂载到 /var/lib/nova/instances 的共享存储上。随着这些共享存储的增长,它们变得难以维护,性能也会下降。将临时根磁盘存储在 hypervisor 的本地文件系统上也不是一个好主意,因为根磁盘上的用户数据通常无法简单地删除。将更多或更少的块设备都放在 cinder 卷中,为我们提供了维护实例块存储和实例本身的独特而灵活的功能集。

用例

最终用户的用例是不在 hypervisor 上意外创建临时(根)磁盘。从禁用本地磁盘的 flavor 启动实例时,用户将被告知需要创建一个可启动的卷才能使用该卷启动实例。该卷可以是现有的卷,也可以是在实例启动请求期间通过 block-device 参数创建的新卷。最终用户无需担心磁盘放置;这会影响实例迁移、数据持久性/丢失和/或共享存储性能。

部署者的用例是能够防止客户在 hypervisor 上创建临时(根)磁盘。部署者无需过多担心本地 HV 文件系统的大小,也不需要为 /var/lib/nova/instances 创建一个大型共享存储,该共享存储挂载到所有 hypervisor 上。随着该共享存储的增长,它变得难以维护,性能也会下降。他们不必处理存储在本地 hypervisor FS 上的临时磁盘上的客户数据丢失问题,以防 hypervisor 发生故障。

提议的变更

变更范围

  • API 中的新的 flavor 键 local_disks

  • flavors 表中新的布尔列 local_disks

  • local_disks 的默认值为 True

  • 旧的 microversions 在 local_disks=False 时,会为 root_gbephemeral_gbswap_gb 显示值 0

  • 新的 microversions 在 local_disks=False 时,不会返回 root_gbephemeral_gbswap_gb

  • 如果给定 local_disks=Falseroot_gbephemeral_gbswap_gb 是可选的

  • 如果给定 local_disks=Falseroot_gbephemeral_gbswap_gb 会自动设置为 0,给定的值将被忽略

  • 如果省略 local_disks 或设置为 True,root_gb 再次成为必需项

  • 当 flavor 创建请求带有 local_disks=Falseroot_gb > 0 和/或 emphemeral_gb > 0 和/或 swap_gb > 0 时,会发生错误

  • 当 flavor 带有 local_disks=False 且请求的镜像大于给定的 blockdevice 布局时,返回描述性异常

  • 当 flavor 带有 local_disks=False 且给定的 block_device 参数包含 dest_type ‘local’ 时,返回描述性异常

  • 当从 flavor 带有 local_disks=True 调整实例大小到 flavor 带有 local_disks=False 时,返回描述性异常

  • 调整 API 文档以包含 local_disks 键的详细描述

  • config-drive 不会受到此更改的影响,config-drive 仍然会驻留在本地 HV 磁盘上,就像 libvirt.xml 和 console.log 一样

备选方案

另一种方法是始终使用附加的 block_device 参数和 dest_type ‘volume’ 启动实例,以确保(根)磁盘位于 cinder 卷上,并且不会创建 hypervisor 本地临时磁盘。但这有一个缺点,即有人可能会忘记它,并且临时磁盘会在 HV 上本地创建。没有办法强制用户不在 hypervisor 上创建临时根磁盘。

数据模型影响

  • 在 flavor 表中创建新的列 local_disks 类型为布尔值(默认值为 True)

REST API 影响

  • 引入新的 API microversion,该版本允许将 ‘None’ 作为磁盘值

  • POST v2.1/<tenant_id>/flavors

{
    "flavor": {
        "name": "flavor_without_local_ephemeral_disks",
        "ram": 1024,
        "vcpus": 2,
        "local_disks": false,
    }
}
  • flavor show 在 local_disks=False 时省略 root_gbephemeral_gbswap_gb

{
    "flavor": {
        "OS-FLV-DISABLED:disabled": false,
        "local_disks": false,
        "os-flavor-access:is_public": true,
        "id": "1",
        "links": [
            {
                "href": "http://openstack.example.com/v2.1/openstack/flavors/1",
                "rel": "self"
            },
            {
                "href": "http://openstack.example.com/openstack/flavors/1",
                "rel": "bookmark"
            }
        ],
        "name": "m1.tiny",
        "ram": 512,
        "vcpus": 1
    }
}
  • 使用旧的 microversions,当 local_disks=False 时,root_gbephemeral_gbswap_gb 将以值 0 返回

{
    "flavor": {
        "OS-FLV-DISABLED:disabled": false,
        "local_disks": false,
        "disk": 0,
        "OS-FLV-EXT-DATA:ephemeral": 0,
        "os-flavor-access:is_public": true,
        "id": "1",
        "links": [
            {
                "href": "http://openstack.example.com/v2.1/openstack/flavors/1",
                "rel": "self"
            },
            {
                "href": "http://openstack.example.com/openstack/flavors/1",
                "rel": "bookmark"
            }
        ],
        "name": "m1.tiny",
        "ram": 512,
        "swap": 0,
        "vcpus": 1
    }
}
  • root_gblocal_disks=False 时不再是必需的

  • 当 flavor 带有 local_disks=False 且没有提供 BD 映射时,返回 400 错误

  • 当 flavor 带有 local_disks=False 且 BD 映射中给定的 dest_type 为 local 时,返回 400 错误

  • 当 flavor 带有 local_disks=True 且请求将实例调整大小到 flavor local_disks=False 时,返回 400 错误

  • 在 flavor 创建时,当 local_disks=False 且给定了 root_gb 和/或 ephemeral_gb 和/或 swap_gb 时,返回 400 错误

安全影响

通知影响

其他最终用户影响

最终用户需要提供带有 dest_type volume 的适当 blockdevice 映射,才能使用带有 local_disks=False 的 flavor。

性能影响

其他部署者影响

如果部署者不希望在 hypervisor 节点上存在任何临时/本地磁盘,他们只需创建带有 local_disks=False 的 flavor,然后该云的所有用户都必须在使用 blockdevice 映射创建实例时提供带有 dest_type ‘volume’ 的 blockdevice 映射。

开发人员影响

实现

负责人

主要负责人

tpatzig

工作项

  • 创建数据库列

  • 创建带有新键的 API microversion

  • 支持 flavor show 中 local_disks=False

  • 如果 flavor 中存在 local_disks=False 且请求包含本地 BD 映射,则进行异常处理

  • 调整 flavor 单元测试

依赖项

测试

  • 创建带有 local_disks=False 的 flavor

  • 不使用卷启动具有此 flavor 的实例

  • 使用本地 BD 映射启动具有此 flavor 的实例

  • 使用卷启动具有此 flavor 的实例

文档影响

https://docs.openstack.org/openstack-ops/content/flavors.html

API 文档将被更新以包含新的 flavor 选项 local_disks

参考资料

历史

修订版

发布名称

描述

Ocata

引入