通过自带许可使用单租户节点

Compute Engine 可让您通过自带许可 (BYOL) 使用单租户节点,以支持限制物理硬件用量的许可要求。具体来说,您可以使用单租户节点将自定义映像导入 Compute Engine 中,使用该映像启动虚拟机,并启用就地重启功能,以便让该虚拟机尽可能在同一物理服务器上重启。通过使用单租户节点来托管您的虚拟机,您可以确保这些虚拟机在完全专供您使用的硬件上运行,同时限制物理核心用量。Compute Engine 还可提供服务器用量报告,便于您通过跟踪物理硬件信息来了解许可用量。

如需了解此功能(包括要求和工作负载注意事项)的概览,请参阅概览页面。

准备工作

查看受支持的操作系统和许可要求

在开始此过程之前,请确保您的操作系统兼容,并且您已经查看了许可和激活部分。您要负责确保您的许可协议允许按照本文档所述的方式在 BYOL 环境中使用软件。此外,您还必须根据您的协议准备 BYOL 客机映像。

如果您有任何疑问或需要其他支持,请联系您的许可转销商(对于许可问题)或 Google Cloud 支持团队(对于有关此功能的问题)。

查看受支持的区域

此功能仅适用于特定区域。如需获取完整列表,请参阅价格和可用性

考虑您的工作负载

此功能更适合某一些工作负载。如需了解一般性的建议,请参阅工作负载注意事项

创建新项目并申请配额

如果您还没有项目,请创建一个新项目

新项目的 CPU 配额限制为 100 个 CPU。这一配额可能不足以满足您的需求。如果您的项目需要更多配额,可以通过 GCP Console 中的“配额”页面申请调整配额。您可能还需要增加其他资源(例如 IP 地址)的配额,具体取决于您的设置。

启用 Cloud Build API

此功能使用 Cloud Build 服务导入和创建 Compute Engine 映像。您必须启用 Cloud Build API 才能使用此功能。

启用 Cloud Build API

Compute Engine 还将为 Cloud Build 服务帐号授予以下角色,以便其将映像导入 Compute Engine 中:

  • roles/iam.serviceAccountTokenCreator
  • roles/compute.admin
  • roles/iam.serviceAccountUser

启用 Stackdriving Logging 以进行审核日志记录

如果许可要求报告物理服务器用量,请先启用 Stackdriving Logging API,然后再将虚拟机启动到单租户节点。这样您便能够使用 BigQuery(强烈推荐)导入和查看服务器用量信息。

启用 Stackdriving Logging API

通过设置日志记录,您可以利用 BigQuery 来跟踪相关信息(例如物理核心数用量),以满足您的许可需求。如需了解详情,请参阅确定服务器用量

创建虚拟磁盘文件

您必须已有一个虚拟磁盘文件(VMDK、VHD)才能将映像导入 Compute Engine 中。系统不支持从安装映像(例如 iso、img、DVD、USB 等)将操作系统直接安装到虚拟机,也不支持在 Compute Engine 虚拟机上就地升级操作系统。

创建虚拟磁盘文件的步骤因环境而异;请参阅与您的操作系统对应的文档。

导入虚拟磁盘文件

要使用您自己的许可启动虚拟机,您需要导入一个包含您要使用的操作系统的虚拟磁盘。可使用 gcloud 工具导入您的文件;gcloud 工具支持从 Google Cloud Storage 存储分区或本地工作站导入 VHD 或 VMDK。如果虚拟磁盘托管在本地机器上,则导入过程会先将文件上传到 Cloud Storage 存储分区,然后再将映像导入到 Compute Engine 中。

在导入虚拟机的磁盘之前,请先下载我们的预检工具并在虚拟机内部运行该工具。此预检工具可帮助验证在迁移到 GCP 时是否存在不兼容问题

如果全面了解映像导入工具,请参阅导入虚拟磁盘

准备就绪后,可运行以下 gcloud 命令来导入您的虚拟磁盘:

gcloud compute images import [IMAGE_NAME] \
    --source-file [SOURCE_FILE] \
    --os [OS]

其中:

  • [IMAGE_NAME] 是您要为此映像指定的名称。
  • [SOURCE_FILE] 是一个虚拟磁盘文件,可以托管在本地,也可以存储在 Cloud Storage 中。如果您的虚拟磁盘是本地文件,您可以使用绝对路径或相对路径。如果您的虚拟磁盘文件已存储在 Cloud Storage 中,则该文件必须位于导入过程要使用的项目的存储分区内,并且您必须按 gs://[BUCKET_NAME]/[OBJECT_NAME] 格式指定该文件的完整路径。

  • [OS]SOURCE_FILE 的 Windows 操作系统。支持以下 Windows 操作系统:

    • windows-2008r2-byol
    • windows-2012-byol
    • windows-2012r2-byol
    • windows-2016-byol
    • windows-7-byol
    • windows-10-byol

请注意,Cloud Storage 中存储的文件和 Compute Engine 中的映像会产生费用。在确认映像已正确导入并且已作为 Compute Engine 实例正常启动后,您可以从 Cloud Storage 中删除虚拟磁盘文件。

如果为 --source-file 指定了本地文件,则上传操作可能需要几十分钟,具体取决于虚拟磁盘的大小和网络连接的速度。

创建映像后,您可以使用 IAM 角色或权限与项目或组织外部的用户共享该映像

gcloud projects add-iam-policy-binding [PROJECT_ID] \
    --member user:[USER_EMAIL] \
    --role roles/compute.imageUser

在这种情况下,[PROJECT_ID] 是您要授予其访问权限的映像所属的项目。

然后,用户可以通过在其请求中指定该映像所在项目的 ID 来访问该映像。例如:

gcloud compute instances create my-vm \
    --custom-cpu 4 \
    --custom-memory 8 \
    --image https://www.googleapis.com/compute/v1/projects/[PROJECT_ID]/global/images/[IMAGE_NAME] \
    --zone us-central1-a \
    --node-affinity-file node-affinity-prod.json \
    --restart-on-failure \
    --maintenance-policy terminate

使用您自己的许可启动虚拟机实例

导入映像后,您可以使用导入的映像在单租户节点上启动虚拟机实例,并指定 restart-node-on-minimal-servers 属性以启用就地重启功能。该属性可确保在发生维护事件时虚拟机尽可能在同一物理服务器上重启。如果同一物理服务器不可用,则系统将创建新的物理服务器并将其添加到节点组。Compute Engine 将报告新服务器的 ID。

如果物理核心或套接字用量对于 BYOL 工作负载无关紧要,您可以仅使用单租户节点,而省略就地重启功能。这可确保您的虚拟机实例位于专用硬件上,但不会最大限度减少所用底层物理服务器的数量。

请按照以下步骤启动您的虚拟机实例(详细说明如下):

  1. 使用 Google Cloud Platform Consolegcloud 工具或 API 创建节点模板,并根据需要启用就地重启功能。

  2. 使用新创建的模板创建一个节点组。

  3. 最后,在该节点组中使用导入的映像创建虚拟机。

在一个节点上调度多个虚拟机后,这些虚拟机会在发生重启和维护事件时遵循相同的物理相似性标签。这意味着,虽然底层物理服务器可以更改,但您可以使用标签选择器来确保某些虚拟机始终位于相同节点(具有对应的节点相似性)或永不共用同一节点(节点反相似性)。

为方便起见,系统会自动向使用 restart-node-on-minimal-servers 选项配置的所有单租户节点额外添加一个相似性标签,该标签类似于节点名称和节点组名称。您可以将此标签添加到相似性文件中,以确保您的虚拟机仅在启用了 restart-node-on-minimal-server 功能的节点上启动。该标签如下所示:

  • 键:compute.googleapis.com/node-server-binding-type
  • 值:restart-node-on-minimal-server

