处理 Cloud Run 容器关闭

5
当编写Cloud Run服务时,我们开发一个容器,该容器监听PORT环境变量来处理传入的HTTP请求。容器实例会在处理请求后存活一段时间,并等待更多请求的到来。如果没有更多的请求,GCP将关闭容器。在这方面,我有一个问题。
在容器内部是否存在钩子、信号或其他指示表明容器正在被关闭?
以我的例子为例,我的容器希望干净地结束。也许它想关闭连接或对缓存进行快速刷新。

我会尝试监听 SIGTERM 信号并查看是否触发。这是标准的 Docker 容器关闭序列的一部分,我猜在这里也会发生类似的事情。 - Travis Webb
我发现了一个关于Cloud Run的非常好的FAQ,其中有一个答案...请参见...https://github.com/ahmetb/cloud-run-faq#what-is-the-termination-signal-for-cloud-run-services - Kolban
1
请记住,只有在实例处理请求时才会计费,而在此情况下,您希望执行一些不需要请求的处理(不计费)。您需要有一个强有力的用例来证明这一点! 为了符合Cloud Run的精神,该服务是无状态的。我可以理解必须关闭连接以防止任何守护程序连接到外部服务,但在Cloud Run容器契约中,刷新缓存不是一个有效的用例。 - guillaume blaquiere
如果我捕获sigterm信号,并且在关闭期间如果我ping我的云运行服务,那么它能防止云运行关闭或者只是能停止冷启动吗? @guillaumeblaquiere - john mich
1
@johnmich,如果您对Cloud Run进行ping操作,则可以防止冷启动(如果它是服务的最新活动实例)。我在本篇文章中描述了如何实现。但触发关机的实例将会关闭。 - guillaume blaquiere
显示剩余2条评论
2个回答

5
发现了一份关于Cloud Run的常见问题解答在这里。其中有一项内容如下:
“Cloud Run服务的终止信号是什么?”
目前,Cloud Run在缩放到零时使用unix信号9(SIGKILL)来终止容器。SIGKILL无法被应用程序捕获。因此,您的应用程序应该可以突然被杀死而不会出现问题。
另外一个相关且重要的条目如下:
“我的服务何时缩放到零?”
Cloud Run不能保证服务保持“热”。这取决于诸如容量和Google的实现细节等因素。一些用户看到他们的服务保持热状态长达一小时或更长时间。

观点

我认为有趣的是,这个故事似乎是一个立即的SIGKILL。如果我们以Docker为容器环境的基础,我们可以阅读docker stop,这似乎是一种清洁地停止容器的方法。在它自己的描述中,它说:

容器内的主进程将接收到SIGTERM信号,并在优雅期限后,接收到SIGKILL信号。

这似乎表明对于一个正常的Docker容器停止,运行容器的进程将会接收到一个信号。


2

SIGTERM(unix信号15)现在已发送到Cloud Run服务,如果您在代码中处理信号,则有10秒钟的时间来处理关闭任何资源等。

请参见此处

容器实例可以随时关闭。当需要关闭容器实例时,新的传入请求将被路由到其他实例,并且当前正在处理的请求将被给予完成的时间。容器实例然后接收到SIGTERM信号,表示开始一个10秒的周期,然后关闭(使用SIGKILL信号)。在此期间,分配CPU和计费容器实例。如果容器实例未捕获SIGTERM信号,则立即关闭。

enter image description here

(从 这里 获取的代码图像)

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接