客机代理功能


本文档简要介绍了客机代理的核心功能,它是客机环境的关键组件。客机环境包含实例在 Compute Engine 上运行所需的脚本、守护程序和二进制文件。如需了解详情,请参阅客机环境

客机代理的工作原理

从版本 20250901.00 开始,客机代理使用基于插件的架构。此设计将代理的功能分离为不同的组件,从而提高可靠性和灵活性。

客机代理架构包含以下几个关键组件:

  • 客机代理管理器:实例上用于启动、停止和监控所有插件的中央进程。
  • 核心插件:此插件用于处理实例在 Google Cloud上运行所需的基础服务。其功能无法停用。
  • 可选插件:这些插件可将您的实例与其他 Google Cloud 服务(例如 Cloud Monitoring)集成。您可以控制哪些插件在实例上运行。
  • 代理控制平面:这是在 Google 的后端基础设施上运行的托管式 Google Cloud 服务,用于管理可选插件的生命周期,包括其安装和更新。

如需详细了解客机代理架构,请参阅客机代理简介

核心功能

核心插件负责实例在 Compute Engine 上运行所需的基本服务。以下部分详细介绍了核心插件提供的功能。您可以使用客机代理配置文件自定义其中的许多功能。

初始实例设置和优化

客机代理会执行多项设置任务,以准备好实例在 Compute Engine 上运行。如下表所示,有些任务仅在首次启动时运行,而其他任务则在每次启动时运行。

任务 频率
生成 SSH 主机密钥 首次启动时
创建用于使用 Cloud Storage 的 boto 配置 首次启动时
针对本地 SSD 进行优化 每次启动时
在所有 virtionet 设备上启用多队列 每次启动时

您可以通过配置客机代理配置文件的 InstanceSetup 选项来控制这些设置任务。例如,您可以通过设置 optimize_local_ssd = false 来停用本地 SSD 优化。

系统遥测数据收集

客机代理会在启动时记录一些基本系统遥测信息,然后每 24 小时记录一次。记录的信息包括以下内容:

  • 客机代理版本和架构
  • 操作系统名称和版本
  • 操作系统内核版本和版本

您可以通过将元数据键 disable-guest-telemetry 设置为 true 来停用遥测数据收集。如需设置元数据,请参阅设置和移除自定义元数据

时钟同步(仅限 Linux)

为确保计时准确,客机代理会使用 clock_skew_daemon 组件定期更正实例上的时钟,使其与运行该实例的物理服务器保持一致。此过程可防止出现称为时钟偏差的问题,并在实例日志中生成 system time has changed 消息,以确认时间已成功同步。

代理通常会在停止或启动事件后或迁移后同步时钟。

您可以通过在客机代理配置文件中设置 clock_skew_daemon = false 来停用 clock_skew_daemon 组件。

元数据脚本执行

您可以使用启动脚本关停脚本,让实例在每次启动或停止时执行自动化任务。

客机代理可帮助运行这些脚本,具体如下:

  • 在 shell 中执行脚本。
  • 如果您指定了多个脚本(例如,如果同时使用 startup-scriptstartup-script-url),则代理会同时运行这两个脚本。
  • 如果为同一事件提供了多个脚本,代理会先执行来自网址的脚本。
  • 脚本执行完成后,代理会记录其退出状态。

您可以通过修改客机代理配置文件中的 MetadataScripts 选项来配置元数据脚本的执行。

用户账号和 SSH 密钥管理

客机代理使用 accounts_daemon 来管理本地用户账号和 SSH 密钥,用于控制对实例的访问权限。具体行为因 Linux 和 Windows 操作系统而异。

您可以通过在客机代理配置文件中配置 Accounts 选项来修改账号管理选项。

Linux

OS Login 用于通过 IAM 管理对实例的 SSH 访问权限,而无需创建和管理单独的 SSH 密钥。如需详细了解 OS Login,请参阅 OS Login。在 Linux 实例上,如果未启用 OS Login,代理会使用元数据设置创建和管理本地用户账号及其 SSH 密钥。

