繁体   English   中英

Google Cloud Run 在 Healthcheck 健康之前启动容器

[英]Google Cloud Run Starts Container Before Healthcheck is Healthy

我有一个启动时间相对较长的图像,约为 5 秒。 换句话说,Flask 服务器已启动并正在运行,但我将一些数据加载到全局变量中,因此此时服务器并未真正运行。 如果我在此期间 ping 我的 Google Cloud Run 端点,连接将超时

upstream request timeout

为避免这种情况,我添加了一个 docker 健康检查,它调用我的服务器中的一个端点。 这个 http 请求的超时时间为 2 秒。 如果超时,则意味着服务器仍在加载这些全局文件,端点尚未准备好接收请求。 这在开发中运行良好,但在 Cloud Run 中却不行。 Cloud Run 在完成加载之前开始向我的服务器提供流量 - 随后,在容器 HEALTHCHECK 状态实际上是“健康”之前。

我的问题

如何延迟 Cloud Run 将流量传输到我的容器,直到它完全设置好?

编辑 > 回答

在我的例子中(使用 Python + Gunicorn)我能够使用“应用程序工厂”模式解决这个问题。 也就是说,启动 Gunicorn

$ gunicorn 'test:create_app()'

其中 function create_app()返回 Flask 应用程序。

我对这为何有效的假设是因为在 function 返回之前,Gunicorn 尚未侦听它绑定的端口,并且 Cloud Run 不会开始将流量驱动到您的新运行容器,直到这种情况发生。

rodrigo-silveira 的解决方案:

就我而言(使用 Python + Gunicorn)我能够使用“应用程序工厂”模式解决这个问题。 也就是说,启动 Gunicorn

$ gunicorn 'test:create_app()' 其中 function create_app() 返回 Flask 应用程序。

我关于为什么会这样的假设是因为在 function 返回之前,Gunicorn 尚未侦听它绑定到的端口,并且 Cloud Run 不会开始将流量引导到您正在运行的新容器,直到出现这种情况。

注意 CloudRun 现在支持活性和启动探测。
https://cloud.google.com/run/docs/configuring/healthchecks

得知 CR 过去不支持标准的 Kube.netes 探针,我感到非常惊讶,但最近更新后似乎是这样。 不确定它是何时发生的,但在这篇文章发布时(2022 年 10 月 3 日)CloudRun 运行状况检查被认为处于“预览”状态。 就绪探针仍然不是问题,但现在允许启动探针,因此现在可以用标准启动探针取代原来很酷的 hack 解决方案。

以下是如何实施/测试启动探针的演练: https://stackoverflow.com/a/73942357/2548914

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM