排查虚拟机关停和重新启动问题


本文档介绍了虚拟机 (VM) 实例意外关停和重新启动的常见原因,以及如何阻止这些情况。

虚拟机关停和重新启动可能是由系统事件或管理员活动引起的。系统事件关停和重新启动由 Google 系统或虚拟机的操作系统生成。管理员活动关停和重新启动由用户或服务账号生成的 API 调用生成。系统会记录所有关停和重新启动,但从虚拟机中发起的重新启动的除外。

准备工作

  • 设置身份验证(如果尚未设置)。身份验证是通过其进行身份验证以访问 Google Cloud 服务和 API 的过程。如需从本地开发环境运行代码或示例,您可以按如下方式向 Compute Engine 进行身份验证。

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

    控制台

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

    gcloud

    1. 安装 Google Cloud CLI,然后通过运行以下命令初始化 Google Cloud CLI:

      gcloud init
    2. 设置默认区域和可用区

诊断虚拟机关停和重新启动

如需诊断虚拟机的自发关停或重新启动的原因,您必须查询虚拟机的日志。如需快速确定未来虚拟机关停或重新启动的原因,请构建包含日志的信息中心。查询日志后,请查看 methodprincipalEmail 字段,以确定是哪个事件以及哪个用户或服务启动了关停或重新启动。

查询 Cloud Audit Logs

查询 Cloud Audit Logs,以显示可能导致关停或重新启动的系统事件和管理员活动列表。

控制台

  1. 在 Google Cloud 控制台中,转到日志浏览器页面。

    转到日志浏览器

  2. 查询字段中,输入以下查询:

    resource.type="gce_instance"
    "VM_NAME"
    logName:("logs/cloudaudit.googleapis.com%2Fsystem_event" OR "logs/cloudaudit.googleapis.com%2Factivity")
    

    VM_NAME 替换为关停或重新启动的虚拟机的名称。

  3. 如果您查找的事件是在一小时之前发生的,请点击时钟符号并输入自定义范围来设置自定义时间范围。

    设置查询时间范围。

  4. 点击运行查询。结果会显示在查询结果部分中。

  5. 点击每个结果旁边的展开箭头 以显示详细信息。

  6. 请参阅查看 Cloud Audit Logs,详细了解与关停和重启关联的 methodprincipalEmail 字段,以及您可以采取哪些措施来阻止它们。

gcloud

  1. 使用 gcloud logging read 命令查看 Cloud Audit Logs:

    gcloud logging read --freshness=TIME 'resource.type="gce_instance" "VM_NAME" logName:("logs/cloudaudit.googleapis.com%2Fsystem_event" OR "logs/cloudaudit.googleapis.com%2Factivity")'
    

    替换以下内容:

    • TIME:您要查询的时间。例如,1h 会查询过去一小时内的日志条目。如需了解日期和时间格式,请参阅 gcloud topic datetimes
    • VM_NAME:关停或重新启动的虚拟机的名称。

    结果显示。

  2. 请参阅查看 Cloud Audit Logs,详细了解与关停和重启关联的 methodprincipalEmail 字段,以及您可以采取哪些措施来阻止它们。

查看 Cloud Audit Logs

