首页 / 最佳实践 / 自定义虚拟机镜像方案

自定义虚拟机镜像方案

平台页面不支持根据已创建的虚拟机制作镜像,若有相关需求,可参考本文档基于现有虚拟机实例制作镜像。

注意事项

为了保证数据完整,制作镜像过程中需要挂起虚拟机,挂起的虚拟机接近关机状态,所有业务不可访问。

挂起虚拟机

下载 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}'

文件系统类型的系统盘制作镜像

注意:以下命令需要在虚拟机所在的物理机上执行。

  1. 获取挂载路径。

    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*"
  2. 安装 qemu-img 工具。

    yum install qemu-img -y
  3. 镜像格式转换。

    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 

块设备类型的系统盘制作镜像

注意:以下命令需要在虚拟机所在的物理机上执行。

  1. 获取挂载路径。

    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*"
  2. 安装 qemu-img 工具。

    yum install qemu-img -y
  3. 镜像格式转换。

    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 服务器中,并获取下载地址,然后可通过自定义镜像功能添加虚拟机镜像,以下为您提供几种常见的存储方式,可以存储在相应位置导入至平台使用虚拟机镜像。