导入虚拟设备


虚拟设备是包含虚拟机 (VM) 实例磁盘映像和硬件配置的软件包。

OVF 格式是一种广泛使用的热门虚拟设备格式。当您以 OVF 格式打包虚拟设备时,系统会生成一个 OVF 软件包。OVF 软件包是一个包含 .ovf 描述符文件以及其他一系列资源(例如磁盘)的文件夹。当 OVF 软件包归档为单个文件时,它被称为 OVA 文件。

您可以将 OVF 格式的虚拟机(无论是 OVF 软件包还是 OVA 单个文件)导入到 Compute Engine。如需检查使用虚拟设备是否是适合您的使用场景的最佳选择,请查看选择迁移路径

导入虚拟设备时,导入过程使用存储在描述符文件中的信息在 Compute Engine 上创建并启动虚拟机。

在 Compute Engine 上,您可以按如下方式导入 OVA 或 OVF 文件:

准备工作

  • 如果要导入虚拟设备的项目已定义可信映像政策,请将 projects/compute-image-importprojects/compute-image-tools 添加到许可的发布商名单中。
  • 如果您要从其他项目导入虚拟设备,请参阅跨项目导入
  • 如需了解如何满足导入映像的要求,请参阅导入和导出虚拟机映像的前提条件
  • 如果您尚未设置身份验证,请进行设置。身份验证是通过其进行身份验证以访问 Google Cloud 服务和 API 的过程。如需从本地开发环境运行代码或示例,您可以按如下方式向 Compute Engine 进行身份验证。

    Select the tab for how you plan to use the samples on this page:

    gcloud

    1. Install the Google Cloud CLI, then initialize it by running the following command:

      gcloud init
    2. Set a default region and zone.
    3. REST

      如需在本地开发环境中使用本页面上的 REST API 示例,请使用您提供给 gcloud CLI 的凭据。

        Install the Google Cloud CLI, then initialize it by running the following command:

        gcloud init

      如需了解详情,请参阅 Google Cloud 身份验证文档中的使用 REST 时进行身份验证

要求

本部分列出了将虚拟设备导入 Compute Engine 的要求。

源虚拟机要求

用于创建 OVF 文件的虚拟机必须满足以下要求:

  • 虚拟磁盘必须采用 VMDK 或 VHD 格式。
  • 虚拟磁盘不得加密。

    如需验证虚拟机是否满足要求,您可以运行预检工具

源虚拟机的操作系统应满足以下要求:

  • 无论选用哪种 Windows 操作系统,都必须安装 PowerShell 版本 3 或更高版本。版本低于 3.0 的 PowerShell 可能会导致导入过程中使用的启动和关闭脚本出现问题。
  • 对于所有 Linux 发行版,启动磁盘必须满足以下要求:

    • 启动磁盘必须已安装 GRUB。
    • 启动磁盘不得跨越多个物理磁盘。不支持使用 Logical Volume Manager (LVM) 分区的磁盘。如果磁盘跨越多个物理磁盘,则从 OVF 文件创建的虚拟机可能无法在 Compute Engine 上启动。

OVF 文件要求

OVF 文件必须满足以下要求:

  • OVF 文件必须如 OVF 规范文档所述那样提供 Level 1 可移植性。符合 Level 2 可移植性的虚拟设备会被导入,但在导入过程中会忽略所有自定义扩展程序,例如源管理程序的具体细节。
  • OVF 文件必须只包含一个虚拟机。如果存在多个虚拟机,则仅导入第一个虚拟机。
  • OVF 文件中的第一个磁盘必须是可启动磁盘。

权限

如需在导入映像时启用无缝体验,请确保您已向您的账号、Cloud Build 服务账号和 Compute Engine 服务账号授予所需的 IAM 角色。如需了解详情,请参阅授予所需的 IAM 角色

通过导入工具导入的配置

OVF 标准以不依赖虚拟化提供程序的方式指定打包虚拟设备的过程。OVF 虚拟设备软件包包含一个 .ovf 描述符文件和一组其他资源(例如虚拟磁盘)。

将 OVF 虚拟设备导入 Compute Engine 时,系统会处理并导入描述符文件中的以下配置:

  • 虚拟磁盘。从 OVF 软件包的 DiskSection 元素检索的信息。
  • CPU 和内存。从 OVF 软件包的 ResourceAllocationSection 中检索而来。

    如果 CPU 或内存配置超出 Compute Engine 支持的范围限制,则导入过程会将值设置为 Compute Engine 支持的最大值。

  • 启动磁盘。从 OVF 软件包的 BootDeviceSection 元素检索的详细信息。

  • 访客操作系统。从 OVF 软件包的 OperatingSystemSection 元素检索的详细信息。

    访客操作系统信息用于在导入的实例上安装正确的驱动程序和访客环境软件包。如果在 OVF 中找到的访客操作系统信息不正确,则导入失败。您可以使用 --os 标志替换客机操作系统信息。

始终使用具有外部 IP 地址的单一网络适配器创建导入的虚拟机。无论 OVF 文件中指定什么样的网络配置,都使用此单一网络适配器。如需导入没有外部 IP 地址的虚拟机,请参阅导入没有外部 IP 地址的虚拟机

导入虚拟设备时,忽略(不导入)描述符文件的以下部分:

  • NetworkSection
  • AnnotationSection
  • ProductSection
  • EulaSection
  • StartupSection
  • DeploymentOptionSection
  • InstallSection
  • EnvironmentFilesSection
  • SharedDiskSection
  • ScaleOutSection
  • PlacementGroupSection
  • PlacementSection
  • EncryptionSection

限制

对于受 VPC Service Controls 保护的项目,不支持此功能。

支持的操作系统

您可以选择在描述符文件OperatingSystemSection 元素中指定操作系统,或在使用 gcloud compute instances import 命令时指定 --os 标志。

如需了解哪些操作系统受支持,请参阅操作系统详细信息

支持 BYOL 和 BYOS

默认情况下,系统会导入使用 Windows Server 和 Red Hat Enterprise Linux (RHEL) 操作系统的 OVF 文件,并将其配置为使用付费操作系统的按需结算方式,这可能会产生额外费用。

如果您希望使用自己的软件许可或订阅,则可以导入虚拟设备及其许可。如需了解支持 BYOL 或 BYOS 的操作系统,请参阅操作系统详细信息

您可以使用带有 --byol 标志的 gcloud compute instances import 命令,从而将设备作为自带许可 (BYOL) 的设备导入。如果您要手动指定操作系统,请使用 --os 标志指定一个值,在其中包含要导入的客户机操作系统的 byol 后缀。例如,--os=rhel-8-byol 会导入具备现有许可的 RHEL 8 映像。

跨项目导入

  • 源项目:存储 OVA 或 OVF 文件的项目。
  • 目标项目:要在其中创建虚拟机或机器映像的项目。

如果源项目和目标项目不同,则目标项目中的服务账号需要对源项目中 Cloud Storage 存储分区的访问权限。

如需进行跨项目导入,请完成以下步骤:

  1. 在源项目中,找到 Cloud Storage 存储桶。
  2. 在 Cloud Storage 存储分区上,将 roles/storage.objectViewer 授予以下服务账号:

    • 目标项目的 Cloud Build 服务账号:此服务账号的格式为 DESTINATION_PROJECT_NUMBER@cloudbuild.gserviceaccount.com
    • 目标项目的 Compute Engine 服务账号:此服务账号的格式为 DESTINATION_PROJECT_NUMBER-compute@developer.gserviceaccount.com

    DESTINATION_PROJECT_NUMBER 替换为目标项目的编号

    如需了解如何授予对 Cloud Storage 存储桶的访问权限,请参阅向存储桶级别政策添加主账号

  3. 导入虚拟设备机器映像

导入虚拟设备

您可以使用 Google Cloud CLIREST 来导入虚拟设备。

导入 OVA 文件

