CloudFoundry 上 docker 容器中的健康检查失败:没有这样的文件或目录

Failed health check in docker container on CloudFoundry: no such file or directory

我是 CloudFoundry 中的 运行 docker 容器。

几天后实例崩溃并出现以下错误:

Instance became unhealthy: exec failed: container_linux.go:348: starting container process caused "exec: \"/tmp/lifecycle/healthcheck\": stat /tmp/lifecycle/healthcheck: no such file or directory"

事实:

问题:

  1. 这是什么健康检查?
  2. 为什么执行这个检查?
  3. 如何预防?

What is this health check?

Cloud Foundry 平台监控您的应用程序。当它检测到应用程序有 "crashed" 时,它将为您重新启动它。我将 "crashed" 放在引号中,因为这是一个模糊的术语。

平台将"crashed"定义为不再响应平台发送的健康检查的应用程序。有三项健康检查。

  1. 第一个是基于 pid 的健康检查,其中平台监控进程以确保它继续 运行。如果进程退出,平台会将其解释为崩溃并重新启动您的应用程序。

  2. 第二种是基于端口的健康检查。有了这个,平台确保您的应用程序正在侦听它已分配的端口。只要平台可以与该端口建立 TCP 连接,您的应用程序就被认为是健康的。

  3. 第三个是基于 HTTP 的健康检查。这实际上将 HTTP 请求发送到应用程序的端点。这必须以成功的 HTTP 状态代码响应,否则您的应用程序将被视为已崩溃。

部署到 CF 的每个应用程序都使用第一次运行状况检查。除了第一个之外,任何绑定了路由的应用程序都将使用第二个或第三个健康检查。

您的应用程序似乎正在使用基于端口的健康检查,即 #2。

Why this check is executed?

完成此检查是为了让平台知道您的应用程序是否正常 运行ning。如果不是,平台将尝试通过重新启动失败的应用程序实例来采取纠正措施。

如果第二次或第三次健康检查不是 运行,平台只能根据应用程序的 pid 状态判断应用程序是否 运行ning。这留下了很大的错误空间,进程可能已启动但挂起或以其他方式无法实际执行其工作。这些额外的健康检查允许平台检测更多故障场景并自动纠正它们。

How to prevent it?

您并不是真的想阻止运行状况检查。您可以将其关闭,但如前所述,这可能会使您的应用处于无法运行的状态。

如果你真的想关闭它,你可以将健康检查设置为 "process"。这告诉平台只执行上面的 pid 检查(即#1)。

例如:cf push --health-check-type process

在这种情况下,我建议联系您的 Cloud Foundry 操作员,看看发生了什么。健康检查失败的原因似乎与您的应用程序无关。他们应该能够平台日志以更好地了解故障。

希望对您有所帮助!