如何在OpenStack-Kolla+Ceph环境下不修改Cinder后端直接提取实例的Ceph卷并导出至其他OpenStack
如何在OpenStack-Kolla+Ceph环境下不修改Cinder后端直接提取实例的Ceph卷并导出至其他OpenStack
我来给你梳理几个可行的实操方案,都是不用修改Cinder后端就能直接操作Ceph里的实例卷的办法,我在Kolla部署的OpenStack+Ceph环境里亲测有效:
一、先定位实例对应的Ceph卷信息
首先得搞清楚你的实例挂载的卷在Ceph集群里的具体位置:
- 第一步,拿到实例关联的卷ID:
输出里会列出卷的ID和名称,比如类似openstack server show <你的实例名称> -c volumesvolumes: [{"id": "xxxx-xxxx-xxxx-xxxx", "name": "my-volume"}]的内容。 - 第二步,查询这个卷的Ceph存储详情:
重点找cinder show <刚才拿到的卷ID>provider_location字段,格式一般是rbd://<集群ID>/<存储池>/<RBD镜像名>,比如rbd://ceph-cluster/volumes/volume-xxxx-xxxx-xxxx-xxxx—— 这里的volumes就是Ceph存储池名称,后面的一串字符就是对应的RBD镜像名。注:如果是实例的临时卷(不是通过Cinder挂载的卷),它的RBD镜像通常在
vms存储池里,需要用nova show <实例ID>查看block_device_mapping字段来定位。
二、从Ceph导出卷为原始镜像文件
因为是Kolla容器化部署的Ceph,直接在Ceph容器里操作最方便:
- 先进入Ceph监控容器(或者任何带有Ceph客户端的容器):
docker exec -it $(docker ps | grep ceph-mon | awk '{print $1}') bash - 用
rbd export命令把Ceph里的RBD镜像导出成raw格式的文件:
比如存储池是rbd export <存储池名称>/<RBD镜像名> /tmp/exported-volume.rawvolumes,镜像名是volume-xxxx-xxxx,命令就是rbd export volumes/volume-xxxx-xxxx /tmp/exported-volume.raw重要提醒:为了避免数据不一致,强烈建议先停止实例,或者给卷创建快照后导出快照(更安全):
# 创建快照 rbd snap create <存储池>/<RBD镜像名>@export-snap # 导出快照为raw文件 rbd export <存储池>/<RBD镜像名>@export-snap /tmp/exported-volume-snap.raw # 导出完成后可删除快照(可选) rbd snap rm <存储池>/<RBD镜像名>@export-snap - 把导出的raw文件复制到宿主机(或者能访问目标OpenStack的机器):
在宿主机终端执行:docker cp <刚才进入的Ceph容器ID>:/tmp/exported-volume.raw /本地存储路径/
三、将导出的镜像导入到目标OpenStack
拿到raw格式的镜像文件后,就可以导入到目标OpenStack的Glance服务,进而创建卷或者实例:
- 第一步,导入镜像到Glance:
openstack image create --disk-format raw --container-format bare --file /本地存储路径/exported-volume.raw "导出的实例卷" - 第二步,用这个镜像创建Cinder卷(如果要挂载给其他实例使用):
或者直接用这个镜像创建新实例:openstack volume create --image "导出的实例卷" --size <卷大小,单位G> 目标卷名称openstack server create --flavor <实例规格> --image "导出的实例卷" 目标实例名称
一些关键注意事项
- 权限问题:操作Ceph容器需要管理员权限,Kolla默认会把Ceph的admin keyring挂载到容器里,确保你能正常执行
rbd命令。 - 数据一致性:导出前一定要确保卷没有被写入操作,停止实例或用快照是最稳妥的方式,否则导出的文件可能出现数据损坏。
- 存储空间:raw格式的镜像大小和原卷完全一致,要确保导出目标位置有足够的存储空间。
备注:内容来源于stack exchange,提问作者sina
相关产品推荐
相关产品推荐

