尽管 readiness_check 返回 200 状态响应,Google App Engine 应用程序部署仍失败

mvl*_*bat 5 google-app-engine google-cloud-platform

我正在尝试为我的应用程序设置一个readiness_check。这是我的相关部分app.yaml

readiness_check:
  path: '/readiness_check'
  check_interval_sec: 30
  timeout_sec: 4
  failure_threshold: 10
  success_threshold: 1
  app_start_timeout_sec: 300
Run Code Online (Sandbox Code Playgroud)

完整配置

我正在开发的项目是一个在 Express 上运行的 Node.js 应用程序。这是我处理/readiness_check端点的方法:

app
  .get(['/readiness_check'], (req, res) => res.sendStatus(200))
Run Code Online (Sandbox Code Playgroud)

如果没有readiness_check配置,我的部署过程会成功,并且我可以毫无问题地访问我的应用程序。但是,当我包含 时readiness_check,该过程失败并出现以下错误:

操作错误:错误响应:[4] 您的部署未能在指定时间内恢复正常,因此已回滚。如果您认为这是一个错误,请尝试调整“readiness_check”部分中的“app_start_timeout_sec”设置。

我检查了日志,可以看到它首先/readiness_check返回(当应用程序仍在启动时),然后开始返回状态代码。手动访问端点显示相同的结果。但由于某种原因,GCP 仍然认为我的部署不健康。502200curl

运行gcloud app describe确认我已splitHealthChecks启用该功能。

我浏览了文档中的故障排除部分,发现我没有启用servicecontrol.googleapis.comendpoints.googleapis.com服务,因此我启用了它们,但这也没有帮助。

我还在文档中看到了以下注释:

如果您检查应用程序的 nginx.health_check 日志,您可能会发现运行状况检查轮询的发生频率比您配置的要高,因为冗余运行状况检查程序也遵循您的设置。这些冗余运行状况检查程序是自动创建的,您无法配置它们。

这可能是一个不相关的问题,但我在我的应用程序日志中找不到nginx.health_check。我尝试搜索“nginx”文本,但没有看到任何与健康检查相关的内容。尽管在寻找“readiness_check”时,它确实向我展示了我上面提到的响应。

And*_*gau 3

可能有更多可能的方法来解决这个问题:

resources1) 您可以增加文件中标题中的值app.yaml您可以在此处查看更多相关信息。

2) 您可以将 的值增加到app_start_timeout_sec最大值即 1800。这样您就可以给您的应用更多的时间来变得健康。

3) 即使运行gcloud app describe确认您已启用 splitHealthChecks 功能,您是否执行了从旧版本迁移运行状况检查的所有正确步骤?它是否适用于您的应用程序的所有版本,甚至是旧版本?您可以在此处仔细检查转换运行状况检查所需执行的所有步骤。应用该命令gcloud app update --split-health-checks --project [YOUR_PROJECT_ID]可能还不够。

编辑: 尽管如此,理论上,如果您没有将流量分配到不同的版本,这应该不是问题(我无法想象为什么会这样)。在有关迁移的文档中,在步骤 2 中,它说:

转换应用程序中每个版本的旧版运行状况检查选项。

为此,您应该app.yaml为每个版本编写和更新相应的内容,然后部署服务,并分配给特定的版本 ID。例如:gcloud app deploy --project PROJECT_ID --version VERSION_ID --no-promote

4) 作为解决方法,您可以“伪造”响应readiness_check,在一定时间后给出 200 状态响应。您必须在此部分中添加自定义处理程序。这样部署就不会超时,并且将继续在后台工作。但是,这错过了准备情况检查的目的,因为您的实例可能会在未准备好时接收流量。如果您考虑到这一点,并且可以在您的应用程序中处理这个问题,那么这将是一个值得考虑的选择。

最后,我假设您使用的是 App Engine Flex,对于标准版本,健康检查不可用,并且会出现错误。您可以在此处查看此讨论