gcloud

  1. 将虚拟设备上传至 Cloud Storage
  2. 如需将 OVA 文件从 Cloud Storage 导入到 Compute Engine,请使用 gcloud compute instances import 命令。

    gcloud compute instances import VM_NAME \
       --source-uri=gs:PATH_TO_OVA_FILE
    

    替换以下内容:

    • VM_NAME:要创建的实例的名称。
    • PATH_TO_OVA_FILE:您的 OVA 文件在 Cloud Storage 上的路径

    示例

    例如,如需导入 OVA 文件 Ubuntu.ova 并创建名为 my-instance 的实例,请运行以下命令:

    gcloud compute instances import my-instance \
        --source-uri=gs://my-bucket/Ubuntu.ova
    

    如果 OVF 描述符文件中的客户机操作系统信息不正确,或者您想要替换检测到的操作系统,则可以通过添加 --os 标志来指定操作系统。如需获取受支持值的列表,请查看 gcloud compute instances import 命令的 --os 标志选项。

    例如,如需导入 OVA 文件 Ubuntu.ova 并创建运行 Ubuntu 16.04 的名为 my-instance 的实例,请运行以下命令:

    gcloud compute instances import my-instance \
        --os=ubuntu-1604
        --source-uri=gs://my-bucket/Ubuntu.ova
    

REST

  1. 将虚拟设备上传至 Cloud Storage

  2. Cloud Build API 发送 POST 请求。

    POST https://cloudbuild.googleapis.com/v1/projects/PROJECT_ID/builds
    {
     "timeout": "7200s",
     "steps":[
       {
         "args":[
           "-instance-names=VM_NAME",
           "-ovf-gcs-path=SOURCE_URI",
           "-zone=ZONE",
           "-client-id=api",
           "-timeout=7000s"
         ],
         "name":"gcr.io/compute-image-tools/gce_ovf_import:release",
         "env":[
           "BUILD_ID=$BUILD_ID"
         ]
       }
     ],
     "tags":[
       "gce-ovf-import"
     ]
    }
    

    请替换以下内容:

    • PROJECT_ID:要将 OVA 文件导入到其中的项目的项目 ID。
    • VM_NAME:要创建的虚拟机实例的名称,例如 my-instance
    • SOURCE_URI:存储在 Cloud Storage 中的 OVA 文件的 URI,例如 gs://my-bucket/my-instance.ova
    • ZONE:要在其中创建虚拟机实例的可用区。如果留空,则使用项目的默认可用区。

    如需查看可提供的其他 args 值,请参阅 Compute Engine OVF 导入 GitHub 页面的可选标志部分。

    示例响应

    以下示例响应类似于返回的输出:

    {
    "name": "operations/build/myproject-12345/operation-1578608233418",
    "metadata": {
      "@type": "type.googleapis.com/google.devtools.cloudbuild.v1.BuildOperationMetadata",
      "build": {
        "id": "3a2055bc-ccbd-4101-9434-d376b88b8940",
        "status": "QUEUED",
        "createTime": "2019-12-30T19:06:03.968694865Z",
        "steps": [
          {
            "name": "gcr.io/compute-image-tools/gce_ovf_import:release",
            "env": [
              "BUILD_ID=3a2055bc-ccbd-4101-9434-d376b88b8940"
            ],
            "args": [
              "-instance-names=my-instance",
              "-ovf-gcs-path=gs://my-bucket/my-instance.ova",
              "-zone=asia-northeast2",
              "-client-id=api",
              "-timeout": "7056s"
            ]
          }
        ],
        "timeout": "7200s",
        "projectId": "myproject-12345",
        "logsBucket": "gs://12345.cloudbuild-logs.googleusercontent.com",
        "options": {
          "logging": "LEGACY"
        },
        "logUrl": "https://console.cloud.google.com/cloud-build/builds/3a2055bc-ccbd-4101-9434-d376b88b8940?project=myproject-12345",
        "tags": [
          "gce-ovf-import"
        ]
      }
    }
    }
    

    如需监控您的版本,您可以使用以下方法之一:

    • 使用返回的 build-id 运行 projects.builds.get 请求。
    • 查看在提供的 logUrl 下托管的日志。

导入 OVF 文件

