使用Docker Swarm搭建Celery集群扩展Airflow的相关问题咨询
问题1解答
你的认知完全正确。Docker Swarm集群的工作节点不会自动同步主节点本地构建的镜像,所有节点必须能从可访问的镜像仓库拉取到相同的自定义Airflow镜像,使用AWS ECR是完全可行的方案,只需为3台EC2实例配置ECR镜像拉取权限即可。后续迭代镜像时只需重新推送到ECR,更新stack时所有节点会自动拉取对应版本的镜像。
问题2解答
- 环境变量部分:你在docker-compose中配置的
env_file会在执行docker stack deploy时被解析,变量会直接注入到所有服务的容器定义中,无论容器调度到哪个节点,环境变量都是完全一致的,这部分无需额外处理。 - 卷挂载部分:如果你当前使用的是本地路径挂载,工作节点上没有对应路径的文件,是无法正常读取的。如果挂载的是DAG、插件等需要所有Airflow组件共享的内容,需要替换为集群共享存储方案:比如将AWS EFS挂载到3台EC2的同一路径,再将该路径挂载到容器中;也可以直接使用支持跨节点的Docker volume驱动(如AWS EFS volume驱动),保证所有节点上的容器都能读取到一致的挂载内容。
- 依赖一致性:所有Airflow组件统一使用ECR上的同一份自定义镜像,配合统一的环境变量、共享存储挂载,即可保证除Redis外所有Airflow组件的依赖、配置完全一致。
问题3解答
Docker Swarm内置了集群DNS服务发现,你无需使用主节点IP访问Redis服务,直接将broker_url配置为redis://redis:6379/0即可,Swarm会自动将redis服务名解析到Redis实例的集群内网地址,工作节点上的Worker容器可直接通过该地址访问主节点上的Redis服务。
注意:建议移除Redis服务的
ports端口映射配置,Swarm内部网络默认可互通,将Redis端口映射到公网会带来额外安全风险。
docker-compose.yml优化建议
你需要对原配置做以下修改即可适配1主2节点的Swarm集群:
version: '3.8' x-airflow-celery: &airflow-celery # 替换为你推送到AWS ECR的镜像地址 image: <你的AWS账号ID>.dkr.ecr.<区域>.amazonaws.com/airflow-custom:2.1.3-v1 volumes: # 替换为共享存储(如EFS)挂载的路径,或跨节点volume - <共享存储路径>:/opt/airflow/dags env_file: - some_env_file services: webserver: <<: *airflow-celery command: airflow webserver restart: always ports: - 80:8080 healthcheck: test: [ "CMD-SHELL", "[ -f /opt/airflow/airflow-webserver.pid ]" ] interval: 10s timeout: 30s retries: 3 deploy: # 约束只部署在Swarm主节点 placement: constraints: - node.role == manager scheduler: <<: *airflow-celery command: airflow scheduler restart: always deploy: replicas: 2 placement: constraints: - node.role == manager redis: image: redis:6.0 command: redis-server --include /redis.conf healthcheck: test: [ "CMD", "redis-cli", "ping" ] interval: 30s timeout: 10s retries: 5 # 移除公网端口映射,仅保留集群内部访问 # ports: # - 6379:6379 environment: - REDIS_PORT=6379 deploy: placement: constraints: - node.role == manager worker: <<: *airflow-celery command: airflow celery worker deploy: replicas: 16 # 约束只部署在Swarm工作节点 placement: constraints: - node.role == worker flower: <<: *airflow-celery command: airflow celery flower ports: - 5555:5555 deploy: placement: constraints: - node.role == manager
内容的提问来源于stack exchange,提问作者GilT
相关产品推荐
相关产品推荐