Console

  1. 创建节点模板并将重启选项设置为最少数量的服务器。

    1. 转到“创建节点模板”页面。

      转到“创建节点模板”页面

    2. 为该模板输入一个名称。
    3. 指定要在其中运行您的节点组的区域。
    4. 指定您希望节点组使用的节点类型。或者,您可以指定最小可用节点,以允许节点组在任何可用节点类型上运行。
    5. 根据需要为实例指定节点相似性标签。例如,您可以指定 workload=front-endenvironment=prod 标签。
    6. 展开高级节点重启配置
    7. 选择最少数量的服务器
    8. 创建您的节点模板。
  2. 使用节点模板预配节点组。

    1. 转到“创建节点组”页面。

      转到“创建节点组”页面

    2. 为该节点组输入一个名称。
    3. 指定要在其中运行您的节点组的地区。您必须在同一区域中拥有节点模板。
    4. 指定要使用的节点模板。
    5. 指定要在该节点组中运行的节点数。您可在稍后更改此数量。
    6. 点击创建以完成节点组的创建。
  3. 创建在节点组中或特定节点上运行的实例。如果您使用了特定节点相似性标签,则可以使用常规过程创建实例,并在单独租用设置下指定节点相似性。对于本示例,请直接在节点组详情页面中创建实例。

    1. 转到“单租户节点”页面。

      转到“单租户节点”页面。

    2. 点击要在其中创建实例的节点组的名称。
    3. 点击创建实例以在此节点组中的任意位置创建实例。如果希望实例在组中的特定节点上运行,请点击该组中单个节点的名称以查看该节点的详细信息。然后,点击创建实例以在该节点上创建实例。
    4. 为您的实例配置设置。由于您已选择节点组或特定节点,因此系统将为您指定区域、地区和默认节点相似性标签。
    5. 选择管理标签页。
    6. 可用性政策 > 主机维护期间下,选择终止

    7. 自动重启下,选择启用(推荐)

    8. 点击创建以完成实例的创建。

gcloud

  1. 创建节点模板并设置 restart-node-on-minimal-servers 标志。根据需要为实例选择节点相似性标签。例如:

    gcloud compute sole-tenancy node-templates create my-node-template \
        --node-type n1-node-96-624 \
        --region us-east1 \
        --node-affinity-labels workload=front-end,environment=prod \
        --server-binding restart-node-on-minimal-servers
    
  2. 使用节点模板预配节点组。例如,以下命令使用在上一步中创建的节点模板创建一个由两个实例组成的实例组:

     gcloud compute sole-tenancy node-groups create my-node-group \
         --node-template my-node-template \
         --target-size 2 \
         --zone us-east1-b
    
  3. 创建节点相似性文件,其中包含节点组的对应相似性标签。这可确保仅在包含所有这些标签的节点上创建您的虚拟机。例如:

     // CREATE AFFINITY LABEL FILE
     cat > node-affinity-prod.json
     [{
       "key" : "workload",
       "operator" : "IN",
       "values" : ["front-end"]
       },
       {
       "key" : "environment",
       "operator" : "IN",
        "values" : ["prod"]
      },
      {
        "key" : "compute.googleapis.com/node-server-binding-type",
        "operator" : "IN",
        "values" : "restart-node-on-minimal-server"
      }]
    
  4. 启动虚拟机实例并指定相似性标签文件。例如,以下请求会使用导入的映像在 us-east1-b 地区中创建一个配备 4 个 CPU 和 8 GB 内存的虚拟机。此外,该请求还会设置 --restart-on-failure- 标志和 terminate 维护政策,这是使用您自己的许可的虚拟机目前接受的唯一政策。

     gcloud compute instances create my-vm \
         --custom-cpu 4 --custom-memory 8 \
         --image my-imported-image \
         --zone us-east1-b \
         --node-affinity-file node-affinity-prod.json \
         --restart-on-failure --maintenance-policy terminate
    

