You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何为Airflow Worker动态申请/释放EC2节点适配ML训练任务?

解决方案:AWS EKS Airflow KubernetesExecutor 动态调度大规格节点

需求可行性确认

完全可行。结合EKS Cluster Autoscaler与Airflow的KubernetesExecutor,可实现:

  • 触发大资源任务时自动扩容出匹配规格的EC2节点(如m5.8xlarge)
  • 任务结束后,Pod销毁,Cluster Autoscaler自动缩容释放闲置节点
  • 支持为不同DAG/任务配置独立的资源与调度规则

核心配置步骤

1. 确保EKS集群已部署Cluster Autoscaler

这是节点自动扩缩容的基础,需提前在EKS集群中部署Cluster Autoscaler,并配置对应节点组的扩缩容范围(如最小0,最大N)。可调整缩容延迟参数(如scale-down-unneeded-time: 10m),确保任务结束后节点快速释放。

2. 修改Airflow Helm Chart的values.yaml配置

针对全局默认Pod模板,或为特定任务配置基础模板,需调整以下项:

启用KubernetesExecutor(已确认启用可跳过)

executor: KubernetesExecutor

配置默认Pod模板的资源与调度规则

在airflow.kubernetesPodTemplate下定义大资源任务的默认配置:

airflow:
  kubernetesPodTemplate:
    # 资源请求与限制,匹配m5.8xlarge的规格(24vCPU/64GiB)
    resources:
      requests:
        cpu: "24"
        memory: "64Gi"
      limits:
        cpu: "24"
        memory: "64Gi"
    
    # 节点选择器:指定调度到m5.8xlarge节点
    nodeSelector:
      kubernetes.io/instance-type: m5.8xlarge
    
    # 若大规格节点配置了污点,添加容忍规则
    tolerations:
      - key: "ml-large-node"
        operator: "Exists"
        effect: "NoSchedule"
    
    # 任务结束后自动删除Pod(触发缩容的前提)
    isDeleteOperatorPod: true

3. DAG/Operator层面的自定义调度(针对不同任务)

若需要为不同DAG配置独立的节点规格或调度规则,直接在KubernetesPodOperator中覆盖全局配置即可:

from airflow.providers.cncf.kubernetes.operators.kubernetes_pod import KubernetesPodOperator

# 示例:ML训练任务的自定义Operator
ml_training_task = KubernetesPodOperator(
    task_id="weekly_ml_train",
    name="ml-train-pod",
    image="your-ml-training-image:v1",
    # 单独配置资源
    resources={
        "requests": {"cpu": "24", "memory": "64Gi"},
        "limits": {"cpu": "24", "memory": "64Gi"}
    },
    # 指定调度到m5.8xlarge节点
    node_selector={"kubernetes.io/instance-type": "m5.8xlarge"},
    # 容忍节点污点(若有)
    tolerations=[{"key": "ml-large-node", "operator": "Exists", "effect": "NoSchedule"}],
    # 任务结束立即删除Pod
    is_delete_operator_pod=True,
    namespace="airflow",
)

也可以通过pod_template_file参数引用外部Pod模板文件,实现更复杂的配置复用:

ml_training_task = KubernetesPodOperator(
    task_id="weekly_ml_train",
    pod_template_file="/path/to/ml-large-pod-template.yaml",
    is_delete_operator_pod=True,
    namespace="airflow",
)

关键注意事项

  • 确保节点组的实例类型包含m5.8xlarge,且Cluster Autoscaler有权限调整节点组规模
  • 资源请求需与节点规格匹配,避免因资源不足导致Pod pending或调度到错误节点
  • is_delete_operator_pod必须设为true,否则Pod会残留,节点无法被缩容释放

内容的提问来源于stack exchange,提问作者SHM

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.23 19:23:18