在EKS集群的Airflow中使用PVC上传DAG遇问题求助
问题分析与解决方案
一、核心错误点
- hostPath PV在EKS中不适用
EKS是分布式集群,每个节点的本地hostPath路径相互独立,Pod重启后若调度到其他节点,之前复制的DAG文件会因节点本地路径不一致丢失,这就是重启Pod后dag.py消失的原因。同时Airflow的Webserver、Scheduler等组件可能被调度到不同节点,导致各组件无法共享同一份DAG文件,这也是初期DAG在UI不显示的关键原因——Scheduler未读取到DAG。 - 存储类与访问模式不匹配
你使用的gp3-storage-class是AWS EBS的存储类,而EBS仅支持ReadWriteOnce访问模式,但你定义的PV/PVC指定了ReadWriteMany,这会导致PV/PVC绑定异常,无法提供正确的共享存储能力。
二、正确配置步骤
1. 创建EKS兼容的共享存储(AWS EFS)
EKS中实现ReadWriteMany共享存储,推荐使用AWS EFS:
- 在AWS控制台创建EFS文件系统,确保与EKS集群同VPC,且安全组允许集群节点访问EFS的NFS端口(2049)。
- 安装EFS CSI驱动到EKS集群,使Kubernetes可挂载EFS。
- 创建EFS对应的StorageClass:
apiVersion: storage.k8s.io/v1 kind: StorageClass metadata: name: efs-sc provisioner: efs.csi.aws.com parameters: provisioningMode: efs-ap fileSystemId: <你的EFS文件系统ID> directoryPerms: "700"
2. 重新创建PV/PVC
使用EFS的StorageClass创建PVC(EFS的PV可由CSI驱动自动生成,无需手动定义):
apiVersion: v1 kind: PersistentVolumeClaim metadata: name: airflow-dags-pvc namespace: airflow spec: accessModes: - ReadWriteMany resources: requests: storage: 1Gi storageClassName: efs-sc
3. 重新安装Airflow Helm Chart
确保配置指向新的PVC:
helm install my-airflow apache-airflow/airflow \ --namespace airflow \ --set dags.persistence.enabled=true \ --set dags.persistence.existingClaim=airflow-dags-pvc \ --set airflow.config.AIRFLOW__CORE__DAGS_FOLDER=/opt/airflow/dags
三、正确上传DAG的方式
方式1:通过Pod上传DAG
找到挂载了airflow-dags-pvc的Pod(如Webserver Pod),用kubectl cp上传本地DAG:
# 查看目标Pod名称 kubectl get pods -n airflow | grep webserver # 复制本地dag.py到Pod的DAG目录 kubectl cp ./dag.py airflow/<webserver-pod-name>:/opt/airflow/dags/
所有挂载该PVC的Airflow组件会共享这份DAG,Airflow默认每5分钟扫描一次DAG目录,无需重启Pod即可识别新DAG(可通过AIRFLOW__SCHEDULER__DAG_DIR_LIST_INTERVAL调整扫描间隔)。
方式2:直接上传到EFS文件系统
在本地或EC2实例挂载EFS,直接复制DAG到对应目录:
# 挂载EFS到本地目录 sudo mount -t nfs4 -o nfsvers=4.1,rsize=1048576,wsize=1048576,hard,timeo=600,retrans=2 <EFS挂载点>:/ /mnt/airflow-dags # 复制DAG文件到挂载目录 cp ./dag.py /mnt/airflow-dags/
方式3:Git同步DAG(生产环境推荐)
Airflow Helm Chart支持从Git仓库自动同步DAG,无需手动上传:
helm upgrade my-airflow apache-airflow/airflow \ --namespace airflow \ --set dags.gitSync.enabled=true \ --set dags.gitSync.repo=<你的Git仓库地址> \ --set dags.gitSync.branch=main \ --set dags.gitSync.subPath=dags \ --set dags.persistence.enabled=false # 使用Git同步时可关闭PVC挂载
内容的提问来源于stack exchange,提问作者Valle1208
相关产品推荐
相关产品推荐

