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

单租户节点是物理服务器,专门用于托管特定项目的虚拟机实例。在单租户节点上托管您的虚拟机可确保您的虚拟机实例不与其他项目中的虚拟机实例共用物理硬件。如需详细了解单租户节点的工作原理,请参阅单租户节点概览页面。

您可以创建由节点组成的节点组。一个节点组可以包含各种大小的多个实例,这些实例全部都与其他项目隔离开来。 您可以设置节点亲和性,以确保虚拟机实例在特定节点组中运行。

如需了解如何计算单租户节点的价格和折扣,请参阅单租户节点价格

准备工作

限制

在创建和使用单租户节点之前,请先查看单租户节点概览中的限制部分。

创建和使用单租户节点

通常,您可以按照以下过程在单租户节点上创建实例:

  1. 创建节点模板,并指定节点类型或 vCPU 和内存要求。另外,还需指定区域和可选的节点亲和性标签。 创建虚拟机时,您可以指定虚拟机仅在与节点亲和性标签匹配的节点上运行。
  2. 使用该模板创建包含一个或多个单租户节点的节点组。 不再需要节点时,您可以将节点数量减少为零。
  3. 在您的节点组中创建实例:
    • 使用任何预定义机器类型或自定义机器类型,在此节点组中创建各个虚拟机实例。机器类型必须至少具有两个 vCPU。
    • 使用实例模板在此节点组中创建托管实例组。虽然自动扩缩程序可以控制节点上托管实例组的大小,但自动扩缩程序无法控制节点组的大小。

创建节点组和实例

您可以创建节点模板来为节点组中的节点定义属性。创建模板后,使用该模板创建一个或多个节点组。然后,在这些节点组中创建新实例。

控制台

使用 Google Cloud Console 创建节点及其实例:

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

    转到“单租户节点”页面

  2. 点击创建节点模板,以开始创建节点模板。
  3. 指定要在其中运行节点组的区域。
  4. 指定您希望节点组使用的节点类型。
  5. 或者,您可以添加节点亲和性标签,以定义哪些实例自动在节点组中自行调度。如果将亲和性标签留空,您稍后仍可以按节点组名称或按个别节点名称在节点组中调度实例。
  6. 点击创建以完成节点模板的创建。

使用您的节点模板创建节点组。

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

    转到“单租户节点”页面

  2. 点击创建节点组,以开始创建节点组。
  3. 指定要在其中运行您的节点组的地区。节点模板必须位于同一区域中。
  4. 指定要使用的节点模板。
  5. 指定要在该节点组中运行的节点数。您可在稍后更改此数量。
  6. 点击创建以完成节点组的创建。

创建在您的节点组中或在特定节点上运行的实例。 如果您使用了特定节点亲和性标签,则可以按照常规过程创建实例,并在单独租用设置下指定节点亲和性。在本示例中,请直接在节点组详情页面中创建实例。

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

    转到“单租户节点”页面

  2. 点击要在其中创建实例的节点组的名称。
  3. 点击创建实例,以在此节点组中的任意位置创建实例。如果您希望实例在此节点组中的特定节点上运行,请点击此节点组中个别节点的名称,以查看该节点的详细信息。然后,点击创建实例以在该节点上创建实例。
  4. 为您的实例配置设置。由于您已经选择节点组或特定节点,因此系统将为您指定区域、地区和默认节点亲和性标签。
  5. 点击创建以完成实例的创建。

gcloud

