导出虚拟机镜像

该功能用于导出虚拟机的系统镜像并上传至对象存储,允许将对象存储中的文件添加为平台虚拟机镜像的来源。

操作步骤

注意:以下所有操作均需在虚拟机所在集群的控制节点上进行。

停止虚拟机

  1. 进入 管理员

  2. 在左侧导航栏点击 虚拟化管理 > 虚拟机

  3. 点击需要导出系统镜像的虚拟机名称,跳转至容器平台的虚拟机详情页面。

  4. 点击 停止

创建 vmexport 资源

  1. 打开 CLI 工具。

  2. 执行以下命令设置变量。

    NAMESPACE=<namespace>
    VM_NAME=<vm_name>
    TTL_DURATION=2h

    参数说明:

    • NAMESPACE:虚拟机所在的命名空间名称;将 <namespace> 替换为该名称。
    • VM_NAME:需要导出系统镜像的虚拟机名称;将 <vm_name> 替换为该名称。
    • TTL_DURATION:导出任务的存活时间,默认为 2 小时,可根据需要延长。
  3. 执行以下命令创建 vmexport 资源。

    cat <<EOF | kubectl create -f -
    apiVersion: export.kubevirt.io/v1alpha1
    kind: VirtualMachineExport
    metadata:
      name: export-$VM_NAME
      namespace: $NAMESPACE
    spec:
      ttlDuration: $TTL_DURATION
      source:
        apiGroup: "kubevirt.io"
        kind: VirtualMachine
        name: $VM_NAME
    EOF

    若出现类似回显信息,表示创建成功。

    virtualmachineexport.export.kubevirt.io/export-k1 created
  4. 执行以下命令查看 vmexport 资源状态。

    kubectl -n $NAMESPACE get vmexport export-$VM_NAME -w

    回显信息:

    NAME        SOURCEKIND       SOURCENAME   PHASE
    export-k1   VirtualMachine   k1           Ready
  5. 当回显信息中的 PHASE 字段变为 Ready 时,按 ctrl (control) + c 停止 watch 操作。

  6. 执行以下命令获取 TOKEN。

    TOKEN=$(kubectl -n $NAMESPACE get secret export-token-export-$VM_NAME -o jsonpath={.data.token} | base64 -d)

下载虚拟机镜像文件

  1. 执行以下命令获取指定命名空间中虚拟机导出 Pod 的 IP 地址,并存入 EXPORT_SERVER_IP 环境变量。

    EXPORT_SERVER_IP=$(kubectl -n $NAMESPACE get po virt-export-export-$VM_NAME -o jsonpath='{.status.podIP}')
  2. 执行以下命令设置 URL 环境变量,指向虚拟机的磁盘镜像文件。

    URL=https://$EXPORT_SERVER_IP:8443/volumes/$VM_NAME-rootfs/disk.img.gz
  3. 执行以下命令下载镜像文件,下载后的文件名为 disk.img.gz。

    curl -k -O -H "x-kubevirt-export-token: $TOKEN" $URL

将虚拟机镜像文件上传至对象存储

将下载的镜像文件上传至对象存储。上传可使用任意 S3 工具,本文以 mc(minio-client)工具为例介绍。

  1. 执行以下命令配置 mc 工具,连接指定的 S3 存储服务。

    mc alias set minio <ENDPOINT> <ACCESSKEY> <SECRETKEY>

    参数说明:

    • ENDPOINT:S3 存储服务地址;将 <ENDPOINT> 替换为该地址。
    • ACCESSKEY、SECRETKEY:用于认证的 S3 存储服务用户 ak 和 sk,相关信息请参考 MinIO Object Storage
  2. 执行以下命令创建用于存储虚拟机镜像文件的桶。

    mc mb minio/vmdisks
  3. 执行以下命令将导出的虚拟机镜像文件 disk.img.gz 上传至创建的桶。

    mc put disk.img.gz minio/vmdisks

创建虚拟机镜像

  1. 进入 管理员

  2. 在左侧导航栏点击 虚拟化管理 > 虚拟机镜像

  3. 点击 添加虚拟机镜像

  4. 在镜像地址中填写 <ENDPOINT>/vmdisks/disk.img.gz,将 <ENDPOINT> 替换为 S3 存储服务地址。其他参数说明请参考 添加虚拟机镜像

  5. 点击 添加