gcloud

  1. 将虚拟设备上传至 Cloud Storage
  2. 如需将 OVF 文件从 Cloud Storage 导入到 Compute Engine,请使用 gcloud compute instances import 命令。

    如果您的目录只包含一个 OVF 文件,则您要么提供描述符文件的路径,要么提供包含 OVF 文件的目录的路径。

    • 如需使用描述符文件的路径导入 OVF 文件,请运行以下命令:

      gcloud compute instances import VM_NAME \
       --source-uri=gs:PATH_TO_OVF_FILE
      
    • 如需使用目录路径导入 OVF 文件,请运行以下命令:

      gcloud compute instances import VM_NAME \
       --source-uri=gs:PATH_TO_OVF_DIRECTORY
      

    替换以下内容:

    • VM_NAME:要创建的实例的名称
    • PATH_TO_OVF_FILE:Cloud Storage 上 OVF 文件的路径
    • PATH_TO_OVF_DIRECTORY:Cloud Storage 上包含 OVF 文件的目录的路径

    示例

    • 如需从 my-ovf-directory 目录中导入 OVF 文件 Ubuntu.ovf 以创建名为 my-instance 的实例,请运行以下命令:

      gcloud compute instances import my-instance \
       --source-uri=gs://my-bucket/my-ovf-directory/Ubuntu.ovf
      
    • 如需从 my-ovf-directory 目录中导入 OVF 文件以创建名为 my-instance 的实例,请运行以下命令:

      gcloud compute instances import my-instance \
       --source-uri=gs://my-bucket/my-ovf-directory
      

      如果 OVF 描述符文件中的客户机操作系统信息不正确,或者您想要替换检测到的操作系统,则可以通过添加 --os 标志来指定操作系统。如需获取受支持值的列表,请查看 gcloud compute instances import 命令的 --os 标志选项。 例如,如需导入 OVF 文件 Ubuntu.ovf 并创建运行 Ubuntu 16.04 的名为 my-instance 的实例,请运行以下命令:

      gcloud compute instances import my-instance \
       --os=ubuntu-1604 \
       --source-uri=gs://my-bucket/my-ovf-directory/Ubuntu.ovf
      

REST

  1. 将虚拟设备添加到 Cloud Storage

  2. Cloud Build API 发送 POST 请求。

    POST https://cloudbuild.googleapis.com/v1/projects/PROJECT_ID/builds
    {
     "timeout": "7200s",
     "steps":[
       {
         "args":[
           "-instance-names=VM_NAME",
           "-ovf-gcs-path=SOURCE_URI",
           "-os=OS",
           "-zone=ZONE",
           "-client-id=api",
           "-timeout=7000s"
         ],
         "name":"gcr.io/compute-image-tools/gce_ovf_import:release",
         "env":[
           "BUILD_ID=$BUILD_ID"
         ]
       }
     ],
     "tags":[
       "gce-ovf-import"
     ]
    }
    

    请替换以下内容:

    • PROJECT_ID:要将 OVA 文件导入到其中的项目的项目 ID。
    • VM_NAME:要创建的虚拟机实例的名称,例如 my-instance
    • SOURCE_URI:存储在 Cloud Storage 中的 OVF 文件的 URI,例如 gs://my-bucket/my-instance.ovf
    • OS:OVF 文件的操作系统,例如 ubuntu-1604。默认情况下,--os 标志是可选的,但您可以使用此标志替换系统检测到的操作系统。如需获取受支持的值的列表,请查看 gcloud compute instances import 命令的 --os 标志选项。
    • ZONE:要在其中创建虚拟机实例的可用区。如果留空,则使用项目的默认可用区。

    如需查看可提供的其他 args 值,请参阅 Compute Engine OVF 导入 GitHub 页面的可选标志部分。

    示例响应

    以下示例响应类似于返回的输出:

    {
    "name": "operations/build/myproject-12345/operation-1578608233418",
    "metadata": {
      "@type": "type.googleapis.com/google.devtools.cloudbuild.v1.BuildOperationMetadata",
      "build": {
        "id": "3a2055bc-ccbd-4101-9434-d376b88b8940",
        "status": "QUEUED",
        "createTime": "2019-12-30T19:06:03.968694865Z",
        "steps": [
          {
            "name": "gcr.io/compute-image-tools/gce_ovf_import:release",
            "env": [
              "BUILD_ID=3a2055bc-ccbd-4101-9434-d376b88b8940"
            ],
            "args": [
              "-instance-names=my-instance",
              "-ovf-gcs-path=gs://my-bucket/my-instance.ovf",
              "-os=ubuntu-1404",
              "-zone=asia-south1",
              "-client-id=api",
              "-timeout": "7056s"
            ]
          }
        ],
        "timeout": "7200s",
        "projectId": "myproject-12345",
        "logsBucket": "gs://12345.cloudbuild-logs.googleusercontent.com",
        "options": {
          "logging": "LEGACY"
        },
        "logUrl": "https://console.cloud.google.com/cloud-build/builds/3a2055bc-ccbd-4101-9434-d376b88b8940?project=myproject-12345",
        "tags": [
          "gce-ovf-import"
        ]
      }
    }
    }
    

    您可以通过以下几种方式监控您的版本:

    • 使用返回的 build-id 运行 projects.builds.get 请求。
    • 查看在提供的 logUrl 下托管的日志。