使用 gcloud 命令行工具创建节点及其实例:

  1. 使用 compute sole-tenancy node-types list 命令来识别您可以使用的节点类型:

    gcloud compute sole-tenancy node-types list
        

    Compute Engine 会定期地将旧节点类型替换为新节点类型。替换节点类型后,您将无法使用旧节点类型创建节点组,并且必须升级您的节点模板才能使用新节点类型。

  2. 使用 compute sole-tenancy node-templates create 命令创建新的节点模板。由于可用节点类型的列表会随时变化,因此建议为您的节点模板配置灵活的节点类型要求。例如,指定 --node-requirements vCPU=any,memory=any,localSSD=0 可允许节点在无本地 SSD 容量的任何可用节点类型上运行。

        gcloud compute sole-tenancy node-templates create template-name \
           --region region \
           --node-requirements vCPU=any,memory=any,localSSD=0

    替换以下内容:

    • template-name:新节点模板的名称。
    • region:您将在其中使用此模板的区域。

    或者,您可以选择要在您的模板中使用的特定节点类型。此模板灵活性较低,但可以确保您创建的节点完全满足您的 vCPU 和内存要求。

        gcloud compute sole-tenancy node-templates create template-name \
           --node-type node-type \
           --region region

    替换以下内容:

    • template-name:新节点模板的名称。
    • node-type:您要用于此模板的节点类型。例如,您可以指定 n1-node-96-624 节点类型来创建配备 96 个 vCPU 和 624 GB 内存的节点。
    • region:您将在其中使用此模板的区域。
  3. 创建节点模板后,请创建节点组。 使用 compute sole-tenancy node-groups create 命令:

        gcloud compute sole-tenancy node-groups create group-name \
           --zone zone \
           --node-template template-name \
           --target-size target-size

    替换以下内容:

    • group-name:新节点组的名称。
    • zone:此节点组所在的地区。此地区必须与您使用的节点模板位于同一区域。
    • template-name:您要用于创建此节点组的节点模板的名称。
    • target-size:您希望在此节点组中创建的节点数。
  4. 创建节点组后,您可以使用 compute instances create 命令在节点组中创建实例。指定指向您的节点组名称的 --node-group 标志。例如,您可以使用自定义机器类型创建实例:

        gcloud compute instances create instance-name \
           --zone zone \
           --image-family image-family \
           --image-project image-project \
           --node-group group-name \
           --custom-cpu vcpus \
           --custom-memory memory

    替换以下内容:

    • instance-name:新实例的名称。
    • zone:您的节点组所在的地区。
    • image-family可用映像系列之一。
    • image-project:该映像系列所属的映像项目
    • group-name:您要将此实例放入其中的节点组的名称。
    • vcpus:您要用于此实例的 vCPU 数量。
    • memory:此实例的内存量(以 256 MB 为增量)。例如,您可以指定 5.25GB5376MB

    您也可以视需要在节点组中创建托管实例组。使用 instance-templates create 命令创建实例模板,并添加指向您的节点组名称的 --node-group 标志:

    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.25GB5376MB

    使用 compute instance-groups managed create 命令创建实例组:

    gcloud compute instance-groups managed create [INSTANCE_GROUP_NAME] \
            --zone [ZONE] --size [SIZE] --template [INSTANCE_TEMPLATE]
        

    其中,您需要替换以下项:

    • [INSTANCE_GROUP_NAME] 是此实例组的名称。
    • [SIZE] 是此实例组将包含的虚拟机实例数。您的节点组必须具有足够的资源来容纳此托管实例组中的实例。
    • [INSTANCE_TEMPLATE] 是要用于创建此实例组的实例模板的名称。该模板必须具有指向所需节点组的节点亲和性。
    • [ZONE] 是您的节点组所在的地区。

API

