自定义虚拟机镜像方案
平台页面不支持根据已创建的虚拟机制作镜像,若有相关需求,可参考本文档基于现有虚拟机实例制作镜像。
注意事项
为了保证数据完整,制作镜像过程中需要挂起虚拟机,挂起的虚拟机接近关机状态,所有业务不可访问。
挂起虚拟机
下载 virtctl 工具
在集群 Master 节点执行以下命令:
wget https://github.com/kubevirt/kubevirt/releases/download/v0.50.0/virtctl-v0.50.0-linux-amd64 -O /usr/local/bin/virtctl && chmod a+x /usr/local/bin/virtctl
挂起虚拟机
在集群 Master 节点执行以下命令:
kubectl get vm -A | grep {vm-name} # 获取准确的 vm 名称和 vm namespace
virtctl -n {vm-namespace} pause vm {vm-name} # 挂起虚拟机
制作虚拟机镜像
获取虚拟机系统盘 PV 名称和所在节点
在集群 Master 节点执行以下命令:
kubectl -n {vm-namespace} get pvc {vmname}-rootfs -o jsonpath='{.spec.volumeName}'
kubectl -n {vm-namespace} get vmi {vmname} -o jsonpath='{.status.nodeName}'
文件系统类型的系统盘制作镜像
注意:以下命令需要在虚拟机所在的物理机上执行。
-
获取挂载路径。
mount | grep "{vm-pv-name}/mount" | awk '{print $3}' find /var/lib -name "*{vm-pv-name}*" # 如果 mount 不可用可以使用 find, 例子: # find /var/lib -name "*pvc-0dc285db-7893-460e-a7d4-3372f6364a76*"
-
安装 qemu-img 工具。
yum install qemu-img -y
-
镜像格式转换。
qemu-img convert -f raw -O qcow2 {pv-mount-path}/disk.img /path/to/disk.qcow2 # 例子:qemu-img convert -f raw -O qcow2 /var/lib/kubelet/pods/7d7437ec-251c-44f7-9117-386b6fe19687/volumes/kubernetes.io~csi/pvc-048936ad-c763-4302-9ec5-21cd3ad0aaa2/mount/disk.img centos7.qcow2
块设备类型的系统盘制作镜像
注意:以下命令需要在虚拟机所在的物理机上执行。
-
获取挂载路径。
mount | grep "{vm-pv-name}/dev" | awk '{print $3}' # 例子:mount | grep "pvc-0577145f-708e-44b0-8c66-f500acf76be9/dev" | awk '{print $3}' find /var/lib -name "*{vm-pv-name}*" # 如果 mount 不可用可以使用 find, 例子: # find /var/lib -name "*pvc-0dc285db-7893-460e-a7d4-3372f6364a76*"
-
安装 qemu-img 工具。
yum install qemu-img -y
-
镜像格式转换。
qemu-img convert -f raw -O qcow2 {pv-mount-path} /path/to/disk.qcow2 # 例子:qemu-img convert -f raw -O qcow2 /var/lib/kubelet/plugins/kubernetes.io/csi/volumeDevices/pvc-5595c02f-89ac-45ea-9112-788c527e45b5/dev/478e9258-6aa8-4fde-b295-a9bdd9e27fc1 disk.qcow2
唤醒挂起的虚拟机
在集群的 Master 节点执行以下命令:
virtctl -n {vm-namespace} unpause vm {vm-name}
# 例子: virtctl -n virt unpause vm vm-test
提供下载
制作好 qcow2 后,需要将文件放到 S3 或者 HTTP 服务器中,并获取下载地址,然后可通过自定义镜像功能添加虚拟机镜像,以下为您提供几种常见的存储方式,可以存储在相应位置导入至平台使用虚拟机镜像。
-
如果平台有分布式存储(Ceph),可打开对象存储功能使用。
-
可以使用 Nginx 提供下载。
-
在测试时,可以使用 python3 -m http.server 快速启动 http 服务。