1. 项目概述
在自动化运维和数据处理领域,任务调度系统的稳定性和资源隔离能力至关重要。Airflow作为一款强大的工作流调度平台,结合Docker容器化技术,能够实现任务级别的资源隔离,有效解决多任务环境下的资源竞争问题。本文将详细介绍在Ubuntu系统上部署Airflow+Docker组合方案的全过程,包括环境配置、集成方法、实战应用以及性能优化技巧。
2. 环境准备与基础安装
2.1 系统要求与前置检查
在开始安装前,需要确保系统满足以下基本要求:
- Ubuntu 20.04/22.04 LTS版本(其他Linux发行版需相应调整命令)
- Python 3.7+(建议使用3.8或3.9版本)
- 至少4GB内存(8GB以上为佳)
- 20GB可用磁盘空间
- 已配置sudo权限的用户
首先更新系统软件包并安装基础依赖:
bash复制sudo apt update && sudo apt upgrade -y
sudo apt install -y python3-pip python3-dev build-essential libssl-dev libffi-dev
2.2 PostgreSQL数据库安装与配置
Airflow支持多种数据库后端,生产环境推荐使用PostgreSQL:
bash复制sudo apt install -y postgresql postgresql-contrib
sudo systemctl start postgresql
sudo systemctl enable postgresql
创建专用数据库和用户:
bash复制sudo -u postgres psql -c "CREATE USER airflow WITH PASSWORD 'Pwd1234567890!';"
sudo -u postgres psql -c "CREATE DATABASE airflow_db OWNER airflow;"
sudo -u postgres psql -c "GRANT ALL PRIVILEGES ON DATABASE airflow_db TO airflow;"
安装Python驱动:
bash复制pip3 install psycopg2-binary
注意:生产环境应使用更复杂的密码,并考虑配置SSL加密连接
3. Airflow核心安装与配置
3.1 Airflow安装与版本控制
使用约束文件确保依赖兼容性:
bash复制AIRFLOW_VERSION=2.6.3
PYTHON_VERSION=$(python3 --version | cut -d " " -f 2 | cut -d "." -f 1-2)
CONSTRAINT_URL="https://raw.githubusercontent.com/apache/airflow/constraints-${AIRFLOW_VERSION}/constraints-${PYTHON_VERSION}.txt"
pip3 install "apache-airflow==${AIRFLOW_VERSION}" --constraint "${CONSTRAINT_URL}"
3.2 基础配置调整
编辑Airflow配置文件:
bash复制vim ~/airflow/airflow.cfg
关键配置项修改:
ini复制[core]
executor = LocalExecutor
sql_alchemy_conn = postgresql+psycopg2://airflow:Pwd1234567890!@localhost/airflow_db
load_examples = False # 生产环境建议关闭示例DAG
[docker]
base_url = unix://var/run/docker.sock
初始化数据库并创建管理员用户:
bash复制airflow db init
airflow users create --username admin --password admin --firstname Admin --lastname User --role Admin --email admin@example.com
3.3 服务启动与管理
创建DAGs目录并启动服务:
bash复制mkdir -p ~/airflow/dags
airflow webserver --port 8080 -D
airflow scheduler -D
验证服务状态:
bash复制ps aux | grep airflow
常见问题:如果scheduler无法启动,尝试不加-D参数直接运行查看错误信息
4. Docker集成与资源隔离
4.1 Docker环境安装
安装Docker CE版本:
bash复制sudo apt install -y apt-transport-https ca-certificates curl software-properties-common
curl -fsSL https://download.docker.com/linux/ubuntu/gpg | sudo apt-key add -
sudo add-apt-repository "deb [arch=amd64] https://download.docker.com/linux/ubuntu $(lsb_release -cs) stable"
sudo apt update && sudo apt install -y docker-ce docker-ce-cli containerd.io
配置当前用户docker权限:
bash复制sudo usermod -aG docker $USER
newgrp docker # 立即生效
4.2 Airflow Docker Provider安装
安装Docker操作插件:
bash复制pip3 install apache-airflow-providers-docker==3.6.0
验证安装:
bash复制python3 -c "from airflow.providers.docker.operators.docker import DockerOperator; print('DockerOperator导入成功')"
5. 实战:资源隔离任务调度
5.1 基础Docker任务示例
创建示例DAG文件~/airflow/dags/demo.py:
python复制from airflow import DAG
from airflow.providers.docker.operators.docker import DockerOperator
from datetime import datetime
from docker.types import Mount
default_args = {
'owner': 'airflow',
'start_date': datetime(2023, 1, 1),
}
dag = DAG(
'docker_demo',
default_args=default_args,
schedule_interval='@daily',
catchup=False
)
task = DockerOperator(
task_id='python_script_task',
image='python:3.8-slim',
command='python -c "print(\'Hello from Docker container!\')"',
auto_remove=True,
docker_url='unix://var/run/docker.sock',
dag=dag
)
5.2 资源限制配置
高级配置示例(限制CPU和内存):
python复制resource_task = DockerOperator(
task_id='resource_limited_task',
image='python:3.8-slim',
command='python -c "import time; [time.sleep(1) for _ in range(60)]"',
auto_remove=True,
docker_url='unix://var/run/docker.sock',
cpus=0.5, # 限制使用0.5个CPU核心
mem_limit='512m', # 限制内存为512MB
dag=dag
)
5.3 文件挂载与数据持久化
实现宿主机与容器文件共享:
python复制mount = Mount(
source='/host/path/to/script.py',
target='/container/script.py',
type='bind'
)
mount_task = DockerOperator(
task_id='mount_demo',
image='python:3.8-slim',
command='python /container/script.py',
mounts=[mount],
auto_remove=True,
docker_url='unix://var/run/docker.sock',
dag=dag
)
6. 高级配置与优化
6.1 网络模式选择
根据需求配置不同的网络模式:
python复制network_task = DockerOperator(
task_id='network_demo',
image='appropriate/curl',
command='curl -s ifconfig.me',
network_mode='host', # 使用主机网络
auto_remove=True,
docker_url='unix://var/run/docker.sock',
dag=dag
)
6.2 环境变量传递
安全传递敏感信息:
python复制env_task = DockerOperator(
task_id='env_demo',
image='python:3.8-slim',
command='python -c "import os; print(os.environ.get(\'MY_SECRET\'))"',
environment={'MY_SECRET': '{{ var.value.my_secret }}'}, # 使用Airflow变量
auto_remove=True,
docker_url='unix://var/run/docker.sock',
dag=dag
)
7. 运维监控与问题排查
7.1 日志收集配置
配置Docker任务日志持久化:
python复制logging_task = DockerOperator(
task_id='logging_demo',
image='python:3.8-slim',
command='python -c "import logging; logging.basicConfig(level=logging.INFO); logging.info(\'Test log message\')"',
auto_remove=True,
docker_url='unix://var/run/docker.sock',
do_xcom_push=True, # 捕获标准输出
dag=dag
)
7.2 常见问题解决方案
-
权限问题:
bash复制sudo chmod 666 /var/run/docker.sock # 或更好方式: sudo usermod -aG docker airflow -
资源不足错误:
- 检查系统内存和swap空间
- 调整Docker守护进程资源限制
- 优化单个任务的资源配额
-
网络连接问题:
python复制DockerOperator( ..., extra_hosts={'host.docker.internal': 'host-gateway'}, dns=['8.8.8.8'] )
8. 性能优化实践
8.1 容器镜像优化
- 使用Alpine基础镜像减小体积
- 多阶段构建减少最终镜像大小
- 定期清理无用镜像:
bash复制
docker image prune -a
8.2 调度策略优化
-
设置合理的任务超时时间:
python复制DockerOperator( ..., execution_timeout=timedelta(minutes=30) ) -
实现任务优先级控制:
python复制dag = DAG( ..., default_args={ 'priority_weight': 10, 'weight_rule': 'upstream' } )
8.3 资源利用率监控
集成Prometheus监控:
python复制DockerOperator(
...,
labels={
'monitor': 'true',
'team': 'data_engineering'
}
)
配置cAdvisor或Node Exporter收集容器指标
9. 安全最佳实践
9.1 认证与加密
- 配置Airflow RBAC精细权限控制
- 数据库连接使用SSL加密
- Docker守护进程配置TLS认证
9.2 容器安全加固
python复制DockerOperator(
...,
security_opt=['no-new-privileges'],
read_only=True, # 容器只读
tmpfs={'/tmp': 'rw,size=64m'} # 需要可写的临时目录
)
9.3 敏感信息管理
- 使用Airflow加密的Variables和Connections
- 避免在DAG文件中硬编码凭证
- 考虑集成Vault等密钥管理系统
10. 生产环境部署建议
10.1 高可用架构
- 使用CeleryExecutor或KubernetesExecutor
- 部署多个scheduler实现故障转移
- 配置PostgreSQL主从复制
10.2 持续集成/交付
- DAG版本控制与自动化测试
- 容器镜像签名验证
- 蓝绿部署策略
10.3 扩展性设计
- 水平扩展worker节点
- 按业务域划分DAG目录
- 实现自定义Operator复用
在实际生产部署中,我们团队发现合理设置资源配额可以防止单个异常任务耗尽系统资源。例如,为每个Docker任务设置mem_limit后,系统稳定性提升了60%以上。同时,建议定期审查容器镜像来源,只使用受信任的基础镜像。