问题排查

本页面介绍问题排查策略以及一些常见问题的解决方案。

如果您在部署新修订版本时看到以下错误消息,可以按照下文中所述的步骤来排查此问题:“容器启动失败。无法启动并侦听 PORT 环境变量所定义的端口。”(Container failed to start. Failed to start and then listen on the port defined by the PORT environment variable)

您的容器是否在本地运行?

在对 Cloud Run 进行问题排查时,在任何情况下都应该首先确认您可在本地运行容器映像。 如果您的容器映像未在本地运行,则说明此问题的根本原因不是来自 Cloud Run。 首先需要在本地诊断并修复问题。

您的容器是否正在侦听预期端口上的请求?

一个常见问题是忘记侦听传入请求,或者侦听的是错误端口上的传入请求。

根据容器运行时合同的要求,您的容器必须侦听由 Cloud Run 定义并在 PORT 环境变量中提供的端口上的传入请求。

如果您的容器未能侦听预期端口,这意味着该修订版本的运行状况检查将失败,该修订版本将处于错误状态,并且流量也不会路由到该版本。

您的容器是否正在侦听所有网络接口?

Cloud Run 服务未能启动的一个常见原因是容器内部的服务器进程被配置为侦听 localhost (127.0.0.1) 地址。该地址指向环回网络接口,此类接口无法从容器外部访问,因此无法执行 Cloud Run 运行状况检查,进而导致服务部署失败。

要解决此问题,请对应用进行配置,以启动 HTTP 服务器来侦听所有网络接口,此配置通常表示为 0.0.0.0

日志中是否显示错误?

请按照 Cloud Run 日志记录页面中的说明,使用 Cloud Logging 在 stdoutstderr 日志中查找应用错误。您还可以按照 Cloud Run 错误报告页面中的说明,查找 Error Reporting 中捕获的崩溃。另请参阅问题排查教程

您可能需要更新代码或修订版本设置来修复这些错误或崩溃。

您的容器实例是否超出内存?

容器实例可能会超出可用内存。 要确定是否发生了这种情况,请在 varlog/system 日志中查找此类错误。如果实例超出可用内存,建议提高内存限制

请注意,在运行 Cloud Run 容器实例的环境中,写入本地文件系统的文件会计入可用内存。 未写入 /var/log/*/dev/log 的所有日志文件也是如此。

打开或调用服务网址时是否出现 403 Error: Forbidden 错误

如果您在访问 Cloud Run 服务时收到 403“Error: Forbidden”错误消息,这表示您的客户端无权调用此服务。您可以通过执行以下任一操作来解决此问题:

使用 ID 令牌时出现错误 SIGNATURE_REMOVED_BY_GOOGLE

在以下情况下,您可能会在开发和测试过程中看到此错误:

  1. 用户通过 gcloud 命令行或 Cloud Shell 使用用户帐号登录。
  2. 用户通过 gcloud 命令行生成 ID 令牌。
  3. 然后,用户试图使用该 ID 令牌调用非公开的 Cloud Run 服务

这是设计所致。出于安全考虑,令牌签名已被移除,以防止任何非公开的 Cloud Run 服务重放按上述方式生成的 ID 令牌。如需使用新的 ID 令牌调用专用服务,请参阅测试服务中的身份验证

在处理长时间运行的请求时是否出现错误代码 203?

当您的服务正在处理长时间运行的请求时,即便是增加请求超时,请求也仍然可能被提前终止,并显示错误代码 203。 这可能是因为您还需要更新语言框架的请求超时设置。 例如,Node.js 开发者需要更新 server.timeout 属性

负载较高时是否出现 503 错误?

Cloud Run 负载平衡器会尽力将传入请求分发到所需数量的容器实例上。但是,如果您的各容器实例都在使用大量 CPU 来处理请求,那么它们将无法处理全部请求,并且部分请求将以 503 错误代码返回。

要缓解这一问题,请尝试降低并发请求数。如需了解详情,请参阅设置并发

是否出现了 429 错误?

如果服务已达到其容器实例数上限,系统会返回请求以及 429 错误代码。尝试通过增加“最大实例”设置来提高此限制,或者,如果您需设置 1000 多个实例,请申请增加配额

您的请求是否因没有可用实例而被中止?

如果 Cloud Run 基础架构的扩容速度不足以赶上流量高峰,则会出现以下错误:

The request was aborted because there was no available instance

此问题可能由以下任一原因引起:

您无法部署或调用其他 Google Cloud API 吗?

确认 Cloud Run 服务代理未被删除,并且具有“Cloud Run Service Agent”IAM 角色。该电子邮件地址以 @serverless-robot-prod.iam.gserviceaccount.com 结尾。

错误:声明的发布阶段不支持该功能

如果您直接调用 Cloud Run Admin API 并使用 Beta 版功能但未指定发布阶段注释,则会出现以下错误:

The feature is not supported in the declared launch stage

如果使用了任何 Beta 版功能,Direct Cloud Run Admin API 用户必须在请求中给资源添加 run.googleapis.com/launch-stage 注释 (BETA)。

以下示例在服务要求中添加了发布阶段注释:

kind: Service
metadata:
  annotations:
    run.googleapis.com/launch-stage: BETA

您的问题是否由容器沙盒限制所致?

如果您的容器可以在本地运行,但无法在 Cloud Run 中运行,则说明您的容器故障可能是源于 Cloud Run 容器沙盒

在 GCP Console 的 Cloud Logging 部分(而不是 Cloud Run 部分的“日志”标签页)的 varlog/system 日志中,您可以查找到严重级别为“DEBUG”的“容器沙盒”,或者使用日志查询:

resource.type="cloud_run_revision"
logName="projects/PROJECT_ID/logs/run.googleapis.com%2Fvarlog%2Fsystem"

varlog

例如:

Container Sandbox: Unsupported syscall setsockopt(0x3,0x1,0x6,0xc0000753d0,0x4,0x0)

如果您怀疑容器故障可能源于这些限制,请与支持团队联系,并将日志消息添加到支持服务工单中。Google Cloud 支持团队可能会要求您追踪您的服务发出的系统调用,以诊断 Cloud Logging 中未显示的较低级别的系统调用。