使用自定义设置导入

自定义 CPU 和内存

gcloud

如需替换在 OVF 文件中指定的 CPU 或内存配置,请按照 Google Cloud CLI 步骤导入一个 OVA 文件或导入一个 OVF 文件,并指定 --custom-cpu--custom-memory 标志。

示例

例如,如需导入名为 my-instance 的实例(具有 2 个 CPU 和 2048 MB 内存),请运行以下命令:

gcloud compute instances import my-instance \
    --source-uri=gs://my-bucket/Ubuntu.ova \
    --custom-cpu=2 --custom-memory=2048MB

REST

如需替换在 OVF 文件中指定的 CPU 或内存配置,请按照 Cloud Build API 步骤导入一个 OVA导入一个 OVF 文件并指定 -machine-type 参数。此 -machine-type 表示要使用的预定义自定义机器类型。

示例

例如,如需导入名为 my-instance 的实例(具有 2 个 CPU 和 2048 MB 内存),请使用以下请求。请将 PROJECT_ID 替换为您的项目 ID。

POST https://cloudbuild.googleapis.com/v1/projects/PROJECT_ID/builds
{
  "timeout":"7200s",
  "steps":[
    {
      "args":[
        "-instance-names=my-instance",
        "-ovf-gcs-path=gs://my-bucket/Ubuntu.ova",
        "-machine-type=custom-2-2048",
        "-zone=asia-south1",
        "-client-id=api",
        "-timeout=7056s"
      ],
      "name":"gcr.io/compute-image-tools/gce_ovf_import:release",
      "env":[
        "BUILD_ID=$BUILD_ID"
      ]
    }
  ],
  "tags":[
    "gce-ovf-import"
  ]
}

自定义网络

自定义网络必须在要将映像导入到其中的项目中定义。

gcloud

如需使用自定义网络,请按照 Google Cloud CLI 步骤导入一个 OVA 文件或导入一个 OVF 文件,并指定 --network 标志。如果该网络配置了自定义子网模式,您还必须指定 --subnet--zone 标志。

示例 1 - 使用自定义网络

例如,假设有以下属性:

  • 虚拟机名称:my-instance
  • 网络:custom-vpc-network
  • 子网:company-vpc-us-east1-c
  • 可用区:us-east1-c

运行以下命令以导入具有上述属性的实例。将 SERVICE_PROJECT_ID 替换为要向其中导入虚拟设备的项目的 ID。

gcloud compute instances import my-instance \
    --source-uri=gs://my-bucket/Ubuntu.ova \
    --project SERVICE_PROJECT_ID \
    --network custom-vpc-network \
    --subnet company-vpc-us-east1-c \
    --zone us-east1-c

示例 2 - 使用自定义网络(共享 VPC)

例如,假设有以下属性:

  • 虚拟机名称:my-instance-2
  • 网络:my-shared-vpc
  • 子网:my-shared-subnet
  • 可用区:us-east1-c

如需导入具有上述属性的虚拟机,请完成以下步骤:

  1. compute.networkUser 角色添加到 Cloud Build 服务账号:如需了解详情,请参阅向 Cloud Build 服务账号授予所需角色

  2. 导入虚拟机。

    gcloud compute instances import my-instance-2 \
       --source-uri gs://my-bucket/Ubuntu.ova \
       --project SERVICE_PROJECT_ID \
       --network projects/HOST_PROJECT_ID/global/networks/my-shared-vpc \
       --subnet projects/HOST_PROJECT_ID/regions/us-east1/subnetworks/my-shared-subnet
       --zone us-east1-c
    

    替换以下内容:

    • SERVICE_PROJECT_ID:要向其中导入虚拟设备的项目的 ID
    • HOST_PROJECT_ID:共享 VPC 所属项目的 ID

