【问题标题】:Airflow tasks failing with SIGTERM when worker pod downscaling工作 pod 缩小规模时,气流任务因 SIGTERM 失败
【发布时间】:2022-10-07 18:32:01
【问题描述】:

我在 AWS 上的 EKS 上运行气流集群。我已经为工人设置设置了一些缩放配置。如果 CPU/Mem > 70%,则气流会启动新的工作 pod。但是,当这些工作 pod 缩小时,我面临一个问题。当 worker pod 开始缩小时,会发生两件事:

  1. 如果工作 pod 上没有正在运行的任务,它将在 40 秒内终止。
  2. 如果有任何任务在工作 pod 上运行,它会在大约 8 分钟后终止,再过一分钟,我发现任务在 UI 上失败。

    我在 helm 图表中为工人 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
    

    我可以看到工作 pod 应该在 5 分钟后关闭,或者不管任务是否运行。所以我不确定为什么我看到工人 pod 终止总共需要 8 分钟。我的主要问题是有什么方法可以设置配置,以便工作 pod 仅在其上运行的任务完成执行时终止。由于我的 dags 中的任务可以在几分钟到几小时之间运行,所以我不想为优雅终止期.我将不胜感激任何解决方案。

    更多信息:通常,长时间运行的任务是一个 python 运算符,它分别通过 Prestohook 或 DatabricksOperator 运行 presto sql 查询或 Databricks 作业。而且我不希望这些在他们完成对工作 pod 缩减的执行之前接收 SIGTERM。

    标签: kubernetes airflow celery amazon-eks airflow-2.x


    【解决方案1】:

    由于 K8 端的限制,这是不可能的。更多详细信息,请访问here。然而,通过使用较大的“gracefulTerminationPeriod”值,虽然这不是我打算做的,但它比我最初想象的要好。当gracefulTerminationPeriod 设置较大时,worker 不会等待gracefulTerminationPeriod 时间终止。如果一个工作 pod 被标记为终止,它会在其上运行的任务达到零时立即终止。

    在 K8 接受提议的更改并发布新的社区掌舵图之前,我认为这是最好的解决方案,而不会产生保持工人正常运转的成本。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2021-05-06
      • 2021-01-29
      • 1970-01-01
      • 2020-06-24
      • 2017-08-24
      • 1970-01-01
      • 1970-01-01
      • 2021-01-07
      相关资源
      最近更新 更多