随着ceph在线上更深入的使用,以及多机房的场景。以往虚拟机镜像修改上传的模式逐渐成为了负担。实际上,我们可以根据ceph存储的特性,将过去对镜像线下本地处理的操作改为直接在远端处理。
准备
1.镜像在ceph中存储的路径一般为 {pool_name}/{uuid}
的形式,通常情况下该{uuid}和镜像的ID是相同的,为避免一些历史原因导致的镜像ID与ceph image uuid有差异,打开glance image-show中的location信息。
修改 glance-api.conf,添加如下内容,打开rbd路径的详情。
|
|
2.对准备操作glance中镜像的设备做libvirt同ceph的验证准备。
定义secret文件
|
|
libvirt添加secret配置
|
|
对镜像操作的两个思路
1. qcow2镜像存储中转换格式,修改大小,并在glance中生成新镜像。
以老的镜像制作方式为基础
这里是一个习惯问题,如果读者对本文中的操作进行实验后其实很容易直接在存储中直接制作镜像,可以省去不少麻烦。
我们会生成一个3g大小,为了便于上传经过压缩(virt-sparsify --compress
)和清理多余信息(virt-sysprep
)后的镜像。
####将镜像上传到glance后,我们需要先拿到镜像对应的rbd地址。
|
|
其中,location字段是这样的[{"url": "rbd://5f3cb911-4f76-4421-a3fd-d2d7c5104a/images/e6c01758-b7ad-4097-9400-570cc1ceed43/snap", "metadata": {}}]
这个字段中我们只需要一小段内容:images/e6c01758-b7ad-4097-9400-570cc1ceed43
在rbd中对应的是pool_name/image_uuid
####转换镜像格式
raw的特性和在ceph中的优势在这里就不再复述了,具体操作如下。
|
|
####对rbd中的image扩容qemu-img resize rbd:images/b0b6bb99-7693-4614-b6f1-01b602d69f54 50G
resize 完成后需要先boot一下,确认系统盘大小为50g。并提前完成resize2fs的操作。随后再进行一次清理操作。
之所以resize后要先boot一下是因为在我们的使用场景中,基础镜像生成的虚拟机根磁盘是固定不变的,为了免去每次开机时resize2fs对ceph后端的压力,故做此操作。读者们请酌情选择。
这里我们直接通过libvirt挂载glance中的image,磁盘设备在xml文件中的配置如下
|
|
注意上面的auth
- username 与线上不同,应为glance
- uuid 为我们为glance创建的secret,通过
virsh secret-list
可以查看列表 - name 为镜像地址,可以通过
glance --os-image-api-version 2 image-show {uuid}
查看,
完成以上步骤后即可继续操作
- 开机并等待虚拟机resize2fs并进入操作系统
- 可选择性的手动清理虚拟机内的日志等无用文件
- 关机
- 删除镜像中的其他复杂遗留信息
删除关机后遗留信息也是直接操作rbd
|
|
#####在glance中创建新镜像并指向我们前面初始化后的最终的rbd地址
由于glance中镜像指向的地址为实际镜像的快照,为了符合要求,我们也需要对上面操作过的镜像做快照处理。
|
|
创建新镜像并将location指到我们新生成的snap上
|
|
至此整个过程完成
###在线修改glance中镜像
如果发现glance中的镜像内配置文件有问题怎么办?答案当然也是直接改。
这次我们利用guestfish来操作。
|
|
再执行一次上文提到的glance指向新snap的操作。
|
|
至此过程完成。
小记
使用ceph存储后对镜像的操作异常方便。
从基础镜像的生成,修改,镜像扩容,格式转换等,全部可以在远端完成。并且操作速度的体验要优于传统的在本地磁盘的操作。
上面介绍的步骤略显复杂,主要是为了清楚的介绍几种镜像操作的可能遇到情形和处理过程中对一些小细节的处理。读者完全可以根据自己的需求拼凑出适合自己的步骤。
另外上面这些步骤也可通过简单修改nova和glance或自家平台代码的形式,直接包装到虚拟机及镜像相关自动化流程中。在此本文只做基本方法的介绍,希望能够抛砖引玉,令读者们能在自己的生产环境中发现实际的应用方式。