REST

如需使用自定义网络,请按照 Cloud Build API 步骤导入一个 OVA导入一个 OVF 文件并指定 -network 参数。如果该网络配置了自定义子网模式,您还必须指定 -subnet-zone 参数。

示例 - 使用自定义网络

例如,假设有以下属性:

  • 虚拟机名称:my-instance
  • 网络:custom-vpc-network
  • 子网:company-vpc-us-east1-c
  • 可用区:us-east1-c

创建以下 POST 请求以导入具有上述属性的实例。将 SERVICE_PROJECT_ID 替换为要向其中导入虚拟设备的项目的 ID。

POST https://cloudbuild.googleapis.com/v1/projects/SERVICE_PROJECT_ID/builds
{
  "timeout":"7200s",
  "steps":[
    {
      "args":[
        "-instance-names=my-instance",
        "-ovf-gcs-path=gs://my-bucket/Ubuntu.ova",
        "-zone=us-east1-c",
        "-network=custom-vpc-network",
        "-subnet=company-vpc-us-east1-c",
        "-client-id=api",
        "-timeout=7000s"
      ],
      "name":"gcr.io/compute-image-tools/gce_ovf_import:release",
      "env":[
        "BUILD_ID=$BUILD_ID"
      ]
    }
  ],
  "tags":[
    "gce-ovf-import"
  ]
}

示例 2 - 使用自定义网络(共享 VPC)

例如,假设有以下属性:

  • 虚拟机名称:my-instance-2
  • 网络:my-shared-vpc
  • 子网:my-shared-subnet
  • 可用区:us-east1-c

如需导入具有上述属性的虚拟机,请完成以下步骤:

  1. compute.networkUser 角色添加到 Cloud Build 服务账号:如需了解详情,请参阅向 Cloud Build 服务账号授予所需角色

  2. 创建以下 POST 请求以导入虚拟机。

    POST https://cloudbuild.googleapis.com/v1/projects/SERVICE_PROJECT_ID/builds
    {
     "timeout":"7200s",
     "steps":[
       {
         "args":[
           "-instance-names=my-instance-2",
           "-ovf-gcs-path=gs://my-bucket/Ubuntu.ova",
           "-zone=us-east1-c",
           "-network=projects/HOST_PROJECT_ID/global/networks/my-shared-vpc",
           "-subnet=projects/HOST_PROJECT_ID/regions/us-east1/subnetworks/my-shared-subnet",
           "-client-id=api",
           "-timeout=7000s"
         ],
         "name":"gcr.io/compute-image-tools/gce_ovf_import:release",
         "env":[
           "BUILD_ID=$BUILD_ID"
         ]
       }
     ],
     "tags":[
       "gce-ovf-import"
     ]
    }
    

    替换以下内容:

    • SERVICE_PROJECT_ID:要向其中导入虚拟设备的项目的 ID。
    • HOST_PROJECT_ID:共享 VPC 所属项目的 ID。

使用不允许外部 IP 地址的网络来导入虚拟机

如需使用不允许外部 IP 地址的网络导入虚拟机,请完成以下步骤:

  1. 将虚拟设备添加到 Cloud Storage

  2. 导入过程要求在虚拟机的操作系统上安装软件包管理器。这些软件包管理器可能需要对 Google Cloud 外部的软件包代码库发出请求。若要允许访问这些更新,您需要配置 Cloud NAT。如需了解详情,请参阅使用 Cloud Router 创建 NAT 配置

  3. 配置专用 Google 访问通道。如需了解详细说明,请参阅配置专用 Google 访问通道

  4. 使用 Google Cloud CLI 或 REST 导入虚拟机。

    从虚拟设备创建虚拟机时,系统会在项目中创建临时虚拟机。为确保这些临时虚拟机未被分配外部 IP 地址,您必须指定其他标志或参数。

    如需了解详情,请点击以下标签页:

gcloud

如需将虚拟设备从 Cloud Storage 导入到 Compute Engine,请使用带有 --no-address 标志的 gcloud compute instances import 命令

gcloud compute instances import VM_NAME \
    --source-uri=SOURCE_URI \
    --zone=ZONE \
    --no-address

