查看 Compute Engine 实例的物理位置

本文档介绍了如何查看 Google Cloud 组织中正在运行的 Compute Engine 实例的物理位置。

创建并启动计算实例后,您可以查看每个计算实例在相应可用区中运行的物理主机。利用集群中计算实例的物理位置执行以下操作:

  • 最大限度地缩短网络延迟时间:调整应用或工作负载设计,以便在彼此最接近的计算实例上运行对延迟时间敏感的作业。

  • 提高工作负载可靠性:将计算实例分布在不同的物理主机上,以限制主机错误对应用的影响。

如需验证您的项目中运行哪些计算实例,请查看计算实例列表。

限制

您可以查看满足以下一项或多项要求的计算实例的集群、块、子块和主机 ID:

如果计算实例不满足上述任何要求,您可以在公开其宿主 ID 后查看该 ID,如本文档中所述。

了解计算实例拓扑

每个计算实例都在物理服务器(即主机)上运行,该服务器位于服务器块中。每个块都属于某个可用区中的一个集群。查看满足特定要求的计算实例的详细信息时,您可以了解它们相对于满足相同要求的其他计算实例的拓扑。

Compute Engine 在每个计算实例的 physicalHostTopology 字段中公开了以下子字段。两个正在运行的计算实例共享的子字段越多,它们彼此间的距离就越近。

  • 集群 (cluster):计算实例所在的集群的全局名称。集群是多个主机的高级逻辑分组,可以跨越多个块,这些主机共同构成一个资源池。

  • 块 (block):计算实例所在块的组织专用 ID。块是分组在一起的多个主机的集合。

  • 子块 (subBlock):计算实例所在的子块的组织专用 ID。子区块是区块中的一个物理细分,用于将单个物理机箱中的主机分组。

  • 宿主 (host):运行计算实例的宿主的组织或项目专用 ID。宿主 ID 更改如下:

    • 如果计算实例指定了紧凑布置政策或工作负载政策,则宿主机 ID 仅适用于您的项目。

    • 如果计算实例指定了支持的机器系列或您公开了其宿主 ID,则宿主 ID 仅适用于您的组织。

准备工作

  • 如果您尚未设置身份验证,请进行设置。身份验证用于验证您的身份,以便访问 Google Cloud 服务和 API。如需从本地开发环境运行代码或示例,您可以通过选择以下选项之一向 Compute Engine 进行身份验证:

    选择标签页以了解您打算如何使用本页面上的示例:

    控制台

    当您使用 Google Cloud 控制台访问 Google Cloud 服务和 API 时,无需设置身份验证。

    gcloud

    1. 安装 Google Cloud CLI,然后 使用联合身份登录 gcloud CLI。 登录后,运行以下命令来初始化 Google Cloud CLI:

      gcloud init
  • 设置默认区域和可用区。
  • REST

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

      安装 Google Cloud CLI,然后 使用联合身份登录 gcloud CLI。

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

所需的角色

如需获得验证计算实例拓扑所需的权限,请让您的管理员为您授予项目的 Compute Admin (roles/compute.admin) IAM 角色。 如需详细了解如何授予角色,请参阅管理对项目、文件夹和组织的访问权限。

此预定义角色包含验证计算实例拓扑所需的权限。如需查看所需的确切权限,请展开所需权限部分:

所需权限