当您从实例或项目元数据中添加或移除 SSH 密钥时,客机代理会创建或删除本地用户账号。如需管理这些本地用户账号,客机代理还会执行以下操作:

  • 为客机代理管理的每个用户账号维护 authorized_keys 文件,具体如下:
    • 将 SSH 密钥添加到元数据后,代理会为用户账号创建一个 authorized_keys 文件。
    • 从元数据中移除用户的所有 SSH 密钥后,代理会删除用户账号的 authorized_keys 文件。
  • 通过使用 google-sudoers Linux 群组来管理管理员权限。此群组的任何成员都会获得实例的 sudo 权限。
  • 将代理预配的所有用户账号添加到 google-sudoers 群组。
  • 将用户账号添加到您在客机代理配置文件的 groups 选项中指定的任何其他 Linux 群组。

Windows

在 Windows 实例上,代理会在实例级层或项目级层自动为元数据 SSH 密钥中指定的任何 SSH 用户账号创建本地用户账号。客机代理还会处理创建用户账号以及设置或重置密码的操作。使用 SSH 连接到 Windows 实例需要这些本地用户账号。

您可以通过在 AD 控制器虚拟机上停用账号管理器来防止意外的 AD 用户预配。如需详细了解如何在 Compute Engine 上设置 AD,请参阅部署域控制器

OS Login 配置(仅限 Linux)

OS Login 用于通过 IAM 管理对实例的 SSH 访问权限,而无需创建和管理单独的 SSH 密钥。如需详细了解 OS Login,请参阅 OS Login 文档

启用 OS Login 时,客机代理负责配置实例以使用 OS Login。

客机代理通过完成以下任务来配置 OS Login

  • SSHD 配置文件添加 Google 配置块,并重启 SSHD
  • nsswitch.conf 文件添加 OS Login 条目。
  • SSHDPAM 配置文件添加 OS Login 条目。

如果您停用 OS Login,系统会移除配置更改。SSHD 配置文件的 Accounts 部分下的选项不适用于 OS Login 用户。

网络管理

客机代理会在启动时自动配置实例的网络接口。它会从元数据服务器读取网络配置,以确保您的实例正确连接到网络,并可以访问其他 Google Cloud服务。

您可以通过在客机代理配置文件中配置 NetworkInterfaces 选项来控制代理的网络管理行为。例如,您可以设置 manage_primary_nic = true 选项,让代理除了管理次要 NIC 之外,还管理主要网络接口卡 (NIC)。

每次启动时,客机代理都会执行以下关键任务:

  • 启用网络接口:代理会检测操作系统上的活跃网络管理器,并使用该管理器启用所有次要网络 NIC。
  • 配置 IP 路由:代理会为 IP 转发和别名 IP 范围等功能设置必要的 IP(仅限 IPv4)路由,如下所示:
    • 在主以太网接口上设置路由。
    • 默认配置 Google 路由,路由协议 ID 为 66。此 ID 是客机代理配置的 IP 地址的命名空间。您可以使用客机代理配置文件中的 ethernet_proto_id 选项来更改此 ID。
  • 创建通往元数据服务器的路由:代理可确保主 NIC 始终能够与元数据服务器通信,以获取实例信息。
  • VLAN 配置:如果您的实例配置为连接到虚拟局域网 (VLAN),则客机代理会自动处理设置。它会从元数据服务器读取 VLAN 配置,并配置实例内的网络接口以使用正确的 VLAN 标记。这样可确保实例在预期的逻辑网络上进行通信。重要的是,如果 VLAN 连接到主网卡,即使 manage_primary_nic 已停用,客机代理也会对其进行配置。

网络管理器选择

在 Linux 上,客机代理会自动检测系统上可用的网络管理器,并使用该管理器来配置网络接口。代理会按优先级顺序(从 netplandhclient)检查支持的管理器。

下表列出了支持的网络管理器,并按其默认情况下最常关联的操作系统进行了整理。您的具体实例配置可能有所不同,但下表反映了所列操作系统的默认网络管理器。

网络管理器 操作系统 配置位置 示例路径 备注
netplan
  • Debian 12 或更高版本
  • Ubuntu 20.04 或更高版本
/run/netplan/ /run/netplan/20-google-guest-agent-eth0.yaml 代理还可以使用 /etc/systemd/network/ 中的普适性位置
wicked
  • SLES