使用 Compute Engine API 中的方法创建节点及其实例:

  1. 在 API 中,构造 GET 请求以使用 compute.nodetypes.list 方法检索可用节点类型的列表:

    GET https://compute.googleapis.com/compute/v1/projects/[PROJECT_ID]/zones/[ZONE]/nodeTypes

    其中:

    • [PROJECT_ID] 是您的项目 ID。
    • [ZONE] 是要从中检索可用节点类型的地区。
  2. 构造对 compute.nodetemplates.insert 方法的 POST 请求以创建新的节点模板。为获得最大的灵活性,请指定 nodeTypeFlexibility 属性并将 cpusmemory 值设置为 any,以允许节点在无本地 SSD 容量的任何可用节点类型上运行。

    POST https://compute.googleapis.com/compute/v1/projects/[PROJECT_ID]/regions/[REGION]/nodeTemplates

    {
         "name": "[TEMPLATE_NAME]",
         "nodeTypeFlexibility": {
          "cpus": "any",
          "memory": "any"
         }
        }
        

    其中:

    • [PROJECT_ID] 是您的项目 ID。
    • [REGION] 是要从中检索可用节点类型的地区。
    • [TEMPLATE_NAME] 是新节点模板的名称。

    或者,您可以选择要在您的模板中使用的特定节点类型。此模板灵活性较低,但可以确保您创建的节点完全满足您的 vCPU 和内存要求。

    POST https://compute.googleapis.com/compute/v1/projects/[PROJECT_ID]/regions/[REGION]/nodeTemplates
    
        {
         "name": "[TEMPLATE_NAME]",
         "nodeType": "[NODE_TYPE]"
        }
        

    其中:

    • [PROJECT_ID] 是您的项目 ID。
    • [TEMPLATE_NAME] 是新节点模板的名称。
    • [NODE_TYPE] 是要用于此模板的节点类型。 例如,您可以指定 n1-node-96-624 节点类型来创建配备 96 个 vCPU 和 624 GB 内存的节点。
    • [REGION] 是您将在其中使用此模板的区域。
  3. 创建节点模板后,请创建节点组。 请使用 compute.nodeGroups.insert 方法:

        POST https://compute.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:新节点组的名称。
  4. 创建节点组后,您可以使用 compute.instances.insert 方法在节点组中创建实例。 指定指向您的节点组名称的 nodeAffinities 条目。 例如,您可以使用自定义机器类型创建实例:

           POST https://compute.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-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:此实例的内存量(以兆字节为单位)。例如,您可以指定 5376MB
    • instance-name:新实例的名称。
    • group-name:您要将此实例放入其中的节点组的名称。
    • network:您的实例将连接到的网络的名称。
    • region:该节点模板和您的子网所在的区域。
    • subnetwork:您的实例将连接到的子网的名称。
    • image-project:该映像系列所属的映像项目
    • image-family可用映像系列之一。

    您也可以视需要在节点组中创建托管实例组。使用 compute.instanceTemplates.insert 方法创建实例模板,并指定指向您的节点组名称的 nodeAffinities 条目:

        POST https://compute.googleapis.com/compute/v1/projects/project-id/zones/zone/instance-templates
    
        {
         "name": "template-name",
         "properties": {
           "machineType": "custom-vcpus-memory",
           "name": "instance-name",
           "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:此实例的内存量(以兆字节为单位)。例如,您可以指定 5376MB
    • instance-name:新实例的名称。
    • group-name:您要将此实例放入其中的节点组的名称。
    • network:您的实例将连接到的网络的名称。
    • region:该节点模板和您的子网所在的区域。
    • subnetwork:您的实例将连接到的子网的名称。
    • image-project:该映像系列所属的映像项目
    • image-family可用映像系列之一。

    使用 compute.instanceGroupManagers.insert 方法创建实例组:

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

    替换以下内容:

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

单租户节点选项

下面介绍您可为节点模板指定的其他选项。

“最少数量的服务器”重启选项

设置此选项即指定:在发生维护事件时,该节点组中的虚拟机将尽可能在同一物理服务器上重启。 如果同一物理服务器不可用,则系统将创建新的物理服务器并将其添加到该节点组中。

该选项与节点亲和性标签有所不同;后者只能确保在具有特定标签的节点上创建某些虚拟机,而无法保证该节点组的整个生命周期始终保持使用同一底层物理服务器。

如需指定此选项,请执行以下操作:

控制台

“创建节点模板”页面上,展开高级节点重启配置,并选择最少数量的服务器

gcloud

使用 gcloud 工具,在创建节点模板时指定 --server-binding restart-node-on-minimal-servers 标志。

API

如果发出直接 HTTP 请求,请在创建节点模板时提供 serverBinding 对象并将 type: restart-node-on-minimal-servers 字符串添加到该请求中:

{
      "serverBinding":
        {
          "type": "RESTART_NODE_ON_MINIMAL_SERVERS"
        }
    }
    

配置节点亲和性

您可以设置节点亲和性或反亲和性,以确定您的实例和托管实例组使用哪些节点作为主机系统。设置节点亲和性时,您应明确选择哪些单租户节点托管哪些虚拟机。

默认情况下,系统会为每个节点分配以下亲和性标签:

  • 节点组中的每个节点都具有一个与该节点组的名称匹配的亲和性标签:
    • 键:compute.googleapis.com/node-group-name
    • 值:该节点组的名称。
  • 每个节点都有一个与其节点名称匹配的亲和性标签。节点名称会自动生成:
    • 键:compute.googleapis.com/node-name
    • 值:该节点的名称。

您可以配置其他亲和性标签或反亲和性标签,以使您的实例仅在所需的节点组中运行,或仅与具有相同亲和性的实例共用节点。这样,您就可以将所有敏感数据保存在特定节点组中,从而与 Compute Engine 上运行的其他节点组和其他虚拟机实例分离开来。

例如,如果您想要创建两个不同的节点组,以分别用于开发环境和生产工作负载,您可以按照以下过程操作:

  1. 使用两个不同的标签 workload=frontend,environment=prodworkload=frontend,environment=dev 创建两个节点模板。workload 标签用于指示这些节点组要用于 frontend 工作负载,而 environment 标签用于区分 prod 环境和 dev 环境:

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

        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
        
  3. 对于生产实例,请创建 node-affinity-prod.json 文件,以更清晰地说明您希望生产实例如何执行亲和性功能。例如,您可以创建文件来指示实例仅在同时具有 workload=frontendenvironment=prod 亲和性的节点上运行:

    [{
        "key" : "workload",
        "operator" : "IN",
        "values" : ["frontend"]
        },
        {
        "key" : "environment",
        "operator" : "IN",
        "values" : ["prod"]
        }
        ]
        
  4. 使用 node-affinity-prod.json 文件,根据您希望生产虚拟机实例要使用的属性创建实例模板:

        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
        
  5. 使用在生产节点上运行的生产模板启动实例组:

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

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

配置反亲和性标签

上面的示例介绍了如何使用亲和性标签。您还可以使用反亲和性标签,以确保您的虚拟机避免使用具有特定标签的节点。假设除了上面创建的生产虚拟机实例之外,您还想要创建一些虚拟机实例来进行开发,但不希望将它们与生产实例托管在相同节点上。

  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.json 文件来配置实例,以确定您的实例可以在哪些节点上运行。

删除单租户节点组

只有在某个单租户节点组未占用任何节点且没有依赖于该单租户节点组的虚拟机实例时,您才能删除该节点组。如果存在依赖于该单租户节点组的虚拟机实例,您必须先删除虚拟机实例,然后才能删除该单租户节点组。

控制台

检查并确保此节点组中未预配任何虚拟机实例:

  1. 点击该单租户节点组的名称
  2. 点击该单租户节点的名称,查看在此单租户节点上预配的虚拟机实例的名称。
  3. 选中虚拟机实例名称旁边的复选框。
  4. 点击删除实例

从该单租户节点组中删除虚拟机实例后,您可以删除该单租户节点组和相应单租户节点模板:

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

    转到单租户节点页面

  2. 点击节点组
  3. 选中要删除的单租户节点组旁边的复选框。
  4. 点击删除

gcloud

  1. 使用以下命令检查该单租户节点组中是否有任何虚拟机实例正在运行:

        gcloud compute sole-tenancy node-groups list-
        nodes node-group-name

    替换以下内容:

    • node-group-name:单租户节点组的名称。
  2. 如果有虚拟机实例正在该单租户节点组中运行,请使用以下命令删除一个虚拟机实例,然后对每个需要删除的虚拟机实例重复执行此操作:

        gcloud compute instances delete vm-instance-name
        

    替换以下内容:

    • vm-instance-name:虚拟机实例的名称。
  3. 当该单租户节点组中不再有任何正在运行的虚拟机实例后,使用以下命令删除该节点组:

        gcloud compute sole-tenancy node-groups delete node-group-name
        

    替换以下内容:

    • node-group-name:单租户节点组的名称。
  4. 删除单租户节点组后,您可以删除单租户节点模板:

        gcloud compute sole-tenancy node-template delete node-template-name
        

    替换以下内容:

    • node-template-name:单租户节点模板的名称。

后续步骤