查看 Cloud Audit Logs 的 methodprincipalEmail 字段,以确定虚拟机关停或重新启动的原因。

  1. 查看 Cloud Audit Logs 的 method 字段,并将其与下表中列出的方法进行比较。

    方法 关停类型 说明
    compute.instances.repair.recreateInstance 系统事件

    如果您的虚拟机属于代管式实例组 (MIG),则 MIG 会重新创建虚拟机(如果虚拟机的状态从 RUNNING 更改),并且 MIG 不会发起状态更改。

    不是由 MIG 发起的实例状态更改包括:

    compute.instances.hostError 系统事件

    主机错误 (compute.instances.hostError) 意味着托管虚拟机的物理机器上存在硬件或软件问题,进而导致虚拟机崩溃。如果主机错误涉及硬件完全无法运行或其他硬件问题,则可能会阻止虚拟机实时迁移。如果您的虚拟机设置为自动重启(这是默认设置),Google 通常会在检测到错误后的 3 分钟内重启您的虚拟机。重启可能最多需要 5.5 分钟,具体取决于问题。

    具有本地 SSD 磁盘的虚拟机

    如果挂接了一个或多个本地 SSD 磁盘的虚拟机上出现主机错误,Compute Engine 会尽力重新连接到该虚拟机并保留本地 SSD 数据。在 Compute Engine 恢复您的虚拟机和本地 SSD 磁盘时,主机系统和底层磁盘无响应。

    您可以通过设置本地 SSD 恢复超时来指定 Compute Engine 尝试恢复本地 SSD 数据的时间。

    如需详细了解发生主机错误时本地 SSD 磁盘的行为,请参阅本地 SSD 数据持久性

    无响应的虚拟机

    有时,虚拟机可能会在检测到主机错误之前无响应。您可以通过设置主机错误恢复超时(预览版)来缩短 Compute Engine 等待重启或终止虚拟机的时间。如需了解详情,请参阅设置可用性政策

    物理硬件故障和软件故障可能会不时发生,但这种情况很少见。为了保护您的应用和服务免受这些可能具有中断性的系统事件的影响,请查看以下资源:

    Google 还提供 App Engine 等代管式服务以及 App Engine 柔性环境

    compute.instances.automaticRestart 系统事件

    如果虚拟机的 automaticRestart 主机维护政策设置为 true,则此事件会在发生 hostError 事件或 terminateOnHostMaintenance 事件后发生。在日志中,hostErrorterminateOnHostMaintenance 日志条目位于此日志之前。

    如果要更改虚拟机的主机维护政策,请参阅更新实例对应的选项

    compute.instances.guestTerminate 系统事件 虚拟机的操作系统发起关停。
    compute.instances.terminateOnHostMaintenance 系统事件

    如果您将虚拟机的 onHostMaintenance 主机维护政策设置为 TERMINATE,则在发生维护事件时,如果 Google 必须将虚拟机实例迁移到另一台主机上,那么 Compute Engine 会停止虚拟机。

    如果您想要更改虚拟机的 onHostMaintenance 政策,请参阅更新实例对应的选项

    compute.instances.preempted 系统事件

    Compute Engine 抢占了您的 Spot 虚拟机或旧版抢占式虚拟机:

    • 当 Compute Engine 抢占 Spot 虚拟机时,Compute Engine 会根据 终止操作停止或删除 Spot 虚拟机。Spot 虚拟机没有最长运行时。
    • 当 Compute Engine 抢占抢占式虚拟机时,Compute Engine 会在最长 24 小时的运行时间后停止虚拟机。为了避免这些限制,请改用 Spot 虚拟机。

    Spot 虚拟机和抢占式虚拟机是过剩的 Compute Engine 容量,因此 Compute Engine 可能在任何其他位置需要该容量时抢占它们。您可以按照最佳做法来帮助缓解抢占的影响。或者,如果您需要具有用户控制运行时的虚拟机,请改为创建标准虚拟机

    compute.instances.stop 管理员活动

    用户或服务账号停止虚拟机。

    继续下一步,以确定停止虚拟机的用户或服务账号。如需了解如何重启虚拟机,请参阅重启已停止的实例

    compute.instances.delete 管理员活动

    用户或服务账号删除虚拟机。

    继续下一步,以确定删除虚拟机的用户或服务账号。如需了解如何创建新虚拟机,请参阅创建和启动虚拟机

    compute.instances.insert 管理员活动

    创建虚拟机的用户或服务账号。

    继续下一步,以确定创建虚拟机的用户或服务账号。如需了解如何创建新虚拟机,请参阅创建和启动虚拟机

    compute.instances.reset 管理员活动

    用户或服务账号重置虚拟机。

    继续下一步,以确定停止虚拟机的用户或服务账号。

  2. 查看 Cloud Audit Logs 的 principalEmail 字段,以确定发起关停或重新启动的用户或服务。下表包含发起关停或重新启动的常见 Google 代管式服务。

    电子邮件 说明
    [email protected] 系统事件导致关停或重新启动。
    project-number@cloudservices.gserviceaccount.com

    服务代理发起关停。

    如需确定服务在其中发起关停的项目,请查看服务代理的 project-number

    如需确定发出请求的 Google 服务,请查看 protoPayload.requestMetadata.callerSuppliedUserAgent 字段。

    如果某用户触发了关停或重新启动,则其电子邮件地址会显示在 principalEmail 字段中。例如 [email protected]

    管理员可以通过更改用户账号的 Identity and Access Management 权限来阻止用户更改项目虚拟机的状态。如需了解详情,请参阅授予、更改和撤消对资源的访问权限

监控虚拟机生命周期事件

您可以通过构建 Cloud Monitoring 信息中心来监控虚拟机生命周期事件(包括关停、重新启动和主机错误)。

通过此信息中心,您可以直观呈现本文档的“查看审核日志”部分中详细说明的系统事件和管理员活动

虚拟机生命周期信息中心:停止和启动事件 图 1。示例信息中心,显示了实例的可用性及其生命周期事件,例如已停止的实例。

创建基于日志的指标

如需捕获虚拟机生命周期事件,请创建用户定义的基于日志的指标。此指标使用审核日志来记录特定虚拟机生命周期事件发生的次数。

