【问题标题】:Python Celery Autoscaling KubernetesPython Celery 自动缩放 Kubernetes
【发布时间】:2020-11-25 12:58:50
【问题描述】:

我目前正在使用 AWS EBS,但切换到 Kubernetes 来管理我们的 celery 工作池。根据 Celery 文档,当您想停止 celery 工人时,有two types of signals that can be sent to the worker。一个是TERM,另一个是KILL。当使用 TERM 时,它会等待工作人员在停止之前完成当前正在执行的工作。当KILL用于立即停止,这会导致任务丢失。我的问题是在缩小工作池时 Kubernetes 自动缩放,我如何确保将 TERM 发送给工作人员而不是 KILL?我在使用 AWS EBS 时遇到了这种缩减问题,其中 Celery 花在缩减时显示任务丢失。

【问题讨论】:

  • 我也有同样的问题!我根据任务队列中的消息数量自动扩展了芹菜工人的部署。一旦所有消息都被工人消费掉,它就会开始缩减规模,而 celery 工人仍然有未完成的任务在其中运行。有什么解决办法吗?

标签: python kubernetes amazon-elastic-beanstalk celery


【解决方案1】:

这里的事件链是:

  1. Horizo​​ntalPodAutoscaler 减少了它控制的 Deployment 上的 replicas:
  2. Deployment 会减少其对应 ReplicaSet 上的 replicas:
  3. ReplicaSet 根据需要删除 Pod。
  4. Kubernetes 向每个容器发送 SIGTERM 并等待其关闭。
  5. 如果容器尚未退出,它会向每个容器发送 SIGKILL。

具体的关闭顺序在Termination of Pods 中进行了描述。您的进程将获得 SIGTERM,然后在 30 秒后收到 SIGKILL(如果尚未退出)。与任何其他路径相比,HPA 删除 pod 并没有什么特别之处。

【讨论】:

  • 如果现有进程在收到 SIGTERM 后花费的时间超过 30 秒,那么我会因为 30 秒后的自动 SIGKILL 而丢失任务。有什么办法可以避免吗? (我的 pod 正在运行一项耗时 > 1 小时才能完成的长时间任务,并且它们已根据任务队列中未决消息的数量自动缩放)
  • 嘿@sap 你是如何设法让 HPA 与队列长度一起工作的?
  • @chaws 我使用了 redis 队列,因此使用了 redis 队列导出器将队列长度发布到 prometheus。从那里我创建了一个自定义指标作为“队列中待处理消息数与工作 pod 数之比”,并根据该指标缩放 HPA。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2018-12-13
  • 2021-04-07
  • 2017-01-18
  • 2020-07-09
  • 2021-01-26
  • 2019-08-07
  • 2016-09-04
相关资源
最近更新 更多