虚拟机元数据简介


每个虚拟机 (VM) 实例都将其元数据存储在元数据服务器上。您的虚拟机可自动获得对元数据服务器 API 的访问权限,而无需任何额外的授权。Compute Engine 会在目录中维护虚拟机和项目的元数据键和值。每个目录都以键值对的形式存储元数据条目。某些目录包含子目录。

本文档简要介绍了虚拟机元数据,并说明了虚拟机元数据的类型和属性。

使用虚拟机元数据

以下部分介绍了您可以使用元数据条目来管理虚拟机的几种场景。

启动和关停脚本

元数据服务器在与启动和关停脚本结合使用时会特别有用,因为您可以使用元数据服务器以编程方式获取虚拟机的专属信息,而无需额外的授权。

例如,您可以编写一个启动脚本来获取虚拟机外部 IP 的元数据键值对,并在您的脚本中使用该 IP 来设置数据库。 由于每个虚拟机上的 Compute Engine 预定义元数据键都相同,因此您可以重复使用脚本,而无需针对每个虚拟机更新脚本。这有助于您为应用创建更加可靠的代码。

宿主机维护

元数据服务器使用 maintenance-event 键在 scheduling/ 元数据目录中提供有关虚拟机调度选项的信息。您可以使用这些元数据值在维护事件即将发生时通知您,以便您为该事件准备好环境。如需了解详情,请参阅获取实时迁移通知

客户机特性

客户机特性是指应用在虚拟机上运行期间可写入的特定类型的自定义元数据。客户机特性仅适用于需要少量不常更改的数据的用例,如需详细了解客户机属性,请参阅设置和查询客户机属性

合作伙伴属性

合作伙伴属性是特定类型的实例元数据。Google Cloud 服务可以使用合作伙伴属性来创建命名空间,在其中可以定义实例元数据条目。您可以设置、更新、删除和查看实例元数据条目的值,以配置该服务。

例如,在您为 Compute Engine 使用托管式工作负载身份时,可以在该服务的命名空间的元数据条目中指定配置详细信息。

元数据安全注意事项

当您发出从元数据服务器获取信息的请求时,您的请求和后续元数据响应永远不会传到运行虚拟机的物理宿主机以外。

不过,任何可以查询元数据网址的进程都可以访问元数据服务器中的所有值。这包括您写入该服务器的任何自定义元数据值、客户端证书和私钥。Google 建议您谨慎将敏感值写入元数据服务器或运行第三方进程。 您必须将任何不应能够访问元数据服务器的进程放入沙盒中。

元数据服务器端点

您可以通过以下端点访问元数据服务器:

  • http 端点:http://metadata.google.internal/computeMetadata/v1。您可以从所有虚拟机(包括安全强化型虚拟机)访问此端点。
  • https 端点:https://metadata.google.internal/computeMetadata/v1。您只能从安全强化型虚拟机访问此端点。

HTTPS 元数据服务器端点

