Airflow中Worker与Scheduler共享存储及多Git仓库同步DAG问题
如何在Airflow(Helm部署)中实现多Git仓库DAG同步并解决共享PVC权限问题
一、多仓库DAG同步的正确实现方式
不建议通过自定义DAG拉取仓库再共享,Airflow官方提供了更可靠的方案:
1. 使用Git Sync Sidecar(推荐)
官方Helm Chart原生支持为多个Git仓库配置Git Sync容器,自动将DAG同步到Scheduler和Worker的DAG目录,确保两边实时同步。配置示例:
dags: gitSync: enabled: true repos: - name: repo-1 repo: "https://github.com/your-org/repo1.git" branch: main dest: repo1 syncSubPath: dags - name: repo-2 repo: "https://github.com/your-org/repo2.git" branch: dev dest: repo2 syncSubPath: airflow/dags syncInterval: 60
每个仓库的DAG会被同步到${AIRFLOW__CORE__DAGS_FOLDER}/repo1和${AIRFLOW__CORE__DAGS_FOLDER}/repo2,Scheduler和Worker都会自动识别这些DAG。
2. 自定义拉取DAG的适配方案
如果坚持用自定义DAG拉取,需要:
- 确保拉取的目标目录是Scheduler和Worker共享的存储路径
- 修改Airflow配置,将
dags_folder设置为该共享目录,在Helm中配置:
airflow: config: core: dags_folder: /opt/workers-shared-volume/dags
- 自定义DAG拉取仓库时,直接将代码克隆到
/opt/workers-shared-volume/dags下的子目录
二、共享PVC的Permission Denied问题解决
你的配置存在两个关键问题,导致权限错误:
1. 修正PV配置冲突
你同时使用了hostPath和storageClassName: efs,这是矛盾的:
- EFS是分布式文件系统,不需要手动创建PV,直接创建PVC即可由EFS provisioner自动绑定PV
- 移除手动创建的PV,保留PVC配置即可:
apiVersion: v1 kind: PersistentVolumeClaim metadata: name: workers-shared-volume-claim namespace: airflow spec: accessModes: - ReadWriteMany storageClassName: efs resources: requests: storage: 10Gi
2. 配置目录权限适配Airflow用户
Airflow的Pod默认以UID为50000的airflow用户运行,共享存储的挂载目录需要赋予该用户读写权限。可以通过以下两种方式解决:
方式一:使用InitContainer初始化权限
在Helm Chart中为Worker和Scheduler添加InitContainer,修改挂载目录的属主:
workers: extraVolumes: - name: workers-shared-volume-claim persistentVolumeClaim: readOnly: false claimName: workers-shared-volume-claim extraVolumeMounts: - name: workers-shared-volume-claim mountPath: /opt/workers-shared-volume initContainers: - name: fix-permissions image: busybox:latest command: ["sh", "-c", "chown -R 50000:50000 /opt/workers-shared-volume"] securityContext: runAsUser: 0 volumeMounts: - name: workers-shared-volume-claim mountPath: /opt/workers-shared-volume scheduler: extraVolumes: - name: workers-shared-volume-claim persistentVolumeClaim: readOnly: true claimName: workers-shared-volume-claim extraVolumeMounts: - name: workers-shared-volume-claim mountPath: /opt/workers-shared-volume
方式二:配置Pod的SecurityContext
如果你的存储支持设置fsGroup,可以在Helm中配置Pod的SecurityContext,让挂载目录自动继承正确的权限:
workers: securityContext: runAsUser: 50000 runAsGroup: 50000 fsGroup: 50000 # 其余挂载配置不变 scheduler: securityContext: runAsUser: 50000 runAsGroup: 50000 fsGroup: 50000 # 其余挂载配置不变
内容的提问来源于stack exchange,提问作者Stichiboi
相关产品推荐
相关产品推荐