如需获得创建指标所需的权限,请让您的管理员为您授予项目的 Logs Writer (roles/logging.logWriter) IAM 角色。如需详细了解如何授予角色,请参阅管理访问权限

您也可以通过自定义角色或其他预定义角色来获取所需的权限。

通过执行以下操作,创建用户定义的基于日志的指标:

  1. 在 Google Cloud 控制台中,进入基于日志的指标页面。

    转到“基于日志的指标”

  2. 点击创建指标

共享类型部分,执行以下操作:

  • 选择 Counter
  • 发行版保留为未选中的默认设置。

详细信息部分,输入以下信息:

  • 基于日志的指标名称vm-lifecycle-events。您必须使用此确切名称,信息中心才能正常工作。
  • 说明:(可选)输入此指标的说明。
  • 单位1
  1. 过滤条件选择部分中,指定以下内容:

    • 选择日志范围下拉菜单中,选择项目日志
    • 构建过滤条件中,输入
      resource.type = "gce_instance" AND
      log_id("cloudaudit.googleapis.com/activity") OR
      log_id("cloudaudit.googleapis.com/system_event")
      operation.first="true"
  2. 标签部分中,点击添加标签

  3. 指定以下内容:

    • 标签名称method
    • 标签类型STRING
    • 字段名称protoPayload.methodName
    • 正则表达式
      (recreateInstance|hostError|automaticRestart|guestTerminate|terminateOnHostMaintenance|preempted|insert|stop|delete|reset|start)
  4. 点击完成

  5. 点击创建指标

使用信息中心

在虚拟机遇到系统事件或管理员活动之前,信息中心上不会显示任何数据。如需测试信息中心是否正常工作,请执行管理员活动,例如 stopstart 操作:

  1. 对任何现有虚拟机执行 stopstart 操作,或创建新的虚拟机以进行测试。

如需获得使用信息中心所需的权限,请让您的管理员为您授予项目的 Monitoring Dashboard Viewer (roles/monitoring.dashboardViewer) IAM 角色。如需详细了解如何授予角色,请参阅管理访问权限

您也可以通过自定义角色或其他预定义角色来获取所需的权限。

  1. 在 Google Cloud 控制台中,打开信息中心

    转到“信息中心”

  2. 信息中心列表标签页中,打开 GCE VM Lifecycle Events Monitoring 信息中心。

  3. 名称下拉菜单中选择虚拟机。

  4. 将时序范围缩小到相关时间范围。

    如需了解更多过滤信息中心的方法,请参阅添加临时过滤条件

信息中心包含两个图表,其中显示了虚拟机上发生的系统事件和管理员活动的时间轴:

  1. 虚拟机生命周期时间轴图表显示以下内容:

    • compute.googleapis.com/instance/uptime 指标,指示虚拟机是否在给定时间点运行,其中 1 表示启动,0 表示关闭。请注意,此指标反映的是用户活动和系统事件影响下的使用期限,并不表示 Compute Engine 服务等级协议 (SLA)
    • vm-lifecycle-events 基于日志的指标,用于计算在给定时间点对虚拟机执行的生命周期操作数(例如 stopstart
  2. “事件”图表显示的是相同的 vm-lifecycle-events 基于日志的指标,但放大了视图,便于阅读。请注意,虽然 X 轴是一致的,但两个图表的颜色并不同步。

调查跨项目的大规模虚拟机关停

如果共享 VPC 宿主项目的计费处于非活动状态或已停用,则 Compute Engine 可能会关停连接到共享 VPC 宿主项目的多个虚拟机。

如需确定您的虚拟机是否已被大规模关停请求关停,请查找由 [email protected] 启动的停止操作。

启动受影响的实例会返回类似于以下内容的错误:

Starting instance(s) INSTANCE_NAME...failed.
ERROR: (gcloud.compute.instances.start) The default network interface [nic0] is frozen.

如需解决此问题,请执行以下操作:

  1. 使用 gcloud compute instances describe 命令确定虚拟机使用的共享 VPC:

    gcloud compute instances describe VM_NAME \
       --format="flattened(networkInterfaces[].network)"
    

    输出类似于以下内容:

    networkInterfaces[0].network: https://www.googleapis.com/compute/v1/projects/SHARED_VPC_PROJECT/global/networks/FROZEN_NETWORK
    
  2. 如果结算功能已停用,请在共享 VPC 的宿主项目中进行验证。

    resource.type="project"
    protoPayload.request.@type="type.googleapis.com/google.internal.cloudbilling.billingaccount.v1.DisableResourceBillingRequest"
    protoPayload.response.resourceBillingInfo.billingAccountAssignmentType="DISABLED"
    
  3. 如果适用,请在宿主项目上启用结算功能

为了帮助防止再次出现此问题,请参阅保护项目与其结算账号之间的关联