如需验证计算实例的拓扑,您需要具备以下权限:

  • 如需查看计算实例的详细信息,请使用以下方法: compute.instances.get
  • 如需查看计算实例列表,请使用以下方法: compute.instances.list
  • 如需在创建计算实例时公开主机 ID,请执行以下操作:
    • 针对项目的 compute.instances.create 权限
    • 使用自定义映像创建虚拟机:针对映像的 compute.images.useReadOnly 权限
    • 使用快照创建虚拟机:针对快照的 compute.snapshots.useReadOnly 权限
    • 使用实例模板创建虚拟机:针对实例模板的 compute.instanceTemplates.useReadOnly 权限
    • 为虚拟机分配旧版网络:针对项目的 compute.networks.use 权限
    • 为虚拟机指定静态 IP 地址:针对项目的 compute.addresses.use 权限
    • 使用旧版网络时为虚拟机分配外部 IP 地址:针对项目的 compute.networks.useExternalIp 权限
    • 为虚拟机指定子网:针对项目或所选子网的 compute.subnetworks.use 权限
    • 在使用 VPC 网络时为虚拟机分配外部 IP 地址:针对项目或所选子网的 compute.subnetworks.useExternalIp 权限
    • 为虚拟机设置虚拟机实例元数据:针对项目的 compute.instances.setMetadata 权限
    • 为虚拟机设置标记:针对虚拟机的 compute.instances.setTags 权限
    • 为虚拟机设置标签:针对虚拟机的 compute.instances.setLabels 权限
    • 为虚拟机设置要使用的服务账号:针对虚拟机的 compute.instances.setServiceAccount 权限
    • 为虚拟机创建新磁盘:针对项目的 compute.disks.create 权限
    • 以只读或读写模式挂接现有磁盘:针对磁盘的 compute.disks.use 权限
    • 以只读模式挂接现有磁盘:针对磁盘的 compute.disks.useReadOnly 权限
  • 如需在创建实例模板时公开主机 ID,请执行以下操作: compute.instanceTemplates.create
  • 如需在现有计算实例中公开或隐藏主机 ID,请执行以下操作: compute.instances.update

您也可以使用自定义角色或其他预定义角色来获取这些权限。

公开或隐藏主机 ID

除非计算实例满足特定要求,否则其主机 ID 默认处于隐藏状态。您可以在创建或更新计算实例时公开主机 ID。查看计算实例的详细信息时,您可以看到特定于您 Google Cloud 组织的宿主机 ID。您无法查看计算实例的块、子块或集群的 ID。

如需在计算实例中公开或隐藏主机 ID,请使用以下方法之一:

如果您想防止组织中的一个或多个项目公开宿主 ID,可以创建自定义限制条件。例如,当您想要运行对安全性要求较高工作负载时,此限制非常有用。如需了解详情,请参阅自定义限制。

在现有计算实例中公开或隐藏主机 ID

您可以在现有计算实例中显示或隐藏主机 ID,而无需重启。如果您停用默认显示主机 ID 的计算实例的公开主机 ID 设置,则会发生以下情况之一:

  • 如果计算实例指定了紧凑布置政策或工作负载政策,您会看到特定于项目的宿主机 ID 和相关的物理位置信息。

  • 如果计算实例使用 H4D 机器类型或配备 8 个 GPU 的 A3 High 机器类型(或更高代),则 Compute Engine 会忽略该请求。

如需显示或隐藏现有计算实例的主机 ID,请选择以下选项之一:

gcloud

如需显示或隐藏现有计算实例的主机 ID,请将 gcloud compute instances update 命令与以下标志之一结合使用:

  • 如需公开主机 ID,请添加 --expose-host-topology 标志:

    gcloud compute instances update INSTANCE_NAME \
        --expose-host-topology \
        --zone=ZONE
    
  • 如需隐藏主机 ID,请添加 --no-expose-host-topology 标志:

    gcloud compute instances update INSTANCE_NAME \
        --no-expose-host-topology \
        --zone=ZONE
    

替换以下内容:

  • INSTANCE_NAME:计算实例的名称。

  • ZONE:计算实例所在的可用区。

REST

  1. 如需查看现有 Compute 实例的属性,请向 instances.get 方法发出 GET 请求:

    GET https://compute./compute/v1/projects/PROJECT_ID/zones/ZONE/instances/INSTANCE_NAME
    

    替换以下内容:

    • PROJECT_ID:您在其中创建计算实例的项目的 ID。

    • ZONE:计算实例所在的可用区。

    • INSTANCE_NAME:计算实例的名称。

  2. 如需更新计算实例以公开或隐藏主机 ID,请向 instances.update 方法发出 PUT 请求。在请求正文中,使用上一步中的 GET 请求输出。不过,在 scheduling 字段中,您必须添加 exposeHostTopology 字段才能显示或隐藏主机 ID。如果请求输出中不存在 scheduling 字段,则也添加该字段。

    PUT 请求类似于以下内容:

    PUT https://compute./compute/v1/projects/PROJECT_ID/zones/ZONE/instances/INSTANCE_NAME?mostDisruptiveAllowedAction=REFRESH
    
    {
      "scheduling": {
        "exposeHostTopology": EXPOSE_HOST_ID
      },
      ...
    }
    

    将 EXPOSE_HOST_ID 替换为以下某个值:

    • 如需公开主机 ID,请执行以下操作:true

    • 如需隐藏主持人 ID,请执行以下操作:false

