为什么我的 gunicorn Python/Flask 工人退出信号期?
Why are my gunicorn Python/Flask workers exiting from signal term?
我有一个 Python/Flask Web 应用程序,我正在通过 Gunicorn 在 Amazon ECS 上的 docker 映像中部署它。一切正常,然后突然间,包括上次成功的请求,我在日志中看到:
[2017-03-29 21:49:42 +0000] [14] [DEBUG] GET /heatmap_column/e4c53623-2758-4863-af06-91bd002e0107/ADA
[2017-03-29 21:49:43 +0000] [1] [INFO] Handling signal: term
[2017-03-29 21:49:43 +0000] [14] [INFO] Worker exiting (pid: 14)
[2017-03-29 21:49:43 +0000] [8] [INFO] Worker exiting (pid: 8)
[2017-03-29 21:49:43 +0000] [12] [INFO] Worker exiting (pid: 12)
[2017-03-29 21:49:43 +0000] [10] [INFO] Worker exiting (pid: 10)
...
[2017-03-29 21:49:43 +0000] [1] [INFO] Shutting down: Master
进程结束,程序退出。然后ECS重启服务,docker镜像又是运行,但同时服务中断了。
什么会导致我的程序获得 TERM 信号?我在网上找不到任何关于这件事的参考资料。请注意,这仅发生在 ECS 上的 Docker 中,而不是本地。
事实证明,在向系统添加登录页面后,健康检查将 302 重定向到 /login at /,这导致健康检查失败。因此容器会定期被杀死。亚马逊支持很棒!
虽然不是特别适用于问题中的问题,但这种行为可能是由容器编排(即 Kubernetes)等外部系统引起的。
例如,
- 启动成本高的镜像构建pod
- liveness探测超时
- Kubernetes 发送 sig term 以优雅地停止容器
在 Kubernetes 场景中,一种解决方案可能是调整 liveness 或就绪探测配置以允许更长的启动时间。
要补充 rjurney 的评论,在 ECS 的 AWS 控制台上,您可以通过检查 ECS 集群下 运行 服务的“事件”选项卡来检查应用程序的状态。这就是我发现健康检查失败和其他问题的方式。
对我来说,由于我的 Docker Swarm 堆栈中的一个容器反复失败,导致工作进程退出,导致回滚过程。 gunicorn 进程在回滚进程开始时收到信号 'term'。
我有一个 Python/Flask Web 应用程序,我正在通过 Gunicorn 在 Amazon ECS 上的 docker 映像中部署它。一切正常,然后突然间,包括上次成功的请求,我在日志中看到:
[2017-03-29 21:49:42 +0000] [14] [DEBUG] GET /heatmap_column/e4c53623-2758-4863-af06-91bd002e0107/ADA
[2017-03-29 21:49:43 +0000] [1] [INFO] Handling signal: term
[2017-03-29 21:49:43 +0000] [14] [INFO] Worker exiting (pid: 14)
[2017-03-29 21:49:43 +0000] [8] [INFO] Worker exiting (pid: 8)
[2017-03-29 21:49:43 +0000] [12] [INFO] Worker exiting (pid: 12)
[2017-03-29 21:49:43 +0000] [10] [INFO] Worker exiting (pid: 10)
...
[2017-03-29 21:49:43 +0000] [1] [INFO] Shutting down: Master
进程结束,程序退出。然后ECS重启服务,docker镜像又是运行,但同时服务中断了。
什么会导致我的程序获得 TERM 信号?我在网上找不到任何关于这件事的参考资料。请注意,这仅发生在 ECS 上的 Docker 中,而不是本地。
事实证明,在向系统添加登录页面后,健康检查将 302 重定向到 /login at /,这导致健康检查失败。因此容器会定期被杀死。亚马逊支持很棒!
虽然不是特别适用于问题中的问题,但这种行为可能是由容器编排(即 Kubernetes)等外部系统引起的。
例如,
- 启动成本高的镜像构建pod
- liveness探测超时
- Kubernetes 发送 sig term 以优雅地停止容器
在 Kubernetes 场景中,一种解决方案可能是调整 liveness 或就绪探测配置以允许更长的启动时间。
要补充 rjurney 的评论,在 ECS 的 AWS 控制台上,您可以通过检查 ECS 集群下 运行 服务的“事件”选项卡来检查应用程序的状态。这就是我发现健康检查失败和其他问题的方式。
对我来说,由于我的 Docker Swarm 堆栈中的一个容器反复失败,导致工作进程退出,导致回滚过程。 gunicorn 进程在回滚进程开始时收到信号 'term'。