【发布时间】:2022-10-07 18:32:01
【问题描述】:
我在 AWS 上的 EKS 上运行气流集群。我已经为工人设置设置了一些缩放配置。如果 CPU/Mem > 70%,则气流会启动新的工作 pod。但是,当这些工作 pod 缩小时,我面临一个问题。当 worker pod 开始缩小时,会发生两件事:
- 如果工作 pod 上没有正在运行的任务,它将在 40 秒内终止。
- 如果有任何任务在工作 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