背景
VMware vmdk driver已经成为了一种可选的cinder volume driver,分析它,对于将已经成熟的虚拟化产品接入openstack,有着很大的借鉴价值。
VMware VMDK driver的介绍
支持的卷操作
- 创建卷
- 从源卷创建新卷(支持这一操作当且仅当源卷没有被挂在到虚拟机上)
- 从快照创建卷
- 从glance镜像创建卷
- 挂载卷(挂载卷到虚拟机,这一重新配置的操作会为虚拟机添加一块VMDK硬盘,用户必须在虚拟机内的客户操作系统中手动扫描并mount这块新的设备)
- 卸载卷
- 创建快照(支持这一操作当且仅当源卷没有被挂在到虚拟机上)
- 删除快照(支持这一操作当且仅当源卷没有被挂在到虚拟机上)
- 作为镜像上传到glance(支持这一操作当且仅当源卷没有被挂在到虚拟机上)
VMware VMDK driver的使用约束
- 必须是共享存储(NFS, iSCSI, FiberChannel, and vSAN)。
- 必须与Nova的VMware driver配合使用。
影子虚拟机(Shadow VM)
要想理解VMware在cinder中怎样实现VMDK driver,就需要理解影子虚拟机(Shadow VM)这个概念。
在上面这幅图里,可以看到一个名字以“volume”开头的虚拟机,这个虚拟机就是影子虚拟机,它挂载着一块vmdk,但是它永远也不会启动,之所以影子虚拟机会存在,是因为VMware的对象模型中卷是从属于虚拟机的二级对象,不能独立于虚拟机而存在,所以创建卷在VMware中不是一个独立的操作,它只能是创建虚拟机的一部分。而cinder认为卷是独立的一种对象。这种冲突就导致在实现driver时,每一个volume即vmdk都和一个影子虚拟机关联,很多高级功能的实现也依赖于影子虚拟机的特性,如快照、链接克隆等。而影子虚拟机本身只会在VMware的界面上看到,对于openstack的云用户来说是不可见不可操作的。
VMware VMDK driver中卷操作的实现解读
create volume
vmdk driver没有真正的创建卷的实体,只是校验了一下创卷的卷规格,即self._verify_volume_creation(volume)校验方法就是查找是否有满足要求的datastore可以用来容纳卷,即self._select_ds_for_volume(volume)真正的创建卷将延迟到第一次挂载卷的时候,随着创建影子虚拟机而完成。之所以这样延迟创建,是为了将卷创建在虚拟机所在主机能够访问的datastore上,最大限度地避免主机连接不到datastore也就是虚拟机挂不了卷这种情况下,而不得不进行的在不同datastore上迁移卷的开销。
attach volume
当挂载卷的请求发出后,下面三个流程之一就会发生:
-
如果卷从未被挂载,则卷及其影子虚拟机还不存在,则在将要挂卷的虚拟机所在主机的可见datastore里会创建卷及其影子虚拟机,将卷从影子虚拟机上卸载,挂给要求的虚拟机。
-
如果卷已经被挂载过,且卷及其影子虚拟机所在的datastore对于要挂卷的虚拟机所在主机也是可见的,则直接将卷挂载给要求的虚拟机即可。
-
如果卷已经被挂载过,但是卷及其影子虚拟机所在的datastore对于要挂卷的虚拟机所在主机是不可见的,则Storage vMotion将会被调用,将卷迁移到主机可见的datastore上,然后挂给要求的虚拟机。
create snapshot
- 卷只有在available状态下(即没有挂载到虚拟机上且正常的卷),才允许做卷快照。
- 这个卷如果没有影子虚拟机说明其从没有被使用过,直接返回。(这时候做快照没有意义)
- 最后真正开始做卷快照实际上是在将卷挂载到影子虚拟机上,对影子虚拟机做虚拟机快照。
task = self._session.invoke_api(self._session.vim, 'CreateSnapshot_Task', backing, name=name, description=description, memory=False, quiesce=quiesce)
create cloned volume
这个driver接口实现的功能就是前面提到的通过源卷创建一个新卷。其过程大致是这样的:
- 校验新建卷的参数,实际上就是看是否可以找到满足条件的datastore创建该卷
- 源卷如果没有影子虚拟机说明其从没有被使用过,直接返回。
- 创建一个存储上与源卷相同规格的新的影子虚拟机,将其vmdk文件删除,将源卷的vmdk文件拷贝一份,作为新的影子虚拟机的vmdk文件。
- 如果新创建的卷大小>源卷大小,则extend_virtual_disk。
参考
http://cloudarchitectmusings.com/2013/11/19/laying-cinder-block-volumes-in-openstack-part-2-integration-with-vsphere/
由 udpwork.com 聚合
|
评论: 0
|
要! 要! 即刻! Now!