Volume Attach时Nova与Cinder的交互

继续使用DeepSeek来分析Volume Attach时Nova与Cinder的交互。这里以基于iSCSI的LVM存储为例,只总结一些个人理解,不贴详细的对话记录了。

【Volume的创建】

下图是Cinder创建Volume时涉及的概念:把后端存储与Cinder中的logical volume关联起来。(转自别以为真懂Openstack: 虚拟机创建的50个步骤和100个知识点(5) - popsuper1982 - 博客园

 

【iSCSI 的基本组件】

  • iSCSI Initiator:发起iSCSI连接的一方,通常是需要访问存储资源的客户端系统。
  • iSCSI Target:提供存储资源的一方,通常是存储服务器或存储阵列。
  • LUN(Logical Unit Number):iSCSI Target上的逻辑单元号,每个LUN代表一个存储设备。
  • IQN(iSCSI Qualified Name):用于唯一标识iSCSI Initiator和Target的名称,格式为iqn.yyyy-mm.naming-authority:unique-string。

下图是iSCSI协议中LUN与Cinder中的LV卷的关系:通常一个LUN对应一个LV卷。

 

简而言之,当使用iSCSI时,存储节点Cinder Volume会创建一个与实际存储后端对应的iSCSI Target,将卷作为LUN暴露出来。计算节点上的Nova服务(通过libvirt或直接配置)会作为iSCSI Initiator连接到这个Target,并将卷作为块设备挂载到虚拟机,这样虚拟机VM所在的计算节点与存储后端就能进行数据传输了。

 

 【Volume Attach流程】

详细流程参见:

别以为真懂Openstack: 虚拟机创建的50个步骤和100个知识点(5) - popsuper1982 - 博客园

OpenStack虚拟机挂载数据卷过程分析 - Jingh Blog

 流程图如下,重点关注Nova与Cinder交互时的"initialize_connection",和"return connection Info"的消息内容。

>> initialize_connection

nova-compute调用"get_volume_connector()"函数,返回该计算节点的信息(如ip、操作系统类型等)以及initiator name (IQN),之后发送RESTful API Request “initialize_connection()”给Cinder(这些信息可用于Target中的鉴权,构建ACL列表等)。

消息内容示例如下:

cinder.volume.targets.iscsi module — cinder 25.1.0.dev101 documentation

Block Storage API V3 (CURRENT) — cinder documentation

 

>> return connection Info

cinder-volume收到initialize_connection请求后,调用函数“create_export()”,“create_iscsi_target()”等,创建出LV卷对应的iSCSI Target,如下图所示:

Target的IQN,以及所有的LUN编号和信息:“Backing store path"即对应的LVM卷。

 

 之后,这些信息做为connection_info字段的内容,放入上面提及的initialize_connection请求的Response,返回给nova-compute,如下图所示:  

 这样计算节点后续就能用这些信息进行认证访问对应的后端存储的LVM卷了。

 存储控制面和存储数据面总结如下图:

 

【Q&A】

1. 一个Cinder环境可配置多个存储后端(如SSD和HDD混合池),通过卷类型(Volume Type)区分性能或功能。

2. Cinder存储节点通过 host(节点标识) 和 backend_name(后端名称) 唯一标识自身,并通过注册机制将状态上报至数据库。Cinder Scheduler基于这些标识和存储后端的属性(容量、能力等),结合过滤和权重策略,完成卷的调度决策。正确配置host和volume_backend_name是确保存储节点被识别的关键。

如果一个存储节点支持多个存储后端(如同时管理SSD和HDD池),每个后端需配置唯一的backend_name。用于区分同一节点上的不同存储后端(例如SSD和HDD)。

指令cinder get-pools --detail能得到每个存储后端的容量信息。

3. 在Cinder中,同一个存储后端类型可以配置在不同的存储节点上,但具体是否可行取决于存储后端的类型及其共享性。Cinder通过host@backend_name唯一标识存储后端,即使多个节点使用相同的backend_name,只要host不同,调度器会将其视为独立后端: 

  • 共享存储后端(如Ceph、NFS):可在多个存储节点上配置,所有节点共享同一存储资源池,适合高可用和弹性扩展场景。
  • 独立存储后端(如本地LVM):每个节点的后端独立管理本地资源,需通过卷类型区分。

4. 在OpenStack中,计算节点(Nova-Compute)和存储节点(Cinder-Volume)的角色是否需要合并,完全取决于实际需求和架构设计,不需要强制绑定。

5. cinder-volume和nova-compute之间的直接通信主要通过REST API完成,而不是直接通过消息队列(如RabbitMQ)。

6. 对于同一个volume,nova先执行attach操作,之后再detach,最后又attach:对于这两次attach,Cinder生成的connection_info是一样的,还是不同?

==> 

  • 共享存储:多次挂载的connection_info通常一致,资源位置固定。
  • 动态资源分配存储:connection_info可能变化,具体取决于Driver实现及配置。

- Detach操作:可能触发Driver清理资源(如删除Target/LUN)。
- 再次挂载:Driver重新分配资源,生成新Target IQN或LUN,导致connection_info不同。

7. Cinder卷的快照(snapshot)通常不能直接作为独立的卷挂载到虚拟机,进行读写操作,快照需先转换为新卷(可读写)才能挂载到虚拟机。如果一个volume卷存在snapshot快照,则这个volume是无法删除的。

 

【附】

iSCSI相关:

 Create Centralized Secure Storage using iSCSI Target on RHEL/CentOS/Fedora Part -I

 How to Create and Setup LUNs using LVM in "iSCSI Target Server" on RHEL/CentOS/Fedora - Part II

 Centralized Secure Storage (iSCSI) - "Initiator Client" Setup on RHEL/CentOS/Fedora - Part III

 

Volume Attach流程:

 Volume Attach/Detach workflow — cinder 25.1.0.dev101 documentation

 别以为真懂Openstack: 虚拟机创建的50个步骤和100个知识点(5) - popsuper1982 - 博客园

 cinder侧挂载卷流程分析 - 一切都是当下 - 博客园 

posted @ 2025-02-27 23:27  bjtime  阅读(84)  评论(0)    收藏  举报