在新计算实例中公开主机 ID

如需在创建计算实例时公开主机 ID,请选择以下选项之一:

gcloud

如需在创建计算实例时公开主机 ID,请将 gcloud compute instances create 命令与 --expose-host-topology 标志搭配使用:

gcloud compute instances create INSTANCE_NAME \
    --machine-type=MACHINE_TYPE \
    --expose-host-topology \
    --zone=ZONE

替换以下内容:

  • INSTANCE_NAME:计算实例的名称。

  • MACHINE_TYPE:您希望计算实例使用的机器类型。

  • ZONE:您要在其中创建计算实例的可用区。

REST

如需在创建计算实例时公开主机 ID,请向 instances.insert 方法发出 POST 请求。在请求正文中,添加设置为 true 的 scheduling.exposeHostTopology 字段。

POST https://compute./compute/v1/projects/PROJECT_ID/zones/ZONE/instances

{
  "name": "INSTANCE_NAME",
  "machineType": "zones/ZONE/machineTypes/MACHINE_TYPE",
  "disks": [
    {
      "boot": true,
      "initializeParams": {
        "sourceImage": "projects/IMAGE_PROJECT/global/images/IMAGE"
      }
    }
  ],
  "networkInterfaces": [
    {
      "network": "global/networks/default"
    }
  ],
  "scheduling": {
    "exposeHostTopology": true
  }
}

替换以下内容:

  • PROJECT_ID:要创建计算实例的项目 ID。

  • ZONE:您要在其中创建计算实例的可用区。

  • INSTANCE_NAME:计算实例的名称。

  • MACHINE_TYPE:您希望计算实例使用的机器类型。

  • IMAGE_PROJECT:映像所属的映像项目;例如 debian-cloud。如需详细了解支持的映像项目,请参阅公共操作系统映像。

  • IMAGE:指定以下其中一项:

    • 操作系统映像的特定版本,例如 debian-12-bookworm-v20240617。

    • 映像系列,其格式必须为 family/IMAGE_FAMILY。此项指定最新的未弃用操作系统映像。例如,如果您指定 family/debian-12,则系统会使用 Debian 12 映像系列中的最新版本。如需详细了解如何使用映像系列,请参阅映像系列最佳实践。

批量公开新计算实例中的主机 ID

如需在批量创建计算实例时公开主机 ID,请选择以下选项之一:

gcloud

如需在批量创建计算实例时公开主机 ID,请运行带有 --expose-host-topology 标志的 gcloud compute instances create-bulk 命令。

例如,如需在单个可用区中批量创建计算实例并指定公开其宿主机 ID,请运行以下命令:

gcloud compute instances create-bulk \
    --count=COUNT \
    --machine-type=MACHINE_TYPE \
    --name-pattern="NAME_PATTERN" \
    --expose-host-topology \
    --zone=ZONE

