kubernetes 当worker pod降级时,气流任务失败,SIGTERM

vcirk6k6  于 2022-11-02  发布在  Kubernetes
关注(0)|答案(1)|浏览(169)

我正在AWS上的EKS上运行一个气流集群。我已经为工作机设置设置了一些扩展配置。如果CPU/内存〉70%,气流将加速新的工作机单元。但是,当这些工作机单元向下扩展时,我面临着一个问题。当工作机单元开始向下扩展时,会发生两件事:
1.如果工作单元上没有任务正在运行,则它将在40秒内终止。
1.如果有任何任务正在一个工作单元上运行,它会在大约8分钟内终止,再过一分钟,我发现UI上的任务失败。
我已经为工作器pod终端设置了以下两个属性。

celery:
    ## if celery worker Pods are gracefully terminated
    ## - consider defining a `workers.podDisruptionBudget` to prevent there not being
    ##   enough available workers during graceful termination waiting periods
    ##
    ## graceful termination process:
    ##  1. prevent worker accepting new tasks
    ##  2. wait AT MOST `workers.celery.gracefullTerminationPeriod` for tasks to finish
    ##  3. send SIGTERM to worker
    ##  4. wait AT MOST `workers.terminationPeriod` for kill to finish
    ##  5. send SIGKILL to worker
    ##
    gracefullTermination: true

    ## how many seconds to wait for tasks to finish before SIGTERM of the celery worker
    ##
    gracefullTerminationPeriod: 180

  ## how many seconds to wait after SIGTERM before SIGKILL of the celery worker
  ## - [WARNING] tasks that are still running during SIGKILL will be orphaned, this is important
  ##   to understand with KubernetesPodOperator(), as Pods may continue running
  ##
  terminationPeriod: 120

我可以看到,无论任务是否运行,工作单元都应该在5分钟后关闭。所以我不确定为什么我看到工作单元总共需要8分钟才能终止。我的主要问题是,有没有任何方法可以设置配置,使工作单元只在任务运行完成时才终止。由于我的任务可以在几分钟到几小时之间的任何地方运行,所以我不知道“I don“我不想为gracefullTerminationPeriod设置一个大的值。我希望能有任何解决方案。
更多信息:通常,长时间运行的任务是一个python操作符,它分别通过Prestohook或DatabricksOperator运行presto sql查询或Databricks作业。我不希望这些任务在完成对工作单元的执行之前收到SIGTERM。

mpbci0fu

mpbci0fu1#

由于K8端的限制,这是不可能的。更多的细节可以在here上找到。但是,通过使用较大的“gracefulTerminationPeriod”值可以工作,虽然这不是我想要做的,但它比我最初想象的要好。当设置了较大的gracefulTerminationPeriod值时,worker不会等待gracefulTerminationPeriod时间终止。如果worker单元被标记为终止,则只要其上运行的任务达到零,它就会终止。
直到K8接受建议的变化和新的社区掌舵图表发布,我认为这是最好的解决方案,而不会招致成本保持工人了。

相关问题