/etc/sysconfig/network/ /etc/sysconfig/network/ifcfg-eth0 系统不会覆盖现有的 ifcfg 文件,而是跳过这些文件。
NetworkManager
  • CentOS
  • RHEL
  • Rocky Linux
/etc/NetworkManager/system-connections/ /etc/NetworkManager/system-connections/google-guest-agent-eth0.nmconnection
systemd-networkd
  • Debian
/usr/lib/systemd/network/ /usr/lib/systemd/network/20-eth0-google-guest-agent.network
dhclient
  • Debian 11 或更低版本
  • Ubuntu 18.04 或更低版本
/run/ /run/dhclient.google-guest-agent.eth0.ipv4.pid 如果未检测到任何其他网络管理器,客机代理会默认使用 dhclient

安全元数据服务器 (MDS) 凭证管理

安全强化型虚拟机现在支持使用 HTTPS 端点 https://metadata.google.internal/computeMetadata/v1 与元数据服务器进行安全通信。此增强功能可提供更安全的信道来访问元数据。

为了实现这种安全通信,客机代理会在实例的磁盘上检索并存储必要的凭证。这些凭证会保存在标准位置,因此实例上运行的任何客户端应用都可以访问它们。如需查看这些位置,请参阅证书存储位置

HTTPS MDS 证书的设置默认处于停用状态。如需让安全强化型虚拟机自动设置 HTTPS MDS 证书,请将实例或项目中的 disable-https-mds-setup 元数据键设置为 false。如需设置元数据,请参阅设置和移除自定义元数据

由客机代理进行的凭证管理包括:

  • 初始更新:每当客机代理进程启动时,系统都会更新根证书和客户端凭证。
  • 自动刷新:为了提高安全性,客机代理每 48 小时自动刷新客户端凭证一次。
  • 重叠期:代理生成并保存新凭证,同时旧凭证保持有效。重叠期可确保客户端有足够的时间在旧凭证过期之前过渡到新凭证。此重叠期还允许代理在凭证获取失败时重试,从而确保在现有凭证失效之前获得有效凭证。
  • 构成:客机代理可确保客户端凭证由 EC(椭圆曲线)私钥与客户端证书串联而成。
  • 唯一性:客机代理可确保凭证对于实例而言是唯一的,并且无法在其他位置使用。

如需详细了解 HTTPS 元数据服务器端点,请参阅 HTTPS 元数据服务器端点简介

默认情况下,客机代理将证书直接写入磁盘。不过,您可以配置代理,以将证书集成到操作系统的内置证书存储区中。如需启用此集成,请将 enable-https-mds-native-cert-store 元数据键设置为 true。如需设置元数据,请参阅设置和移除自定义元数据

代理将证书添加到操作系统受信任证书存储区的行为因操作系统而异,具体如下:

Linux

客机代理执行以下步骤:

  1. 将 MDS 根证书添加到系统的受信任证书存储区。具体路径取决于操作系统发行版。如需查看这些位置,请参阅操作系统受信任证书存储区中的根证书存储
  2. 通过运行适合相应操作系统的命令(例如 update-ca-certificatesupdate-ca-trust)来更新本地受信任证书存储区。

Windows

代理会将客户端凭证添加到 Cert:\LocalMachine\My,并将根证书添加到 Cert:\LocalMachine\Root

Windows 故障切换集群支持(仅限 Windows)

客机代理会监控 Windows Server 故障切换集群中的活跃节点,并与 Google Cloud 内部负载均衡器协调,以将所有集群流量转发到预期节点。

您可以使用实例元数据或 instance_configs.cfg 文件中的以下字段来控制此行为:

  • enable-wsfc:设置为 true 时,代理会忽略所有 IP 转发信息,并开始响应健康检查端口。默认设置为 false
  • wsfc-agent-port:指定代理响应健康检查的端口。默认设置为 59998
  • wsfc-addrs:以英文逗号分隔的 IP 地址列表。借助此高级设置,您可以在同一实例上同时拥有常规转发 IP 和集群 IP。设置此字段后,代理只会跳过此列表中的 IP 的自动配置。默认情况下,此值未设置。

后续步骤