替换以下内容:

  • COUNT:要创建的计算实例数量。

  • MACHINE_TYPE:您希望计算实例使用的机器类型。

  • NAME_PATTERN:计算实例的名称格式。如需替换计算实例名称中的数字序列,请使用哈希值 (#) 字符序列。例如,使用 instance-# 作为名称模式会生成名称以 instance-1、instance-2 开头的计算实例,一直到由 COUNT 指定的计算实例数量。

  • ZONE:您要在其中批量创建计算实例的可用区。

REST

如需在批量创建计算实例时公开主机 ID,请向 instances.bulkInsert 方法发出 POST 请求。在请求正文中,添加设置为 true 的 instanceProperties.scheduling.exposeHostTopology 字段。

例如,如需在单个可用区中批量创建计算实例并指定公开其宿主机 ID,请发出 POST 请求,如下所示:

POST https://compute./compute/v1/projects/PROJECT_ID/zones/ZONE/instances/bulkInsert

{
  "count": "COUNT",
  "namePattern": "NAME_PATTERN",
  "instanceProperties": {
    "machineType": "MACHINE_TYPE",
    "disks": [
      {
        "boot": true,
        "initializeParams": {
          "sourceImage": "projects/IMAGE_PROJECT/global/images/IMAGE"
        }
      }
    ],
    "networkInterfaces": [
      {
        "network": "global/networks/default"
      }
    ],
    "scheduling": {
      "exposeHostTopology": true
    }
  }
}

替换以下内容:

  • PROJECT_ID:要创建计算实例的项目 ID。

  • ZONE:您要在其中创建计算实例的可用区。

  • COUNT:要创建的计算实例数量。

  • NAME_PATTERN:计算实例的名称格式。如需替换计算实例名称中的数字序列,请使用哈希值 (#) 字符序列。例如,使用 instance-# 作为名称模式会生成名称以 instance-1、instance-2 开头的计算实例,一直到由 COUNT 指定的计算实例数量。

  • MACHINE_TYPE:您希望计算实例使用的机器类型。

  • IMAGE_PROJECT:映像所属的映像项目;例如 debian-cloud。如需详细了解支持的映像项目,请参阅公共操作系统映像。

  • IMAGE:指定以下其中一项:

    • 操作系统映像的特定版本,例如 debian-12-bookworm-v20240617。

    • 映像系列,其格式必须为 family/IMAGE_FAMILY。此项指定最新的未弃用操作系统映像。例如,如果您指定 family/debian-12,则系统会使用 Debian 12 映像系列中的最新版本。如需详细了解如何使用映像系列,请参阅映像系列最佳实践。

在新实例模板中公开了宿主 ID

创建指定公开宿主机 ID 的实例模板后,您可以使用该实例模板执行以下操作:

如需在创建实例模板时公开主机 ID,请选择以下选项之一:

gcloud

如需在创建实例模板时公开主机 ID,请使用带有 --expose-host-topology 标志的 gcloud compute instance-templates create 命令。

例如,使用以下命令可创建区域级实例模板。如果您要创建全球实例模板,请使用相同的命令,但不使用 --instance-template-region 标志。

gcloud compute instance-templates create INSTANCE_TEMPLATE_NAME \
    --expose-host-topology \
    --instance-template-region=REGION \
    --machine-type=MACHINE_TYPE

替换以下内容:

  • INSTANCE_TEMPLATE_NAME:实例模板的名称。

  • REGION:要在其中创建实例模板的区域。

  • MACHINE_TYPE:您希望计算实例使用的机器类型。

REST

如需在创建实例模板时公开主机 ID,请向以下方法之一发出 POST 请求。在请求正文中,添加设置为 true 的 properties.scheduling.exposeHostTopology 字段。

例如,如需创建公开宿主机 ID 的区域级实例模板,请发出 POST 请求,如下所示:

POST https://compute./compute/v1/projects/PROJECT_ID/regions/REGION/instanceTemplates

{
  "name": "INSTANCE_TEMPLATE_NAME",
  "properties": {
    "disks": [
      {
        "boot": true,
        "initializeParams": {
          "sourceImage": "projects/IMAGE_PROJECT/global/images/IMAGE"
        }
      }
    ],
    "machineType": "MACHINE_TYPE",
    "networkInterfaces": [
      {
        "network": "global/networks/default"
      }
    ],
    "scheduling": {
      "exposeHostTopology": true
    }
  }
}

替换以下内容:

  • PROJECT_ID:要创建实例模板的项目 ID。

  • REGION:要在其中创建实例模板的区域。

  • INSTANCE_TEMPLATE_NAME:实例模板的名称。

  • IMAGE_PROJECT:映像所属的映像项目;例如 debian-cloud。如需详细了解支持的映像项目,请参阅公共操作系统映像。

  • IMAGE:指定以下其中一项:

    • 操作系统映像的特定版本,例如 debian-12-bookworm-v20240617。

    • 映像系列,其格式必须为 family/IMAGE_FAMILY。此项指定最新的未弃用操作系统映像。例如,如果您指定 family/debian-12,则系统会使用 Debian 12 映像系列中的最新版本。如需详细了解如何使用映像系列,请参阅映像系列最佳实践。

  • MACHINE_TYPE:您希望计算实例使用的机器类型。

验证计算实例的物理位置

只有当正在运行的计算实例满足特定要求或您公开其主机 ID 时,您才能查看它们的物理位置。

如需验证组织中正在运行的计算实例的物理位置,请使用以下方法之一:

使用 Google Cloud 控制台、gcloud CLI 或 REST 验证物理位置

如需同时查看多个计算实例的物理位置,请使用 REST API。否则,请选择以下选项之一:

控制台

  1. 在 Google Cloud 控制台中,前往虚拟机实例页面。

    转到虚拟机实例

  2. 在名称列中,点击要查看其详细信息的计算实例的名称。系统会显示一个包含实例详细信息的页面,并且详细信息标签页处于选中状态。

  3. 在基本信息部分,检查物理主机字段的值。

gcloud

如需查看正在运行的计算实例的物理位置,请使用带有 --flatten=resourceStatus.physicalHostTopology 标志的 gcloud compute instances describe 命令:

gcloud compute instances describe INSTANCE_NAME \
    --flatten=resourceStatus.physicalHostTopology \
    --zone=ZONE

替换以下内容:

  • INSTANCE_NAME:计算实例名称。

  • ZONE:计算实例所在的可用区。

输出类似于以下内容之一:

  • 如果您可以查看计算实例的集群、块、子块和主机 ID,则输出类似于以下内容:

    ---
    block: 3e3056e23cf91a5cb4a8621b6a52c100
    cluster: europe-west1-cluster-jfhb
    host: 1215168a4ecdfb434fd4d28056589059
    subBlock: 0fc09525cbd5abd734342893ca1c083f
    
  • 如果您只能在公开主机后查看其 ID,则输出类似于以下内容:

    ---
    block: null
    cluster: null
    host: 1215168a4ecdfb434fd4d28056589059
    subBlock: null
    

REST

如需查看正在运行的计算实例的物理位置,请发出以下 GET 请求之一。发出请求时,您必须添加 fields 查询参数,并将输出限制为仅包含计算实例的 name、machineType 和 physicalHostTopology 字段。您还必须添加 filter 查询参数,并将结果限制为正在运行的计算实例。

  • 如需查看所有可用区中的实例列表,请使用 instances.aggregatedList 方法

    GET https://compute.googleapis.com/compute/v1/projects/PROJECT_ID/aggregated/instances?fields=items.name,items.machineType,items.resourceStatus.physicalHostTopology&filter=status=RUNNING
    
  • 如需查看特定可用区中的实例列表,请使用 instances.list 方法。

    GET https://compute.googleapis.com/compute/v1/projects/PROJECT_ID/zones/ZONE/instances?fields=items.name,items.machineType,items.resourceStatus.physicalHostTopology&filter=status=RUNNING
    

替换以下内容:

  • PROJECT_ID:计算实例所在项目的 ID。

  • ZONE:计算实例所在的可用区。

输出类似于以下内容之一:

  • 如果您可以查看计算实例的集群、块、子块和主机 ID,则输出类似于以下内容。在以下示例中,计算实例 vm-01 和 vm-02 位于同一区块中。

    {
      "items": [
        {
          "name": "vm-01",
          "machineType": "https://www.googleapis.com/compute/v1/projects/example-project/zones/europe-west1-b/machineTypes/a3-ultragpu-8g",
          "resourceStatus": {
            "physicalHostTopology": {
              "block": "3e3056e23cf91a5cb4a8621b6a52c100",
              "cluster": "europe-west1-cluster-jfhb",
              "host": "1215168a4ecdfb434fd4d28056589059",
              "subBlock": "0fc09525cbd5abd734342893ca1c083f"
            }
          }
        },
        {
          "name": "vm-02",
          "machineType": "https://www.googleapis.com/compute/v1/projects/example-project/zones/europe-west1-b/machineTypes/a3-ultragpu-8g",
          "resourceStatus": {
            "physicalHostTopology": {
              "block": "3e3056e23cf91a5cb4a8621b6a52c100",
              "cluster": "europe-west1-cluster-jfhb",
              "host": "2326279b5ecdfc545fd5e39167698168",
              "subBlock": "1fc18636cbd4abd623553784ca2c174e"
            }
          }
        },
        ...
      ]
    }
    
  • 如果您只能在公开主机后查看其 ID,则输出类似于以下内容:

    {
      "items": [
        {
          "name": "vm-01",
          "machineType": "https://www.googleapis.com/compute/v1/projects/example-project/zones/europe-west1-b/machineTypes/a3-ultragpu-8g",
          "resourceStatus": {
            "physicalHostTopology": {
              "block": null,
              "cluster": null,
              "host": "1215168a4ecdfb434fd4d28056589059",
              "subBlock": null
            }
          }
        },
        {
          "name": "vm-02",
          "machineType": "https://www.googleapis.com/compute/v1/projects/example-project/zones/europe-west1-b/machineTypes/a3-ultragpu-8g",
          "resourceStatus": {
            "physicalHostTopology": {
              "block": null,
              "cluster": null,
              "host": "2326279b5ecdfc545fd5e39167698168",
              "subBlock": null
            }
          }
        },
        ...
      ]
    }
    

如果您想优化计算实例列表,请修改 filter 查询参数中的过滤表达式。

通过查询元数据键验证物理位置

如需通过查询 physical_host_topology 元数据键来查看正在运行的计算实例的物理位置,请选择以下选项之一:

Linux 实例

  1. 连接到您的 Linux 实例。

  2. 使用 curl 查询 physical_host_topology 元数据键:

    user@myinst:~$ curl -s -H "Metadata-Flavor: Google" http://metadata.google.internal/computeMetadata/v1/instance/attributes/physical_host_topology
    

    输出类似于以下内容之一:

    • 如果您可以查看计算实例的集群、块、子块和主机 ID,则输出类似于以下内容:

      {
        "block": "3e3056e23cf91a5cb4a8621b6a52c100",
        "cluster": "europe-west1-cluster-jfhb",
        "host": "2326279b5ecdfc545fd5e39167698168",
        "subBlock": "1fc18636cbd4abd623553784ca2c174e"
      }
      
    • 如果您只能在公开主机后查看其 ID,则输出类似于以下内容:

      {
        "block": null,
        "cluster": null,
        "host": "2326279b5ecdfc545fd5e39167698168",
        "subBlock": null
      }
      

Windows 实例

  1. 连接到您的 Windows 实例。

  2. 使用 Invoke-RestMethod 命令查询 physical_host_topology 元数据键:

    PS C:\> 
    $value = (Invoke-RestMethod `
            -Headers @{'Metadata-Flavor' = 'Google'} `
            -Uri "http://metadata.google.internal/computeMetadata/v1/instance/attributes/physical_host_topology")
    $value
    

    输出类似于以下内容之一:

    • 如果您可以查看计算实例的集群、块、子块和主机 ID,则输出类似于以下内容:

      {
        "block": "3e3056e23cf91a5cb4a8621b6a52c100",
        "cluster": "europe-west1-cluster-jfhb",
        "host": "2326279b5ecdfc545fd5e39167698168",
        "subBlock": "1fc18636cbd4abd623553784ca2c174e"
      }
      
    • 如果您只能在公开主机后查看其 ID,则输出类似于以下内容:

      {
        "block": null,
        "cluster": null,
        "host": "2326279b5ecdfc545fd5e39167698168",
        "subBlock": null
      }
      

后续步骤