请替换以下内容:

  • VM_NAME:要创建的实例的名称。
  • SOURCE_URI:Cloud Storage 上的 OVA 或 OVF 文件的 URI。例如 gs://my-bucket/Ubuntu.ova
  • ZONE:要在其中创建虚拟设备的可用区。如果留空,则使用项目的默认可用区。

REST

您可以使用 Cloud Build API 并替换外部 IP 地址,从而导入没有外部 IP 地址的虚拟机。

如需替换在 OVF 文件中指定的外部 IP 地址设置,请按照 Cloud Build API 步骤导入一个 OVA导入一个 OVF 文件并指定 -no-external-ip 参数。

POST https://cloudbuild.googleapis.com/v1/projects/PROJECT_ID/builds
{
  "timeout":"7200s",
  "steps":[
    {
      "args":[
        "-instance-names=VM_NAME",
        "-ovf-gcs-path=SOURCE_FILE",
        "-no-external-ip",
        "-zone=ZONE",
        "-client-id=api",
        "-timeout=7000s"
      ],
      "name":"gcr.io/compute-image-tools/gce_ovf_import:release",
      "env":[
        "BUILD_ID=$BUILD_ID"
      ]
    }
  ],
  "tags":[
    "gce-ovf-import"
  ]
}

请替换以下内容:

  • PROJECT_ID:要将映像导入到其中的项目的项目 ID。
  • VM_NAME:要创建的虚拟机的名称。
  • SOURCE_FILE:Cloud Storage 中映像的 URI,例如 gs://my-bucket/Ubuntu.ova
  • ZONE:要在其中创建映像的可用区。如果留空,则使用项目的默认可用区。

使用 UEFI 引导加载程序来导入 OVA 文件

gcloud

您可以使用 gcloud compute instances import 命令强制执行导入以使用 UEFI 启动。

gcloud compute instances import VM_NAME \
  --source-uri=SOURCE_URI \
  --guest-os-features=UEFI_COMPATIBLE

替换以下内容:

  • VM_NAME:您要创建的虚拟机的名称。
  • SOURCE_URI:Cloud Storage 上的 OVA 或 OVF 文件的 URI。例如 gs://my-bucket/Ubuntu.ova

REST

您可以使用 Cloud Build API 并指定 -uefi-compatible 参数,导入带有 UEFI 引导加载程序的 OVA 文件。

  1. 将虚拟设备上传至 Cloud Storage

  2. 在 API 中,创建一个指向 Cloud Build API 的 POST 请求。

    POST https://cloudbuild.googleapis.com/v1/projects/PROJECT_ID/builds
    {
     "timeout": "7200s",
     "steps":[
       {
         "args":[
           "-instance-names=VM_NAME",
           "-ovf-gcs-path=SOURCE_URI",
           "-uefi-compatible",
           "-zone=ZONE",
           "-client-id=api",
           "-timeout=7000s"
         ],
         "name":"gcr.io/compute-image-tools/gce_ovf_import:release",
         "env":[
           "BUILD_ID=$BUILD_ID"
         ]
       }
     ],
     "tags":[
       "gce-ovf-import"
     ]
    }
    

    请替换以下内容:

    • PROJECT_ID:要将 OVA 文件导入到其中的项目的项目 ID。
    • VM_NAME:要创建的虚拟机实例的名称,例如 my-instance
    • SOURCE_URI:存储在 Cloud Storage 中的 OVA 文件的 URI,例如 gs://my-bucket/my-instance.ova
    • ZONE:要在其中创建虚拟机实例的可用区。如果留空,则使用项目的默认可用区。

使用自定义服务账号导入虚拟设备

在虚拟设备导入期间,系统会在您的项目中创建临时虚拟机 (VM)。这些临时虚拟机上的导入工具必须经过身份验证。

服务账号是关联到虚拟机的身份。服务账号访问令牌可通过实例元数据服务器访问,用于对虚拟机上的导入工具进行身份验证。

默认情况下,导入过程使用默认 Compute Engine 服务账号。但是,如果您在项目中停用了默认 Compute Engine 服务账号,或者如果要使用自定义 Compute Engine 服务账号,则需要创建一个服务账号并针对导入过程指定该账号。

