首页 > 解决方案 > 如何在 Kubernetes 环境中正确终止 celery 任务?

问题描述

如何正确杀死在 kubernetes 环境中的容器上运行的 celery 任务?整个应用程序的结构(全部用 Python 编写)如下:

  1. 向我们的 API 发出请求的 SDK;

  2. 一种 Kubernetes 结构,其中一个 pod 运行 API,其他 pod 运行 celery 容器,以处理一些可由 API 触发的长时间运行的任务。这些芹菜容器自动缩放。

假设我们调用一个 SDK 方法,该方法反过来向 API 发出请求,触发在 celery 容器上运行的任务。如果需要,终止此任务的正确/优雅方法是什么?我知道 celery 任务有一个revoke()方法,但是我尝试使用这种方法,但它不起作用,即使使用terminate=Trueand signal=signal.SIGKILL(也许这与我使用 Azure 服务总线作为代理的事实有关?)

也许芹菜任务与其相应容器名称之间的映射会有所帮助,但我也找不到获取此信息的方法。

任何帮助和/或想法将不胜感激。

标签: pythonkubernetescontainerscelery

解决方案


我找到的解决方案是写入 API 和 Celery 容器共享的文件。在此文件中,每当捕获到中断时,都会将标志设置为true. 在芹菜容器内,我会定期检查此类文件的内容。如果标志设置为true,那么我会优雅地清理并引发错误。


推荐阅读