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"
事实:
- 健康检查类型设置为"port"
- 崩溃后应用程序重新启动并且 运行 正常
- 在不同的空间发生了多次
- 它也发生在一次不处理任何请求的开发实例上
问题:
- 这是什么健康检查?
- 为什么执行这个检查?
- 如何预防?
What is this health check?
Cloud Foundry 平台监控您的应用程序。当它检测到应用程序有 "crashed" 时,它将为您重新启动它。我将 "crashed" 放在引号中,因为这是一个模糊的术语。
平台将"crashed"定义为不再响应平台发送的健康检查的应用程序。有三项健康检查。
第一个是基于 pid 的健康检查,其中平台监控进程以确保它继续 运行。如果进程退出,平台会将其解释为崩溃并重新启动您的应用程序。
第二种是基于端口的健康检查。有了这个,平台确保您的应用程序正在侦听它已分配的端口。只要平台可以与该端口建立 TCP 连接,您的应用程序就被认为是健康的。
第三个是基于 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 操作员,看看发生了什么。健康检查失败的原因似乎与您的应用程序无关。他们应该能够平台日志以更好地了解故障。
希望对您有所帮助!
我是 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"
事实:
- 健康检查类型设置为"port"
- 崩溃后应用程序重新启动并且 运行 正常
- 在不同的空间发生了多次
- 它也发生在一次不处理任何请求的开发实例上
问题:
- 这是什么健康检查?
- 为什么执行这个检查?
- 如何预防?
What is this health check?
Cloud Foundry 平台监控您的应用程序。当它检测到应用程序有 "crashed" 时,它将为您重新启动它。我将 "crashed" 放在引号中,因为这是一个模糊的术语。
平台将"crashed"定义为不再响应平台发送的健康检查的应用程序。有三项健康检查。
第一个是基于 pid 的健康检查,其中平台监控进程以确保它继续 运行。如果进程退出,平台会将其解释为崩溃并重新启动您的应用程序。
第二种是基于端口的健康检查。有了这个,平台确保您的应用程序正在侦听它已分配的端口。只要平台可以与该端口建立 TCP 连接,您的应用程序就被认为是健康的。
第三个是基于 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 操作员,看看发生了什么。健康检查失败的原因似乎与您的应用程序无关。他们应该能够平台日志以更好地了解故障。
希望对您有所帮助!