gcloud

  1. 将虚拟设备添加到 Cloud Storage

  2. 创建服务账号并分配最小角色。如需详细了解如何创建服务账号,请参阅创建和管理服务账号

    指定的 Compute Engine 服务账号必须至少具有以下角色:

    • roles/compute.storageAdmin
    • roles/storage.objectViewer

    --compute-service-account 标志指定的服务账号至少需要这些角色。 如需了解详情,请参阅为 Compute Engine 服务账号授予所需角色

  3. 使用 gcloud compute instances import 命令导入虚拟设备。

    gcloud compute instances import VM_NAME \
    --source-uri=SOURCE_URI \
    --zone=ZONE \
    --compute-service-account=TEMP_SERVICE_ACCOUNT_EMAIL \
    --service-account=SERVICE_ACCOUNT_EMAIL \
    --scopes=SCOPES
    

    请替换以下内容:

    • VM_NAME:要创建的实例的名称。
    • SOURCE_URI:Cloud Storage 上的 OVA 或 OVF 文件的 URI。例如 gs://my-bucket/Ubuntu.ova
    • ZONE:要在其中创建虚拟设备的可用区。如果留空,则使用项目的默认可用区。
    • TEMP_SERVICE_ACCOUNT_EMAIL:与上一步中创建的自定义服务账号关联的电子邮件地址。此服务账号由临时虚拟机使用。如果未指定,则虚拟机会使用默认的 Compute Engine 服务账号。
    • SERVICE_ACCOUNT_EMAIL:与要附加到导入过程创建的虚拟机的自定义服务账号关联的电子邮件地址。此服务账号没有权限限制,您可以根据需要对其进行自定义。如果未指定,则默认的 Compute Engine 服务账号会挂接到该虚拟机。
    • SCOPES:指定 --service-account 选项的访问权限级别。如果未指定,则使用默认范围。有关详情,请查看 --scopes 标志

REST

  1. 将虚拟设备添加到 Cloud Storage

  2. 创建服务账号并分配最小角色。如需详细了解如何创建服务账号,请参阅创建和管理服务账号

    指定的 Compute Engine 服务账号必须至少具有以下角色:

    • roles/compute.storageAdmin
    • roles/storage.objectViewer

    -compute-service-account 参数指定的服务账号至少需要这些角色。如需了解详情,请参阅为 Compute Engine 服务账号授予所需角色

  3. 在 API 中,创建一个指向 Cloud Build API 的 POST 请求。

    POST https://cloudbuild.googleapis.com/v1/projects/PROJECT_ID/builds
    {
      "timeout":"7200s",
      "steps":[
        {
          "args":[
            "-instance-names=VM_NAME",
            "-ovf-gcs-path=SOURCE_FILE",
            "-compute-service-account=TEMP_SERVICE_ACCOUNT_EMAIL",
            "-service-account=SERVICE_ACCOUNT_EMAIL",
            "-zone=ZONE",
            "-scopes=SCOPES",
            "-client-id=api",
            "-timeout=7000s"
          ],
          "name":"gcr.io/compute-image-tools/gce_ovf_import:release",
          "env":[
            "BUILD_ID=$BUILD_ID"
          ]
        }
      ],
      "tags":[
        "gce-ovf-import"
      ]
    }
    

    请替换以下内容:

    • PROJECT_ID:要将映像导入到其中的项目的项目 ID。
    • VM_NAME:要创建的虚拟机的名称。
    • SOURCE_FILE:Cloud Storage 中映像的 URI,例如 gs://my-bucket/Ubuntu.ova
    • ZONE:要在其中创建映像的可用区。如果留空,则使用项目的默认可用区。
    • TEMP_SERVICE_ACCOUNT_EMAIL:与上一步中创建的自定义服务账号关联的电子邮件地址。此服务账号由临时虚拟机使用。如果未指定,则虚拟机会使用默认的 Compute Engine 服务账号。
    • SERVICE_ACCOUNT_EMAIL:与要附加到导入过程创建的虚拟机的自定义服务账号关联的电子邮件地址。此服务账号没有权限限制,您可以根据需要对其进行自定义。如果未指定,则默认的 Compute Engine 服务账号会挂接到该虚拟机。
    • SCOPES:指定 -service-account 选项的访问权限级别。如果未指定,则使用默认范围。有关详情,请查看 --scopes 标志

后续步骤