API

  1. 创建节点模板并设置 RESTART_NODE_ON_MINIMAL_SERVERS 属性。同时为您的实例选择节点相似性标签。例如:

    POST https://www.googleapis.com/compute/v1/projects/[PROJECT_ID]/regions/[REGION]/nodeTemplates
    
    {
       "name": "[TEMPLATE_NAME]",
       "nodeType": "[NODE_TYPE]"
       "nodeAffinityLabels": {
          "[KEY]": "[VALUE]"
       },
       "serverBinding":
       {
         "type": "RESTART_NODE_ON_MINIMAL_SERVERS"
       }
    }
    

    其中:

    • [PROJECT_ID] 是您的项目 ID。
    • [TEMPLATE_NAME] 是新节点模板的名称。
    • [NODE_TYPE] 是要用于此模板的节点类型。例如,您可以指定 n1-node-96-624 节点类型以创建配备 96 个 vCPU 和 624 GB 内存的节点。
    • [KEY]:[VALUE] 是以英文逗号分隔的相似性标签列表。
    • [REGION] 是您将在其中使用此模板的区域。
  2. 创建节点模板后,创建节点组。请使用 compute.nodeGroups.insert 方法:

    POST https://www.googleapis.com/compute/v1/projects/[PROJECT_ID]/zones/[ZONE]/nodeGroups?initialNodeCount=[TARGET_SIZE]
    
    {
     "nodeTemplate": "regions/[REGION]/nodeTemplates/[TEMPLATE_NAME]",
     "name": "[GROUP_NAME]"
    }
    

    其中:

    • [PROJECT_ID] 是您的项目 ID。
    • [ZONE] 是此节点组所在的地区。此地区必须与您使用的节点模板位于同一区域。
    • [TARGET_SIZE] 是要在该节点组中创建的节点数。
    • [REGION] 是节点模板所在的区域。
    • [TEMPLATE_NAME] 是新节点模板的名称。
    • [GROUP_NAME] 是新节点组的名称。
    • [TEMPLATE_NAME] 是您要用于创建此节点组的节点模板的名称。
  3. 创建节点组后,您可以使用 compute.instances.insert 方法在节点组中创建实例。请指定 nodeAffinities 条目,使其指向您的节点组名称。例如,您可以创建使用自定义机器类型的实例:

    POST https://www.googleapis.com/compute/v1/projects/[PROJECT_ID]/zones/[ZONE]/instances
    
    {
     "machineType": "zones/[ZONE]/machineTypes/custom-[VCPUS]-[MEMORY]",
     "name": "[INSTANCE_NAME]",
     "scheduling": {
      "nodeAffinities": [
       {
        "key": "compute.googleapis.com/node-server-binding-type",
        "operator": "IN",
        "values": [
         "restart-node-on-minimal-server"
        ]
       }
      ]
     },
     "networkInterfaces": [
      {
       "network": "global/networks/[NETWORK]",
       "subnetwork": "regions/[REGION]/subnetworks/[SUBNETWORK]"
      }
     ],
     "disks": [
      {
       "boot": true,
       "initializeParams": {
        "sourceImage": "projects/[IMAGE_PROJECT]/global/images/family/[IMAGE_FAMILY]"
       }
      }
     ]
    }
    

    其中:

    • [PROJECT_ID] 是您的项目 ID。
    • [INSTANCE_NAME] 是新实例的名称。
    • [ZONE] 是您的节点组所在的地区。
    • [REGION] 是节点模板和您的子网所在的区域。
    • [IMAGE_FAMILY] 是可用映像系列中的一种。
    • [IMAGE_PROJECT] 是该映像系列所属的映像项目。
    • [GROUP_NAME] 是您要将此实例定位到其中的节点组的名称。
    • [VCPUS] 是要用于此实例的 vCPU 数量。
    • [MEMORY] 是此实例的内存量(以 MB 为单位)。例如,您可以将其指定为 5376MB。
    • [NETWORK] 是您要将您的实例连接到的网络的名称。
    • [SUBNETWORK] 是您要将您的实例连接到的子网的名称。

后续步骤

此页内容是否有用?请给出您的反馈和评价:

发送以下问题的反馈:

此网页
Compute Engine 文档