老司机指导如何远程使用镜像
女主宣言
这篇文章出自HULK虚拟化团队--存储小分队,主要内容是关于openstack镜像结合ceph存储后的一些远端操作方法和思考。当然在发文章期间,老司机们已经又找到了image的best practice,新方案会在后续的文章中提出,希望这些思路能对大家有所启发。
随着ceph在线上更深入的使用,以及多机房的场景。以往虚拟机镜像修改上传的模式逐渐成为了负担。实际上,我们可以根据ceph存储的特性,将过去对镜像线下本地处理的操作改为直接在远端处理。
1
准备
1.镜像在ceph中存储的路径一般为 {pool_name}/{uuid}的形式,通常情况下该{uuid}和镜像的ID是相同的,为避免一些历史原因导致的镜像ID与ceph image uuid有差异,打开glance image-show中的location信息。
修改 glance-api.conf,添加如下内容,打开rbd路径的详情。
enable_v2_api =True
show_multiple_locations = Truefilesystem_store_metadata_file = filePath
2.对准备操作glance中镜像的设备做libvirt同ceph的验证准备。
定义secret文件
cat > secret.xml <<EOF
<secret ephemeral='no' private='no'>
<usage type='ceph'>
<name>client.libvirt secret</name>
</usage>
</secret>
EOF
3.libvirt添加secret配置
virsh secret-define --file secret.xml
#这里会生成一个uuid 用在下面命令的 --secret 后,以及xml里的auth
cat /etc/ceph/ceph.client.glance.keyring
sudo virsh secret-set-value --secret 453cf8e2-02b4-4744-9455-5544601bb043 --base64 AQBkGYZX/tuDMxAANVznwk/+MkrhsEBlZAJlLg==
2
对镜像操作的两个思路
qcow2镜像存储中操作镜像
以老的镜像制作方式为基础
“
这里是一个习惯问题,如果读者对本文中的操作进行实验后其实很容易直接在存储中直接制作镜像,可以省去不少麻烦。
我们会生成一个3g大小,为了便于上传经过压缩(`virt-sparsify --compress`)和清理多余信息(`virt-sysprep`)后的镜像。
将镜像上传到glance后,我们需要先拿到镜像对应的rbd地址。
glance --os-image-api-version 2 image-show 79db316e-9012-4296-9226-dec141a1210c
其中,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中的优势在这里就不再复述了,具体操作如下。
#生成新的uuid
[]# uuidgen
b0b6bb99-7693-4614-b6f1-01b602d69f54
#转换qcow2倒raw
[]# qemu-img convert -O raw rbd:images/e6c01758-b7ad-4097-9400-570cc1ceed43 rbd:images/b0b6bb99-7693-4614-b6f1-01b602d69f54
对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文件中的配置如下
<disk type='network' device='disk'>
<driver name='qemu' type='raw' cache='writeback' discard='unmap'/>
# username 为 ceph 中给 glance 授权的用户名
<auth username='glance'>
# 上文中生成的secret的uuid
<secret type='ceph' uuid='453cf8e2-02b4-4744-9455-5544601bb043'/>
</auth>
#镜像在ceph中的地址
<source protocol='rbd' name='rbd:images/b0b6bb99-7693-4614-b6f1-01b602d69f54'>
<host name='10.10.10.84' port='6789'/>
<host name='10.10.10.102' port='6789'/>
<host name='10.10.10.110' port='6789'/>
</source>
<target dev='vda' bus='virtio'/>
<address type='pci' domain='0x0000' bus='0x00' slot='0x05' function='0x0'/>
</disk>
注意上面的auth
1. username 与线上不同,应为glance
2. uuid 为我们为glance创建的secret,通过 `virsh secret-list` 可以查看列表
3. name 为镜像地址,可以通过 `glance --os-image-api-version 2 image-show {uuid}` 查看,
完成以上步骤后即可继续操作
1. 开机并等待虚拟机resize2fs并进入操作系统
2. 可选择性的手动清理虚拟机内的日志等无用文件
3. 关机
4. 删除镜像中的其他复杂遗留信息
删除关机后遗留信息也是直接操作rbd
export LIBGUESTFS_BACKEND=direct
virt-sysprep -d {domain_name}
在glance中创建新镜像并指向我们前面初始化后的最终的rbd地址
由于glance中镜像指向的地址为实际镜像的快照,为了符合要求,我们也需要对上面操作过的镜像做快照处理。
对镜像创建snap
[]# rbd -p images snap create --snap snap-20160922 b0b6bb99-7693-4614-b6f1-01b602d69f54
保护snap,以免误删。
[]# rbd -p images snap protect --image b0b6bb99-7693-4614-b6f1-01b602d69f54 --snap snap
创建新镜像并将location指到我们新生成的snap上
glance image-create --id {NEW_UUID} --name {NEW_IMAGE_NAME} --store rbd --disk-format raw --container-format bare --location rbd://$(sudo ceph fsid)/images/b0b6bb99-7693-4614-b6f1-01b602d69f54/snap-20160922
至此整个过程完成
在线修改glance中镜像
如果发现glance中的镜像内配置文件有问题怎么办?答案当然也是直接改。
这次我们利用guestfish来操作。
guestfish
Welcome to guestfish, the guest filesystem shell for
editing virtual machine filesystems and disk images.
Type: 'help' for help on commands
'man' to read the manual
'quit' to quit the shell
#添加需要 guestfish识别的rbd磁盘
#username为glance protocol类型为rbd 格式为raw secret密钥为ceph glance的keyring, 一般在 /etc/ceph/ceph.client.glance.keyring
><fs> add-drive images/b0b6bb99-7693-4614-b6f1-01b602d69f54 username:glance protocol:rbd format:raw secret:AQBkGYZX/tuDMxAANVznwk/+MkrhsEBlZAJlLg==
><fs> run
><fs> list-filesystems
/dev/sda1: ext4
><fs> mount /dev/sda1 /
#比如我们要修改开机磁盘挂载的配置
><fs> edit /etc/fstab
><fs> exit
再执行一次上文提到的glance指向新snap的操作。
nova image-list
# 看一下当前已有的snap
rbd -p images snap ls b0b6bb99-7693-4614-b6f1-01b602d69f54
# 创建snap
rbd -p images snap create --snap snap-20160924 b0b6bb99-7693-4614-b6f1-01b602d69f54
# 保护snap
rbd -p images snap protect --image b0b6bb99-7693-4614-b6f1-01b602d69f54 --snap snap-20160924
# 生成新镜像
glance --debug image-create --id {NEW_UUID} --name {NEW_IMAGE_NAME} --store rbd --disk-format raw --container-format bare --location rbd://$(sudo ceph fsid)/images/b0b6bb99-7693-4614-b6f1-01b602d69f54/snap-20160924
至此过程完成。
4
小记
使用ceph存储后对镜像的操作异常方便。从基础镜像的生成,修改,镜像扩容,格式转换等,全部可以在远端完成。并且操作速度的体验要优于传统的在本地磁盘的操作。
上面介绍的步骤略显复杂,主要是为了清楚的介绍几种镜像操作的可能遇到情形和处理过程中对一些小细节的处理。读者完全可以根据自己的需求拼凑出适合自己的步骤。
另外上面这些步骤也可通过简单修改nova和glance或自家平台代码的形式,直接包装到虚拟机及镜像相关自动化流程中。在此本文只做基本方法的介绍,希望能够抛砖引玉,令读者们能在自己的生产环境中发现实际的应用方式。
上一篇: JSON
推荐阅读
-
老司机指导如何远程使用镜像
-
如何轻松使用JMeter进行HTTP接口测试 - 一步步教你设置线程组、 cookie、默认值与Sampler,加上响应断言和监听器,打造基础测试案例。针对复杂情况,将子系统和流程测试分类组织,确保数据一致性。同时,别忘了感谢阅读,给新手提供实战学习资源与全套测试指南,助你轻松踏上自动化测试之路! - 在"测试计划"点击右键,添加"线程组"并设定初始"线程数"和"循环次数" - 配置"HTTP Cookie管理器"与"Http请求默认值",输入目标系统信息,如域名、端口、协议等,让所有相关Sampler共享这些默认设置 - 在线程组内增加"HTTP Request"的Sampler,并填入接口详情,比如路径、请求方法及参数 - 添加"响应断言"检查接口返回结果,通过正则表达式验证预期结果 - 安装监听器,实时查看测试执行状况 - 如需处理流程性接口,请依次添加多个相关Sampler,关联前后请求间的上下文数据 特别提示:为了帮助大家避免学习中的曲折,我们准备了详尽的视频和文档资料库,无论你是软件测试的新手还是老司机,都能从中找到所需的全方位支持。只需点击下方链接加入我们的学习交流社群,就能立刻获取这份珍贵的学习宝藏!再次感谢您的耐心阅读,愿它成为您前行路上的一大助力!