创建自定义映像

您可以从现有源磁盘创建自定义映像,并使用这些映像创建和启动虚拟机 (VM)。如果您创建并修改了一个永久性启动磁盘,使其达到了特定的状态并需要保存该状态以用于创建虚拟机,则最适合使用自定义映像。创建并保存自定义映像以在日后创建虚拟机时用作新的虚拟机映像,可避免日后重复执行设置步骤。

准备工作

如需使用 gdcloud 命令行界面 (CLI) 命令,请确保您已下载、安装并配置 gdcloud CLI。 GDC 隔网设备的所有命令都使用 gdcloudkubectl CLI,并且需要 Linux 环境。

获取 kubeconfig 文件路径

如需针对管理 API 服务器运行命令,请确保您拥有以下资源:

  1. 找到管理 API 服务器名称,或向平台管理员 (PA) 询问服务器名称。

  2. 登录并生成管理 API 服务器的 kubeconfig 文件(如果您还没有)。

  3. 使用该路径替换这些说明中的 MANAGEMENT_API_SERVER{"</var>"}}

请求权限和访问权限

如需创建自定义映像,您必须拥有项目级虚拟机映像访问权限。按照给定的步骤操作,让您的项目 IAM 管理员在虚拟机所在项目的命名空间中为您分配项目虚拟机映像管理员 (project-vm-image-admin) 角色。如果您使用 GDC 控制台或 gdcloud CLI 创建映像,还需要 Project VirtualMachine Admin (project-vm-admin) 角色和 Project Viewer (project-viewer) 角色。

创建自定义映像

本部分介绍如何在 Linux 虚拟机上创建自定义映像。

为影响准备虚拟机

即使某个磁盘已挂接到正在运行的虚拟机,您也可以从该磁盘创建映像。但是,如果将虚拟机置于更易于捕获映像的状态,则映像会更加可靠。

尽可能减少永久性磁盘的数据写入

使用以下过程之一减少磁盘写入。停止虚拟机,或尽量减少磁盘写入量:

  • 停止虚拟机,以便其关闭并停止将任何数据写入永久性磁盘。

如果在创建映像之前无法停止虚拟机,请尽量减少磁盘的写入量并同步文件系统。为了尽可能减少对永久性磁盘的写入,请按照以下步骤操作:

  1. 暂停向该永久性磁盘写入数据的应用或操作系统进程。 如有必要,刷新写入磁盘的应用。 其他应用可能有类似的进程。
  2. 阻止应用写入永久性磁盘。
  3. 运行 sudo sync

创建映像

请按照以下步骤操作,通过永久性磁盘创建磁盘映像,即使该磁盘已挂接到虚拟机:

控制台

  1. 选择一个项目。

  2. 在导航菜单中,依次点击虚拟机 > 映像

  3. 点击创建映像

  4. 为映像输入一个唯一名称。名称不得超过 35 个字符。

  5. 输入要添加到映像名称中的版本。

  6. 源磁盘字段中,选择一个磁盘。

  7. “最小磁盘大小”字段中,输入磁盘大小。

  8. 输入图片说明。

  9. 点击创建

该图片会显示在图片列表中。

API

  1. 列出所有 VirtualMachineDisk 对象:

    kubectl --kubeconfig MANAGEMENT_API_SERVER \
       get virtualmachinedisks.virtualmachine.gdc.goog --namespace PROJECT
    
  2. 选择一个 VirtualMachineDisk 对象作为新映像的源磁盘。

  3. 检查虚拟机磁盘是否已挂接到虚拟机:

      kubectl --kubeconfig MANAGEMENT_API_SERVER \
          get virtualmachinedisks.virtualmachine.gdc.goog --namespace PROJECT \
          DISK_NAME -o jsonpath='{.status.virtualMachineAttachments}'
    

    示例输出,显示磁盘已挂接到虚拟机:

      [{"autoDelete":true,"nameRef":{"name":"vm1"},"uid":"...."}]
    
    1. 检查虚拟机的运行状态。如果状态不是 Stopped,请停止虚拟机,然后继续创建 VirtualMachineImage
  4. 获取 VirtualMachineDisksize 以创建映像:

    kubectl --kubeconfig MANAGEMENT_API_SERVER \
        get virtualmachinedisks.virtualmachine.gdc.goog --namespace PROJECT \
        DISK_NAME -o jsonpath='{.spec.size}'
    
  5. 在 Management API 服务器中创建 VirtualMachineImageImport 对象:

    kubectl --kubeconfig MANAGEMENT_API_SERVER \
        apply -n PROJECT -f - <<EOF
    apiVersion: virtualmachine.gdc.goog/v1
    kind: VirtualMachineImageImport
    metadata:
      name: VM_IMAGE_IMPORT_NAME
    spec:
      source:
        diskRef:
          name: DISK_NAME
      imageMetadata:
        name: IMAGE_NAME
        operatingSystem: OS_NAME
        minimumDiskSize: MINIMUM_DISK_SIZE
    EOF
    
  6. 验证映像导入是否已完成且状态为 Ready

    kubectl --kubeconfig MANAGEMENT_API_SERVER \
        get virtualmachineimageimports.virtualmachine.gdc.goog --namespace PROJECT \
        VM_IMAGE_IMPORT_NAME -o jsonpath='{.status}'
    

    导入完成后,状态应如下所示:

    {
      "conditions": [
        {
          "lastTransitionTime": "",
          "message": "",
          "observedGeneration": 1,
          "reason": "ImportJobComplete",
          "status": "True",
          "type": "Ready"
        }
      ],
      "imageName": IMAGE_NAME
    }
    
  7. 验证映像是否已创建:

    kubectl --kubeconfig MANAGEMENT_API_SERVER \
        get virtualmachineimages.virtualmachine.gdc.goog --namespace PROJECT \
        CREATED_IMAGE_NAME
    

    使用以下定义替换变量。

    变量定义
    MANAGEMENT_API_SERVER 管理 API 服务器 kubeconfig 文件。
    PROJECT 要在其中创建映像的 GDC 项目。
    DISK_NAME 源磁盘的名称,例如 vm1-boot-disk
    VM_IMAGE_IMPORT_NAME 虚拟机映像导入的名称。名称不得超过 35 个字符。
    IMAGE_NAME 所创建映像的名称,例如 custom-image
    OS_NAME 映像操作系统的名称,必须是以下三个名称之一:
    ubuntu-2004windows-2019rhel-8
    MINIMUM_DISK_SIZE 虚拟机映像导入中的最小磁盘大小(例如 20G:
    minimumDiskSize)必须始终大于或等于源启动磁盘大小。
    CREATED_IMAGE_NAME 所创建映像的名称。 创建的映像名称必须是唯一的;不能是项目中已存在的映像名称。