HTTPS 元数据服务器端点 (https://metadata.google.internal/computeMetadata/v1) 可为元数据服务器与虚拟机之间的信息传输提供额外的安全保障。此端点仅适用于安全强化型虚拟机。

使用 HTTPS 元数据服务器端点的优势

使用 https 端点查询元数据服务器具有以下优势:

  • 提高安全性:有助于防止未经授权访问敏感元数据。这可以使攻击者无法执行以下任何操作:

    • 仿冒或冒充元数据服务器以获取对虚拟机的访问权限
    • 在敏感元数据到达虚拟机之前查看或篡改敏感元数据
  • 降低费用:帮助您避免因安全事故而产生的费用

进程工作原理

对于安装了客机环境的安全强化型虚拟机,虚拟机上会发生以下进程:

  1. 虚拟机启动时,Compute Engine 会完成以下操作:

    1. Compute Engine 创建以下三个证书:

      • 自签名根证书:为虚拟机生成的唯一证书。
      • 服务器身份证书:元数据服务器的证书。
      • 客户端身份证书:客户端的证书。此证书不会缓存在元数据服务器中,并且会在从客机环境每次调用客户端证书端点时重新创建。

        如需了解客户端身份和根证书的存储位置,请参阅证书的存储位置

    2. Compute Engine 使用 Google 生成的 UEFI 变量将根证书的公共部分传输到虚拟机的客机环境。然后,此根证书会存储在虚拟机上。

  2. 客机环境定期请求客户端身份证书。发生这种情况时,客机代理会从元数据服务器下载此证书,并使用该虚拟机的根证书对其进行验证。

当您向 HTTPS 元数据服务器端点发出查询时,您需要指定客户端身份证书,然后元数据服务器和虚拟机会使用这些证书来验证此查询是否已获授权。

证书的存储位置

以下部分列出了由 Compute Engine 生成的根证书和客户端身份证书的存储位置。

根证书

CentOS/RHEL/Rocky

CentOS、Red Hat Enterprise Linux (RHEL) 和 Rocky Linux 虚拟机的根证书存储在以下位置:

  • /run/google-mds-mtls/root.crt
  • /etc/pki/ca-trust/extracted/pem/tls-ca-bundle.pem

Debian/Ubuntu

Debian 和 Ubuntu 虚拟机的根证书存储在以下位置:

  • /run/google-mds-mtls/root.crt
  • /etc/ssl/certs/ca-certificates.crt

Fedora

Fedora 虚拟机的根证书存储在以下位置:

  • /run/google-mds-mtls/root.crt
  • /etc/pki/tls/certs/ca-bundle.crt

SLES

SUSE Linux Enterprise Server (SLES) 虚拟机的根证书存储在以下位置:

  • /run/google-mds-mtls/root.crt
  • /etc/ssl/ca-bundle.pem

Windows

Windows 虚拟机的根证书存储在以下位置:

  • C:\ProgramData\Google\ComputeEngine\mds-mtls-root.crt
  • Cert:\LocalMachine\Root
客户端身份证书

客户端身份证书可供在虚拟机上运行的所有进程访问。这样做是为了让所有进程都可以使用 https 端点(类似于 http 端点)访问元数据服务器。如需了解详情,请参阅元数据安全注意事项

Linux

Linux 虚拟机的客户端身份证书存储在以下位置:

/run/google-mds-mtls/client.key

Windows

Windows 虚拟机的客户端身份证书存储在以下位置:

  • C:\ProgramData\Google\ComputeEngine\mds-mtls-client.key
  • Cert:\LocalMachine\My

预定义和自定义元数据键

每个元数据条目以键值对的形式存储在元数据服务器上。元数据键区分大小写。您的键可以是预定义键,也可以是自定义元数据键。

预定义元数据键

预定义的元数据键是由 Compute Engine 创建的元数据键。 当您创建虚拟机时,Compute Engine 会自动设置该虚拟机上某些键的元数据值,例如虚拟机实例 ID 或项目 ID。对于 Compute Engine 不会自动设置值的预定义键,您可以根据系统配置从一组可用值中进行选择。 例如,如需为虚拟机启用 OS Login,您可以将该虚拟机的 enable-oslogin 预定义键的值设置为 TRUE。如需为该虚拟机停用 OS Login,您可以将键的值更新为 FALSE。 您只能更新这些键的值,不能更新键本身。

如需详细了解预定义的元数据键以及这些键的列表,请参阅预定义元数据键

自定义元数据键

通过自定义元数据,您可以在单个虚拟机或项目中创建和使用自己的元数据键值对。您可以添加新的自定义元数据键,更新现有键的值,以及移除不需要的任何自定义元数据条目。 设置自定义元数据对于将任意值传递给项目中的虚拟机非常有用。它对创建启动关停脚本也有用。

如需了解如何为虚拟机添加、更新或移除自定义元数据,请参阅配置自定义元数据

元数据类型

虚拟机元数据条目可以提供特定于单个虚拟机或项目的信息。元数据根据您设置元数据的范围分为项目元数据、可用区级元数据和实例元数据。

项目元数据

项目元数据是在项目范围定义的,并提供适用于项目中所有虚拟机的信息。设置此元数据后,元数据条目会传播到该项目中的所有虚拟机。

您可以使用预定义和自定义元数据键来设置项目元数据。详细了解预定义项目元数据键以及如何设置自定义项目元数据

可用区级元数据

可用区级元数据是在项目内的可用区级范围定义的,提供该项目内特定可用区中的虚拟机的相关信息。设置可用区级元数据后,元数据条目会传播到该项目内所配置可用区中的所有虚拟机。与项目元数据相比,可用区级元数据可帮助您进行故障隔离,并提供更高的可靠性。

Compute Engine 不会为可用区级元数据提供任何预定义键。您必须创建自己的自定义元数据键才能设置可用区级元数据。详细了解如何设置自定义可用区级元数据

实例元数据

实例元数据提供有关特定虚拟机实例的信息。您可以为每个虚拟机实例单独设置实例元数据。

您可以使用预定义和自定义元数据键来设置实例元数据。详细了解预定义的实例元数据键以及如何设置自定义实例元数据

元数据的排列方式

Compute Engine 会在目录列表中存储和维护虚拟机的元数据以及项目的元数据键和值。根据元数据的类型,Compute Engine 会将元数据条目存储在以下某个目录中:

元数据类型 目录
项目范围元数据和项目可用区级元数据
  • http 端点:
    http://metadata.google.internal/computeMetadata/v1/project
  • https 端点(预览版):
    https://metadata.google.internal/computeMetadata/v1/project
实例元数据
  • http 端点:
    http://metadata.google.internal/computeMetadata/v1/instance
  • https 端点:
    https://metadata.google.internal/computeMetadata/v1/instance

每个目录都以键值对的形式存储元数据条目。某些元数据条目还是包含其他元数据键的目录。用作目录的元数据条目在元数据键名中由尾随斜杠 (/) 标记。例如,/project/attributes/ 是包含其他元数据键的 project/ 目录下的目录。如需创建自定义元数据目录列表,您必须在创建自定义元数据条目时在元数据键名中使用尾随斜杠 (/)。

项目和可用区元数据条目存储在同一 project/ 目录中。如果您在项目级和可用区级的虚拟机上为同一自定义元数据键设置了不同的值,则这些键的可用区元数据值优先于相应可用区中的项目元数据。

  • 如果您为已具有项目元数据值的元数据键添加可用区元数据值,则 Compute Engine 将替换此指定可用区中虚拟机的项目元数据值,并使用可用区值更新 /project 目录。
  • 如果您为已具有可用区元数据值的元数据键添加新的项目范围元数据值,则系统不会进行任何更改。Compute Engine 会将可用区级元数据值保留在特定可用区的 /project 目录中。
  • 如果您没有为特定可用区中的自定义元数据键指定可用区元数据值,但键具有项目元数据值,则您的虚拟机将继续在这些可用区中具有项目元数据值。

例如,假设您定义了项目范围的元数据对 key-1=value-1。假设您还仅为 us-central1-a 可用区定义了可用区级元数据对 key-1=zonal-value-1。项目 us-central1-a 可用区中的所有虚拟机都会继承 key-1=zonal-value1 作为元数据对。对于还没有为 key-1 设置任何可用区级元数据的其他可用区中的所有虚拟机,元数据对会保留 key-1=value-1

后续步骤