在单租户节点上预配虚拟机

本页面介绍了如何在单租户节点上预配虚拟机实例。单租户节点是物理服务器,专门用于运行特定项目的虚拟机。在单租户节点上预配虚拟机之前,请阅读单租户节点概览。

在单租户节点上预配虚拟机的过程包含如下步骤:

  1. 创建单租户节点模板以指定节点属性
  2. 基于模板创建单租户节点组
  3. 创建虚拟机以使用单租户节点

准备工作

创建单租户节点模板

您必须先创建单租户节点模板,然后才能创建节点组并在这些组上预配虚拟机。节点模板是一种地区资源,用于定义通过模板创建的节点组中节点的属性。

控制台

  1. 在 Google Cloud Console 中,转到单租户节点页面。

    转到“单租户节点”

  2. 点击节点模板

  3. 点击创建节点模板以开始创建节点模板。

  4. 为节点模板指定一个名称

  5. 指定一个地区。您可以使用节点模板在此地区的任何区域中创建节点组。

  6. 为将基于此节点模板创建的节点组中的每个单租户节点指定节点类型

  7. 添加节点亲和性标签。通过亲和性标签,您可以使用单独租用来调度虚拟机。基于此模板创建的节点组中的节点仅使用这些亲和性标签。您无法单独向节点组添加亲和性标签。如需了解详情,请参阅节点亲和性和反亲和性

  8. 点击创建以完成节点模板的创建。

gcloud

  1. 使用 compute sole-tenancy node-types list 命令获取每个 Google Cloud 区域中可用的单租户节点类型列表。

    gcloud compute sole-tenancy node-types list
    
  2. 使用 compute sole-tenancy node-templates create 命令通过指定节点类型来创建新节点模板:

    gcloud compute sole-tenancy node-templates create template-name \
      --region=region \
      --node-type=node-type \
      --node-affinity-labels=affinity-labels \
      --server-binding=server-binding
    

    替换以下内容:

    • template-name:新节点模板的名称。
    • region:将使用此模板的地区。

    • node-type:此模板的节点类型。例如,选择 n2-node-80-640 节点类型可创建一个具有 80 个 vCPU 和 624 GB 内存的节点。

    • affinity-labels:亲和性标签的键和值。 通过亲和性标签,您可以使用单独租用来调度虚拟机实例。基于此模板创建的节点组中的节点仅使用这些亲和性标签。您无法单独向节点组添加亲和性标签。如需了解详情,请参阅节点亲和性标签

    • server-binding:可让您控制 Google Cloud 如何将节点映射到物理服务器。请指定 restart-node-on-any-server 或省略 server-binding 标志,以允许 Google Cloud 预配任何物理服务器,使其在节点维护事件后充当节点。指定 restart-node-on-minimal-servers 以强制 Google Cloud 为该节点使用同一物理服务器。如需了解详情,请参阅 --server-binding

API

  1. 使用 compute.nodeTypes.list 方法获取节点类型列表:

    GET https://compute.googleapis.com/compute/v1/projects/project-id/zones/zone/nodeTypes
    

    替换以下内容:

    • project-id:您的项目 ID
    • zone:Google Cloud 区域,将从中检索可用节点类型。
  2. 使用 compute.nodeTemplates.insert 方法创建使用某个节点类型的节点模板:

    POST https://compute.googleapis.com/compute/v1/projects/project-id/regions/region/nodeTemplates
    
        {
         "name": "template-name",
         "nodeType": "node-type",
         "nodeAffinityLabels": {
             "key": "value",
             ....
         },
         "serverBinding":
         {
             "type": "server-binding"
         }
        }
    

    替换以下内容:

    • project-id:您的项目 ID。
    • region:要在其中创建节点模板的 Google Cloud 地区。您可以使用此模板在此地区的任何区域中创建节点组。
    • template-name:要创建的节点模板的名称。

    • node-type:此模板的节点类型。例如,选择 n2-node-80-640 节点类型可创建一个具有 80 个 vCPU 和 640 GB 内存的节点。

    • 使用 nodeAffinityLabels 指定用于定义节点亲和性标签的 keyvalue 对。通过亲和性标签,您可以使用单独租用来调度虚拟机实例。基于此模板创建的节点组中的节点仅使用这些亲和性标签。您无法单独向节点组添加亲和性标签。如需了解详情,请参阅节点亲和性标签

    • server-binding:可让您使用此参数控制 Google Cloud 如何将节点映射到物理服务器。请指定 restart-node-on-any-server 或省略 serverBinding 参数,以允许 Google Cloud 预配任何物理服务器,使其在节点维护事件后充当节点。指定 restart-node-on-minimal-servers 以强制 Google Cloud 为该节点使用同一物理服务器。如需了解详情,请参阅 --server-binding

创建单租户节点组

创建节点模板后,基于该模板创建节点组。创建节点组时,必须指定以下值,这些值将应用于组中的每个节点:

  • 地区:选择包含要应用于节点组的节点模板的地区。

  • 区域:选择要在地区中的哪个区域创建节点组。

  • 节点模板:选择要用于创建节点组的节点模板。

  • 节点数:指定要在节点组中创建的单租户节点的数量,并使用节点组自动扩缩器管理节点组的大小。根据您创建的节点数量,您可能需要申请更多配额。例如,如果您创建一个大小为 2 的节点组,并选择 n2-node-80-640 作为节点类型,则需要至少 160 的 vCPU 配额。

  • 维护政策:指定主机维护事件期间虚拟机的维护政策。选择是将主机上的虚拟机实时迁移到新的物理服务器、在节点组使用的物理服务器池中实时迁移虚拟机,还是在同一物理服务器上终止并重启虚拟机。除非您有物理服务器亲和性要求(例如,您有按物理核心评估的软件许可),否则请使用默认维护政策。

  • 自动扩缩的节点组:启用节点组自动扩缩器,以自动增加或减少节点组中的节点数量以满足您的需求。

控制台

  1. 在 Google Cloud Console 中,转到单租户节点页面。

    转到“单租户节点”

  2. 点击创建节点组,以开始创建节点组。

  3. 为节点组指定一个名称

  4. 为节点组指定地区,以显示该地区中的可用节点模板。

  5. 指定要在地区中的哪个区域运行节点组。

  6. 指定要使用的节点模板。节点模板必须位于所选地区中。

  7. 指定要在该节点组中运行的节点数。您可以稍后手动更改此数量,也可以启用节点组自动扩缩器。节点组自动扩缩器目前处于 Beta 版阶段。

  8. 指定维护政策

    • 默认:将虚拟机实时迁移到新的物理服务器。
    • 就地重新启动:在同一物理服务器上重启虚拟机。
    • 在节点组内迁移:在节点组内迁移虚拟机。
  9. 点击创建以完成节点组的创建。

gcloud

运行以下命令,根据先前创建的节点模板创建节点组:

gcloud compute sole-tenancy node-groups create group-name \
  --zone=zone \
  --node-template=template-name \
  --target-size=target-size \
  --maintenance-policy=maintenance-policy \
  --autoscaler-mode=autoscaler-mode \
  --min-nodes=min-nodes \
  --max-nodes=max-nodes

替换以下内容:

  • group-name:新节点组的名称。
  • zone:要在其中创建节点组的地区。此地区必须与您用于创建节点组的节点模板位于同一区域。
  • template-name:要用于创建此组的节点模板的名称。
  • target-size:要在组中创建的节点数。
  • maintenance-policy:节点组的维护政策。此项必须为以下项之一:
    • default:虚拟机将实时迁移到新的物理服务器。
    • migrate-within-node-group:虚拟机将实时迁移到节点组中的其他节点。此政策目前处于 Beta 版阶段,必须使用 gcloud beta compute sole-tenancy node-groups create 命令进行指定。
    • restart-in-place:维护事件结束后,虚拟机将在同一物理服务器上终止并重启。
  • autoscaler-mode:节点组的自动扩缩器政策。此项必须为以下项之一:
    • off:关闭节点组的自动扩缩功能。
    • on:启用节点组的自动扩缩功能。
    • only-scale-out:仅启用自动横向扩容功能。
  • min-nodes:节点组的大小下限。默认值为 0,且必须是小于或等于 max- nodes 的整数值。
  • max-nodes:节点组的大小上限。此值必须小于或等于 100 且大于或等于 min- nodes。如果 autoscaler-mode 未设置为 off,则此为必需参数。

API

创建节点模板后,请创建节点组。请使用 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", "maintenancePolicy": maintenance-policy, "autoscalingPolicy": { "mode": autoscaler-mode, "minNodes": min-nodes, "maxNodes": max-nodes }, }

替换以下内容:

  • project-id:项目的 ID。
  • zone:要在其中创建节点组的地区。此地区必须与您用于创建节点组的节点模板位于同一地区。
  • target-size:要在组中创建的节点数。
  • region:用于创建此节点组的节点模板所在的地区。
  • template-name:要用于创建此组的节点模板的名称。
  • group-name:新节点组的名称。
  • maintenance-policy:节点组的维护政策。此项必须为以下项之一:
    • DEFAULT:虚拟机在主机维护事件期间遵循传统维护行为,配置为在主机维护事件期间迁移的虚拟机可以实时迁移到新主机。未设置为在主机维护事件期间迁移的虚拟机将会终止。
    • MIGRATE_WITHIN_NODE_GROUP:虚拟机将实时迁移到节点组中的其他节点。此政策目前处于 Beta 版阶段,必须使用 gcloud beta compute sole-tenancy node-groups create 命令进行指定。
    • RESTART_IN_PLACE:维护事件结束后,虚拟机将在同一物理服务器上终止并重启。
  • autoscaler-mode:节点组的自动扩缩器政策。此项必须为以下项之一:
    • OFF:关闭节点组的自动扩缩功能。
    • ON:启用节点组的自动扩缩功能。
    • ONLY_SCALE_OUT:仅启用自动横向扩容功能。
  • max-nodes:节点组的大小上限。此值必须小于或等于 100 且大于或等于 min- nodes。如果 autoscaler-mode 未设置为 off,则必须指定此值。
  • min-nodes:节点组的大小下限。默认值为 0,且必须是小于或等于 max-nodes 的整数值。

在单租户节点上预配单个虚拟机

在基于节点模板创建节点组后,您可以使用任何预定义机器类型或具有 2 个或更多 vCPU 的自定义机器类型,直接在单租户节点或节点组上预配单个虚拟机。以这种方式预配虚拟机时,Compute Engine 会根据您预配虚拟机时所在的节点或节点组自动分配亲和性标签

以下过程介绍了如何在节点组上预配单个虚拟机。

控制台

  • 使用节点亲和性标签:遵循创建虚拟机实例的标准过程,在 Cloud Console 中使用亲和性标签将新虚拟机实例与单租户节点相关联。

  • 或者,在节点组详情页面创建虚拟机实例:

    1. 在 Google Cloud Console 中,转到单租户节点页面。

      转到“单租户节点”

    2. 点击节点组

    3. 点击要在其中预配虚拟机实例的节点组的名称

    4. 点击创建实例以在此节点组上预配虚拟机实例,请注意 Compute Engine 自动应用于地区区域机器配置节点亲和性标签主机维护期间自动重启的值,并根据您的工作负载的要求相应地修改这些值。

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

gcloud

使用以下命令在节点组上预配自定义机器类型的虚拟机:

gcloud compute instances create vm-name \
  --zone=zone \
  --image-family=image-family \
  --image-project=image-project \
  --node-group=group-name \
  --custom-cpu=vcpus \
  --custom-memory=memory \
  --maintenance-policy=maintenance-policy \
  --restart-on-failure

