在实例连接卷的同时扩展卷

https://blueprints.launchpad.net/cinder/+spec/extend-attached-volume

本文档涵盖 Cinder 在卷扩展流程中的变更,允许支持扩展已连接卷的卷驱动程序扩展已连接的卷。

扩展已连接的卷需要 Nova 方面的变更。Nova 文档涵盖 Nova 扩展连接到一个或多个实例的卷所需的变更。

Cinder 将通过现有的 os-server-external-events 扩展与 Nova 交互,以通知 Nova 卷的大小已更改,并对大小的更改做出反应。

在 Nova 处理扩展大小 API 调用后,实例管理员可能需要采取措施来利用与卷相关的新空间。在实例内部,必须采取适当的操作,以发现卷的新大小,具体取决于实例运行的操作系统。然后,实例管理员可以使用卷中的新空间。

问题描述

Cinder 要求卷处于“可用”状态。这意味着在扩展卷的大小之前,需要从实例中分离已连接的卷。这意味着从使用该卷的应用程序的角度来看,卷将离线。

用例

操作员希望在不分离卷的情况下增加当前连接到实例的卷的大小。

提议的变更

在 Cinder 扩展 API 中,允许卷扩展操作在卷状态为“使用中”时继续处理,对于可以支持扩展“使用中”卷的卷驱动程序而言。如果卷驱动程序支持使用中扩展,则卷的状态可以是“可用”或“使用中”。除了“可用”和“使用中”之外的所有卷状态值都将引发异常。

希望支持使用中扩展的卷驱动程序必须添加一个新的功能(in-use-extend),该功能指示驱动程序支持在卷处于“使用中”状态时扩展卷。如果驱动程序没有扩展其卷在“使用中”状态下的功能,则 API 将使用一条消息失败扩展请求,表明卷驱动程序不支持扩展处于“使用中”状态的卷。

将引入一个新的策略,以便部署者可以禁用已连接卷上的卷扩展操作,如果部署完全不支持该功能。例如,Nova virt 驱动程序不支持在线卷大小扩展。

如果卷驱动程序的功能表明驱动程序支持使用中扩展,则卷状态将更改为“扩展中”,然后调用驱动程序的 extend_volume。在将卷状态更改为“使用中”后,通知 Nova 卷的大小已更改。Nova 将对连接了该卷的所有实例的大小更改做出反应。

备选方案

另一种方法是创建一个新的卷并将其连接到实例。一旦在实例上发现新的卷,使用 LVM 将空间扩展到应用程序 LV。这是今天允许分配更多空间的方法。从长远来看,这是不可取的,因为每次扩展卷时,扩展都会导致分配一个新卷,在实例上发现该卷,并将其添加到卷组,然后扩展 LV 以包含该卷。操作员对使用这种方法表示担忧,因为最终会遇到限制,即可以连接到特定操作系统的卷的数量。对于具有在卷使用中时扩展卷的能力的卷控制器,使用该能力是可取的。

数据模型影响

REST API 影响

无需更改 API 接口本身,因为不需要更改 API 参数。API 文档将更改以反映如果卷驱动程序功能允许使用中扩展,则可以使用中卷现在可以扩展。

安全影响

通知影响

待定

其他最终用户影响

最终用户将能够在不首先分离卷的情况下扩展其卷。

性能影响

其他部署者影响

开发人员影响

其后端控制器支持扩展实例正在使用的卷的驱动程序所有者可能希望启用使用中扩展。

实现

负责人

主要负责人:* Mathieu Gagné

其他贡献者:* Gerald McBrearty * Sam Matzek

工作项

Cinder 扩展卷 API 将检查卷驱动程序功能,以查看驱动程序在卷状态为使用中时是否支持 in-use-extend。

extend_volume rpcAPI 需要将卷的状态改回“使用中”,如果卷连接到实例,或者改回“可用”,如果卷未连接到实例,除非驱动程序引发错误,这将导致卷状态更改为“扩展错误”。

依赖项

  • Nova 文档:允许扩展已连接的卷 [1] 添加了 Nova 外部事件对 volume-changed 的支持。它将调用 os-brick extend_volume API,以触发主机内核大小信息在已发现卷的主机上更新。

测试

需要使用 UT 和 FVT 涵盖使用中卷的以下场景

  1. 没有 in-use-extend 功能的卷驱动程序。

  2. 具有 in-use-extend 功能的卷驱动程序,但 Nova 不支持 volume-changed 外部事件。

  3. 具有 in-use-extend 功能的卷驱动程序,并且 Nova 支持 volume-changed 外部事件。

文档影响

需要更新扩展文档,以指示如果驱动程序具有“in-use-extend”功能,则可以扩展连接到实例的卷。

参考资料