本文档介绍了虚拟机 (VM) 实例意外关停和重新启动的常见原因,以及如何阻止这些情况。
虚拟机关停和重新启动可能是由系统事件或管理员活动引起的。系统事件关停和重新启动由 Google 系统或虚拟机的操作系统生成。管理员活动关停和重新启动由用户或服务账号生成的 API 调用生成。系统会记录所有关停和重新启动,但从虚拟机中发起的重新启动的除外。
准备工作
-
如果您尚未设置身份验证,请进行设置。身份验证是通过其进行身份验证以访问 Google Cloud 服务和 API 的过程。如需从本地开发环境运行代码或示例,您可以选择以下任一选项向 Compute Engine 进行身份验证:
Select the tab for how you plan to use the samples on this page:
Console
When you use the Google Cloud console to access Google Cloud services and APIs, you don't need to set up authentication.
gcloud
-
Install the Google Cloud CLI, then initialize it by running the following command:
gcloud init
- Set a default region and zone.
在 Google Cloud 控制台中,转到日志浏览器页面。
在查询字段中,输入以下查询:
resource.type="gce_instance" "VM_NAME" logName:("logs/cloudaudit.googleapis.com%2Fsystem_event" OR "logs/cloudaudit.googleapis.com%2Factivity")
将
VM_NAME
替换为关停或重新启动的虚拟机的名称。如果您查找的事件是在一小时之前发生的,请点击时钟符号并输入自定义范围来设置自定义时间范围。
点击运行查询。结果会显示在查询结果部分中。
点击每个结果旁边的展开箭头
以显示详细信息。请参阅查看 Cloud Audit Logs,详细了解与关停和重启关联的
method
和principalEmail
字段,以及您可以采取哪些措施来阻止它们。使用
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
:关停或重新启动的虚拟机的名称。
结果显示。
请参阅查看 Cloud Audit Logs,详细了解与关停和重启关联的
method
和principalEmail
字段,以及您可以采取哪些措施来阻止它们。查看 Cloud Audit Logs 的
method
字段,并将其与下表中列出的方法进行比较。方法 关停类型 说明 compute.instances.repair.recreateInstance
系统事件 如果您的虚拟机属于托管式实例组 (MIG),则 MIG 会重新创建虚拟机(如果虚拟机的状态从
RUNNING
更改),并且 MIG 不会发起状态更改。不是由 MIG 发起的实例状态更改包括:
compute.instances.hostError
系统事件 主机错误 (
compute.instances.hostError
) 意味着托管计算实例的物理机器或数据中心基础架构上存在硬件或软件问题,进而导致实例崩溃。如果主机错误涉及硬件完全无法运行或其他硬件问题,则可能会阻止实例实时迁移。如果您的实例设置为自动重启(这是默认设置),Compute Engine 通常会在检测到错误后的 3 分钟内重启您的实例。重启可能最多需要 5.5 分钟,具体取决于问题。有时,计算实例可能会在发出主机错误信号之前无响应。您可以通过设置主机错误恢复超时(预览版)来缩短 Compute Engine 等待重启或终止实例的时间。如需了解详情,请参阅设置可用性政策。
物理硬件故障和软件故障可能会不时发生,但这种情况很少见。为了保护您的应用和服务免受这些可能具有中断性的系统事件的影响,请查看以下资源:
Google 还提供 App Engine 等代管式服务以及 App Engine 柔性环境。
compute.instances.automaticRestart
系统事件 如果虚拟机的
automaticRestart
主机维护政策设置为true
,则此事件会在发生hostError
事件或terminateOnHostMaintenance
事件后发生。在日志中,hostError
或terminateOnHostMaintenance
日志条目位于此日志之前。如果要更改虚拟机的主机维护政策,请参阅更新实例对应的选项。
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
管理员活动 用户或服务账号重置虚拟机。
继续下一步,以确定停止虚拟机的用户或服务账号。
查看 Cloud Audit Logs 的
principalEmail
字段,以确定发起关停或重新启动的用户或服务。下表包含发起关停或重新启动的常见 Google 代管式服务。电子邮件地址 说明 system@google.com
系统事件导致关停或重新启动。 project-number@cloudservices.gserviceaccount.com
服务代理发起关停。
如需确定服务在其中发起关停的项目,请查看服务代理的
project-number
。如需确定发出请求的 Google 服务,请查看
protoPayload.requestMetadata.callerSuppliedUserAgent
字段。如果某用户触发了关停或重新启动,则其电子邮件地址会显示在
principalEmail
字段中。例如cloudysanfrancisco@gmail.com
。管理员可以通过更改用户账号的 Identity and Access Management 权限来阻止用户更改项目虚拟机的状态。如需了解详情,请参阅授予、更改和撤消对资源的访问权限。
在 Google Cloud 控制台中,进入基于日志的指标页面。
点击创建指标。
- 选择
Counter
。 - 将发行版保留为未选中的默认设置。
- 基于日志的指标名称:
vm-lifecycle-events
。您必须使用此确切名称,信息中心才能正常运行。 - 说明:(可选)输入此指标的说明。
- 单位:
1
在过滤条件选择部分中,指定以下内容:
- 从选择项目或日志存储桶菜单中,选择项目日志
- 在构建过滤条件中,输入:
resource.type = "gce_instance" AND log_id("cloudaudit.googleapis.com/activity") OR log_id("cloudaudit.googleapis.com/system_event") operation.first="true"
在标签部分中,点击添加标签。
指定以下内容:
- 标签名称:
method
- 标签类型:
STRING
- 字段名称:
protoPayload.methodName
- 正则表达式:
(recreateInstance|hostError|automaticRestart|guestTerminate|terminateOnHostMaintenance|preempted|insert|stop|delete|reset|start)
- 标签名称:
点击完成。
点击创建指标。
- 对任何现有虚拟机执行
stop
和start
操作,或创建一个新虚拟机以进行测试。 在 Google Cloud 控制台中,打开信息中心。
在信息中心列表标签页中,打开
GCE VM Lifecycle Events Monitoring
信息中心。从名称下拉菜单中选择虚拟机。
将时序范围缩小到相关时间范围。
如需了解过滤信息中心的更多方法,请参阅添加临时过滤条件。
虚拟机生命周期时间轴图表会显示以下内容:
compute.googleapis.com/instance/uptime
指标,指示虚拟机是否在给定时间点运行,其中 1 表示启动,0 表示关闭。请注意,此指标反映的是用户活动和系统事件影响下的使用期限,并不表示 Compute Engine 服务等级协议 (SLA)。vm-lifecycle-events
基于日志的指标,用于计算在给定时间点对虚拟机执行的生命周期操作数(例如stop
或start
)
“事件”图表显示的是相同的基于日志的
vm-lifecycle-events
指标,但采用放大视图,以便于阅读。请注意,虽然 X 轴已对齐,但两个图表之间的颜色未同步。使用
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
如果结算功能已停用,请在共享 VPC 的宿主项目中进行验证。
resource.type="project" protoPayload.request.@type="type.googleapis.com/google.internal.cloudbilling.billingaccount.v1.DisableResourceBillingRequest" protoPayload.response.resourceBillingInfo.billingAccountAssignmentType="DISABLED"
如果适用,请在宿主项目上启用结算功能。
- 系统事件触发的关闭和重启:识别 Google Cloud 内部系统因系统维护事件、正常硬件故障、资源限制而发起的终止。
- 系统管理员活动触发的关机/重新启动:调查由直接操作(例如用户或服务账号发出的 API 调用)导致的终止。这些操作可能包括手动关闭、重启或影响虚拟机状态的自动化进程。
- 非官方 RCA 文本生成:提供详细的根本原因分析文本,其中概述了确定的终止原因、涉及的系统或活动,以及适用情况下的预防未来再发生此类问题的建议。
- 完成然后复制以下命令。
- 打开 Google Cloud 控制台并激活 Cloud Shell。 打开 Cloud 控制台
- 粘贴复制的命令。
- 运行
gcpdiag
命令以下载gcpdiag
Docker 映像,然后执行诊断检查。如果适用,请按照输出说明修复失败的检查。 - 在本地工作站上复制并运行以下命令。
curl https://gcpdiag.dev/gcpdiag.sh >gcpdiag && chmod +x gcpdiag
- 执行
gcpdiag
命令:./gcpdiag runbook gce/vm-termination \ --parameter project_id=PROJECT_ID \ --parameter name=VM_NAME \ --parameter zone=ZONE
- PROJECT_ID:资源所在项目的 ID
- VM_NAME:项目中的目标虚拟机的名称。
- ZONE:目标虚拟机所在的可用区。
--universe-domain
:如果适用,则为托管资源的可信合作伙伴主权云网域--parameter
或-p
:Runbook 参数
诊断虚拟机关停和重新启动
如需诊断虚拟机的自发关停或重新启动的原因,您必须查询虚拟机的日志。如需快速确定未来虚拟机关停或重新启动的原因,请构建包含日志的信息中心。查询日志后,请查看
method
和principalEmail
字段,以确定是哪个事件以及哪个用户或服务启动了关停或重新启动。查询 Cloud Audit Logs
查询 Cloud Audit Logs,以显示可能导致关停或重新启动的系统事件和管理员活动列表。
控制台
gcloud
查看 Cloud Audit Logs
查看 Cloud Audit Logs 的
method
和principalEmail
字段,以确定虚拟机关停或重新启动的原因。监控虚拟机生命周期事件
您可以通过构建 Cloud Monitoring 信息中心来监控虚拟机生命周期事件(包括关停、重新启动和主机错误)。
通过此信息中心,您可以直观呈现本文档的“查看审核日志”部分中详细说明的系统事件和管理员活动。
图 1。一个示例信息中心,显示实例的可用性及其生命周期事件(例如已停止的实例)。
创建基于日志的指标
如需捕获虚拟机生命周期事件,请创建用户定义的基于日志的指标。此指标使用审核日志来统计特定虚拟机生命周期事件发生的次数。
如需获得创建指标所需的权限,请让您的管理员为您授予项目的 Logs Writer (
roles/logging.logWriter
) IAM 角色。如需详细了解如何授予角色,请参阅管理对项目、文件夹和组织的访问权限。如需创建用户定义的基于日志的指标,请执行以下操作:
在共享类型部分,执行以下操作:
在详细信息部分,输入以下信息:
使用信息中心
在虚拟机发生系统事件或管理员活动之前,信息中心不会显示任何数据。如需测试信息中心是否正常工作,请执行管理员活动,例如
stop
和start
操作:如需获得使用信息中心所需的权限,请让您的管理员为您授予项目的 Monitoring Dashboard Viewer (
roles/monitoring.dashboardViewer
) IAM 角色。如需详细了解如何授予角色,请参阅管理对项目、文件夹和组织的访问权限。信息中心包含两个图表,其中显示了虚拟机上发生的系统事件和管理员活动的时间轴:
调查跨项目的大规模虚拟机关停
如果共享 VPC 宿主项目的计费处于非活动状态或已停用,则 Compute Engine 可能会关停连接到共享 VPC 宿主项目的多个虚拟机。
如需确定您的虚拟机是否已被大规模关停请求关停,请查找由
cloud-cluster-manager@prod.google.com
启动的停止操作。启动受影响的实例会返回类似于以下内容的错误:
Starting instance(s) INSTANCE_NAME...failed. ERROR: (gcloud.compute.instances.start) The default network interface [nic0] is frozen.
如需解决此问题,请执行以下操作:
为了帮助防止再次出现此问题,请参阅保护项目与其结算账号之间的关联。
使用 gcpdiag 调查虚拟机终止问题
gcpdiag
是一种开源工具,不是由官方提供支持的 Google Cloud 产品。您可以使用gcpdiag
工具来帮助识别和修复 Google Cloud 项目问题。如需了解详情,请参阅 GitHub 上的 gcpdiag 项目。此 gcpdiag runbook 用于调查虚拟机终止问题,并检查以下方面:Google Cloud 控制台
gcpdiag runbook gce/vm-termination \ --parameter project_id=PROJECT_ID \ --parameter name=VM_NAME \ --parameter zone=ZONE
Docker
您可以使用封装容器运行
gcpdiag
,以在 Docker 容器中启动gcpdiag
。必须安装 Docker 或 Podman。查看此 Runbook 的可用参数。
替换以下内容:
实用标志:
如需查看所有
gcpdiag
工具标志的列表和说明,请参阅gcpdiag
使用说明。如未另行说明,那么本页面中的内容已根据知识共享署名 4.0 许可获得了许可,并且代码示例已根据 Apache 2.0 许可获得了许可。有关详情,请参阅 Google 开发者网站政策。Java 是 Oracle 和/或其关联公司的注册商标。
最后更新时间 (UTC):2024-12-18。
-