替换以下内容:

  • vm-name:新虚拟机的名称。
  • zone:要在其中创建新虚拟机的区域。
  • image-family:包含要用于创建虚拟机的映像的映像系列
  • image-project:该映像系列所属的映像项目
  • group-name:要在其中预配虚拟机的节点组的名称。
  • vcpus:要用于此虚拟机的 vCPU 数量。
  • memory:以 256 MB 为增量的内存量。例如,5.25 GB 或 5376 MB。
  • maintenance-policy:指定虚拟机在维护期间的行为。设置为以下其中一项:
    • MIGRATE:将虚拟机迁移到新主机。
    • TERMINATE:终止虚拟机。
  • --restart-on-failure:此参数指示虚拟机在终止后是否重启。使用 --no-restart-on- failure 可停用。

API

使用以下 instances.insert REST 请求在节点组上预配一个自定义机器类型的虚拟机:

POST https://compute.googleapis.com/compute/v1/projects/project-id/zones/zone/instances
{ "machineType": "zones/zone/machineTypes/custom-vcpus-memory", "name": "vm-name", "scheduling": { "onHostMaintenance": maintenance-policy, "automaticRestart": restart-on-failure, "nodeAffinities": [ { "key": "compute.googleapis.com/node-group-name", "operator": "IN", "values": [ "group-name" ] } ] }, "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。
  • zone:要在其中创建新虚拟机的区域。
  • vcpus:要用于此虚拟机的 vCPU 数量。
  • memory:以 256 MB 为增量的内存量。例如,5.25 GB 或 5376 MB。
  • vm-name:新虚拟机的名称。
  • maintenance-policy:指定虚拟机在维护期间的行为。设置为以下其中一项:
    • MIGRATE:将虚拟机迁移到新主机。
    • TERMINATE:终止虚拟机。
  • restart-on-failure:此参数指示虚拟机在终止后是否重启。默认值为 true
  • group-name:要在其中预配虚拟机的节点组的名称。
  • network:此虚拟机所在的网络的网址。
  • region:包含此虚拟机所在的子网的地区。
  • subnetwork:此虚拟机所在的子网的网址。
  • image-project:该映像系列所属的映像项目
  • image-family:包含要用于创建虚拟机的映像的映像系列

在单租户节点上预配多个虚拟机

如需在节点或节点组上同时预配多个相同的虚拟机,请使用代管实例组 (MIG),并使用亲和性标签指定该实例组在哪个单租户节点或节点组上运行。

如需自动管理代管实例组的大小,请使用 MIG 自动扩缩器;如需自动管理节点组的大小,请使用节点组自动扩缩器

以下命令显示了如何创建自定义机器类型的代管实例组。

gcloud

  1. 使用 gcloud compute instance-templates create 命令在节点组中创建 MIG 模板:

    gcloud compute instance-templates create instance-template \
    --image-family=image-family \
    --image-project=image-project \
    --node-group=group-name \
    --custom-cpu=vcpus \
    --custom-memory=memory
    

    替换以下内容:

    • instance-template:新实例模板的名称。
    • image-family:包含要用于创建虚拟机的映像的映像系列
    • image-project:该映像系列所属的映像项目
    • group-name:要在其中预配虚拟机的节点组的名称。
    • vcpus:要用于此虚拟机的 vCPU 数量。
    • memory:以 256 MB 为增量的内存量。例如,5.25 GB 或 5376 MB。
  2. 使用 gcloud compute instance-groups managed create 命令创建实例组:

    gcloud compute instance-groups managed create instance-group-name --zone zone --size size --template instance-template
    

    替换以下内容:

    • instance-group-name:此实例组的名称。
    • zone:要在其中创建代管实例组的区域。
    • size:要包含在此实例组中的虚拟机数量。您的节点组必须具有足够的资源来容纳此代管实例组中的实例。
    • instance-template:要用于创建此组的实例模板的名称。该模板必须具有指向相应节点组的节点亲和性。

API

  1. 使用 instanceTemplates.insert REST 请求在节点组中创建 MIG 模板:

    POST https://www.googleapis.com/compute/v1/projects/project-id/zones/zone/instance-templates
    { "name": "template-name", "properties": { "machineType": "custom-vcpus-memory", "scheduling": { "nodeAffinities": [ { "key": "compute.googleapis.com/node-group-name", "operator": "IN", "values": [ "group-name" ] } ] }, "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。
    • zone:要在其中创建新实例模板的区域。
    • template-name:新实例模板的名称。
    • vcpus:实例组中每个虚拟机使用的 vCPU 数量。
    • memory:实例组中每个虚拟机的内存量(以 256 MB 为增量)。例如,5.25 GB 或 5376 MB。
    • group-name:要在其中预配虚拟机的节点组的名称。
    • network:此虚拟机所在的网络的网址。
    • region:包含此虚拟机所在的子网的地区。
    • subnetwork:此虚拟机所在的子网的网址。
    • image-project:该映像系列所属的映像项目
    • image-family:包含要用于创建虚拟机的映像的映像系列
  2. 使用 instanceGroupManagers.create 命令创建实例组:

    POST https://www.googleapis.com/compute/v1/projects/project-id/zones/zone/instanceGroupManagers
    {
     "baseInstanceName": "name-prefix",
     "name": "instance-group-name",
     "targetSize": sizevar>,
     "instanceTemplate": "global/instanceTemplates/instance-template"
    }
    

    替换以下内容:

    • project-id:项目的 ID。
    • zone:要在其中创建代管实例组的区域。
    • name-prefix:代管实例组中每个实例的前缀名称。
    • instance-group-name:此实例组的名称。
    • size:要包含在此实例组中的虚拟机数量。您的节点组必须具有足够的资源来容纳此代管实例组中的实例。
    • instance-template:您要用于创建此组的实例模板的名称。该模板必须具有指向相应节点组的节点亲和性。

实例亲和性示例

通过节点亲和性标签,您可以对节点组进行逻辑分组,并在一组特定的节点组上调度虚拟机。您还可以使用节点亲和性标签在不同区域的节点组上调度虚拟机,并仍然将节点组保留在逻辑组中。以下示例过程展示了如何使用亲和性标签将虚拟机与特定节点组关联:

gcloud

  1. 为生产工作负载创建一个具有一组亲和性标签的节点模板:

    gcloud compute sole-tenancy node-templates create production-template --node-type=n2-node-80-640 --node-affinity-labels workload=frontend,environment=prod
    
  2. 为开发工作负载创建另一个具有一组亲和性标签的节点模板:

    gcloud compute sole-tenancy node-templates create development-template --node-type=n2-node-80-640 --node-affinity-labels workload=frontend,environment=dev
    
  3. 使用生产模板和开发模板创建数个节点组。举例来说,您可以同时拥有一个大型生产节点组和多个小型开发节点组。您也可以视需要在不同的区域中以不同的目标大小创建这些节点组,以便适应工作负载的规模:

    gcloud compute sole-tenancy node-groups create production-group --node-template production-template --target-size 5 --zones us-west1-b
    
    gcloud compute sole-tenancy node-groups create development-group-east1 --node-template development-template --target-size 1 --zones us-east1-d
    
    gcloud compute sole-tenancy node-groups create development-group-east2 --node-template development-template --target-size 1 --zones us-east1-d
    
  4. 对于生产虚拟机,请创建 node-affinity-prod.json 文件,以指定生产虚拟机的亲和性。例如,您可以创建文件来指示虚拟机仅在同时具有 workload=frontendenvironment=prod 亲和性的节点上运行:

    [
      {
        "key" : "workload",
        "operator" : "IN",
        "values" : ["frontend"]
      },
      {
        "key" : "environment",
        "operator" : "IN",
        "values" : ["prod"]
      }
    ]
    
  5. 使用 node-affinity-prod.json 文件创建一个 MIG 模板,该模板应具有您希望用于生产虚拟机的属性:

    gcloud compute instance-templates create production-template --image-family production-images --image-project my-project --node-affinity-file node-affinity-prod.json --custom-cpu 3 --custom-memory 4096
    
  6. 使用在生产节点上运行的 MIG 生产模板启动实例组:

    gcloud compute instance-groups managed create production-group --zone us-west1-b --size 4 --template production-template
    

    此时,该实例组中的虚拟机启动后将仅在具有 workload=frontendenvironment=prod 亲和性的节点组中运行。

实例反亲和性示例

使用反亲和性标签来确保未在节点上预配虚拟机。例如,创建一些虚拟机以用于开发目的,但禁止 Compute Engine 在托管生产虚拟机的同一节点上调度这些虚拟机。以下示例过程展示了如何使用亲和性标签来确保虚拟机未与特定节点组关联:

gcloud

  1. 对于开发实例,请创建 node-affinity-dev.json 文件,以指定开发虚拟机的亲和性。例如,您可以创建文件来将虚拟机配置为在具有 workload=frontend 亲和性但不具有 environment=prod 亲和性的任何节点组中运行:

    [
      {
        "key" : "workload",
        "operator" : "IN",
        "values" : ["frontend"]
      },
      {
        "key" : "environment",
        "operator" : "NOT",
        "values" : ["prod"]
      }
    ]
    
  2. 对于开发,您可以创建单独的虚拟机以用于测试目的,而不需要创建整个实例组。请使用 node-affinity-dev.json 文件来创建该虚拟机。例如,如果要测试名为 development-image-1 的特定开发映像,请使用以下命令创建虚拟机并配置其亲和性:

    gcloud compute instances create dev-1 --image development-image-1 --image-project my-project --node-affinity-file node-affinity-dev.json --custom-cpu 3 --custom-memory 4096 --zone us-east1-d
    

    此实例启动后将仅在具有 workload=frontend 的节点组上运行,而不会在任何配置了 environment=prod affinity 的节点组中运行。

删除节点模板

删除所有使用模板的节点组后,即可删除该模板。

控制台

  1. 在 Google Cloud Console 中,转到单租户节点页面。

    转到“单租户节点”页面

  2. 点击节点模板

  3. 选择某个未使用的节点模板的名称。

  4. 点击删除

gcloud

使用 compute sole-tenancy node-templates delete 命令删除未使用的节点模板:

gcloud compute sole-tenancy node-templates delete template-name \
    --region=region

替换以下内容:

  • template-name:要删除的节点模板的名称
  • region:节点模板所属的地区

API

使用 compute.nodeTemplates.delete 方法删除未使用的节点模板:

 DELETE https://compute.googleapis.com/compute/v1/projects/project-id/regions/region/nodeTemplates/template-name
 

替换以下内容:

  • project-id:您的项目 ID
  • region:包含节点模板的 Google Cloud 地区
  • template-name:要删除的节点模板的名称

删除节点组

只要节点组内的节点上没有正在运行的虚拟机实例,您就可以删除该节点组。

控制台

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

    转到“单租户节点”页面

  2. 点击要删除的节点组的名称。

  3. 对于节点组中的每个节点,点击节点的名称。确保节点上没有正在运行的虚拟机实例。

  4. 您可以在节点详情页面上删除单个虚拟机实例,也可以按照删除单个虚拟机实例的标准流程执行操作。如需删除代管实例组中的实例,您必须删除代管实例组

  5. 删除在节点组的所有节点上运行的所有虚拟机实例后,请返回单租户节点页面。

    转到单租户节点页面

  6. 点击节点组

  7. 选择需要删除的节点组的名称。

  8. 点击删除

gcloud

  1. 使用 compute sole-tenancy node-groups list-nodes 命令列出节点组内的节点上运行的虚拟机实例:

    gcloud compute sole-tenancy node-groups list-nodes group-name \
     --zone=zone
    

    替换以下内容:

    • group-name:节点组的名称
    • zone:节点组所属的区域
  2. 如果节点组上有任意虚拟机实例正在运行,请按照删除单个虚拟机实例的标准流程删除代管实例组的标准过程进行操作。

  3. 删除在节点组的所有节点上运行的所有虚拟机实例后,请使用 compute sole-tenancy node-groups delete 命令删除该节点组:

    gcloud compute sole-tenancy node-groups delete group-name \
     --zone=zone
    

    替换以下内容:

    • group-name:节点组的名称
    • zone:节点组所属的区域

后续步骤