为什么我的 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)等外部系统引起的。

例如,

  1. 启动成本高的镜像构建pod
  2. liveness探测超时
  3. Kubernetes 发送 sig term 以优雅地停止容器

在 Kubernetes 场景中,一种解决方案可能是调整 liveness 或就绪探测配置以允许更长的启动时间。

要补充 rjurney 的评论,在 ECS 的 AWS 控制台上,您可以通过检查 ECS 集群下 运行 服务的“事件”选项卡来检查应用程序的状态。这就是我发现健康检查失败和其他问题的方式。

对我来说,由于我的 Docker Swarm 堆栈中的一个容器反复失败,导致工作进程退出,导致回滚过程。 gunicorn 进程在回滚进程开始时收到信号 'term'。