kube-airflow 完全指南:在 Kubernetes 上运行 Apache Airflow 的终极方案
【免费下载链接】kube-airflowA docker image and kubernetes config files to run Airflow on Kubernetes项目地址: https://gitcode.com/gh_mirrors/ku/kube-airflow
你是否正在寻找一套在 Kubernetes 上运行 Apache Airflow 的终极方案?kube-airflow 正是为此而生的开源项目,它提供了一整套 Docker 镜像与 Kubernetes 配置文件,让你无需维护复杂的 Celery 集群,就能轻松获得高可用的 Airflow 调度器与并行任务执行能力。本文将从零开始,带你快速掌握 kube-airflow 的部署方法、核心组件与最佳实践,让新手也能在十几分钟内搭建出属于自己的 Airflow 调度平台。
为什么选择 kube-airflow:在 Kubernetes 上运行 Airflow 的核心优势
传统方式运行 Airflow 常常面临两个痛点:调度器高可用难以实现、任务并行扩展成本高昂。kube-airflow 巧妙地把这两个问题都交给了 Kubernetes 解决:
- 调度器高可用:Airflow 官方不建议同时运行多个调度器,而 kube-airflow 利用 Kubernetes 的容器编排能力,让调度器以"崩溃即重启"的方式稳定运行,省去了复杂的 Leader Election 包装。
- 任务并行扩展:无需为 Celery 维护高可用的后端数据库与 Worker 集群,K8s 本身就是最好的任务管理器,一条命令即可完成 Worker 扩容。
- 开箱即用:项目内置了 Webserver、Scheduler、Worker、Flower 等全套组件的部署清单,配合 Helm Chart 一键安装。
kube-airflow 架构:一次看懂全部组件
整个系统由以下核心组件组成,各司其职:
| 组件 | 作用 | 类型 |
|---|---|---|
| airflow-webserver | 提供 Web 管理界面(8080 端口) | Deployment |
| airflow-scheduler | 负责 DAG 调度与任务下发 | Deployment |
| airflow-worker | 执行具体任务(8793 端口) | StatefulSet |
| airflow-flower | Celery 任务监控面板(5555 端口) | Deployment |
| postgres | 存储元数据与执行记录 | 依赖 Chart |
| rabbitmq / redis | 消息队列,负责任务分发 | 依赖 Chart |
Worker 为什么使用 StatefulSet 而非 Deployment?这是 kube-airflow 的一个巧妙设计:StatefulSet 配合 Headless Service 可以冻结每个 Worker 的 DNS 名称,让 Webserver 能够按 Pod 独立拉取日志,这对分布式任务排错至关重要。具体配置见 statefulsets-workers.yaml。
最快部署方法:两种方式任你选择
方式一:一条命令快速创建(适合尝鲜)
克隆仓库后,直接使用项目提供的聚合清单文件airflow.all.yaml:
kubectl create -f airflow.all.yaml这一条命令会一次性创建 postgres、rabbitmq、airflow-webserver、airflow-scheduler、airflow-flower、airflow-worker 六个 Deployment 以及对应的 Service。如果你使用的是 minikube,还可以通过make browse-web直接打开 Web 界面。
方式二:Helm 部署(生产环境推荐)
Helm Chart 位于airflow/目录,它支持更灵活的定制能力,官方推荐使用:
make helm-install NAMESPACE=yournamespace HELM_VALUES=/path/to/you/values.yaml所有可定制参数都集中在 values.yaml 中,包括镜像版本、Worker 数量、Ingress 配置、持久化存储等,覆盖了日常运维的绝大多数需求。
快速配置技巧:三个必须掌握的定制项
1. 生成 Fernet Key(必做)
Airflow 使用 Fernet Key 加密连接信息,values.yaml中默认留空。启动前请先执行以下命令生成,并填入配置:
python -c "from cryptography.fernet import Fernet; FERNET_KEY = Fernet.generate_key().decode(); print(FERNET_KEY)"2. 自定义 airflow.cfg(无需重新构建镜像)
默认情况下,config/airflow.cfg被打包在 Docker 镜像中,通过模板变量注入环境信息。如果你只想测试新配置而不想重建镜像,可以使用 ConfigMap 方式:
- 在
values.yaml中开启airflow.airflow_cfg.enable: true - 将你的
airflow.cfg内容填入airflow.airflow_cfg.data - 参考示例文件 myvalue-with-airflowcfg-configmap.yaml
注意保留配置中的模板变量(如{{ POSTGRES_CREDS }}),否则容器将无法正确连接后端。
3. 指定 URL 前缀与 Ingress
通过values.yaml中的url_prefix与ingress配置,可以让 Web 界面以http://mycompany.com/airflow的形式对外提供服务,同时支持为 Flower 单独设置路径前缀,方便接入已有网关体系。
DAG 部署实战:两种主流方式对比
DAG(有向无环图)是 Airflow 的核心,kube-airflow 提供了两种部署方式:
| 方式 | 优点 | 适用场景 |
|---|---|---|
| 嵌入式 DAG | 版本可控、依赖完整打包 | 生产环境、CI/CD 流程成熟 |
| git-sync | DAG 更新即时生效(默认每 60 秒同步) | 快速迭代、开发测试 |
嵌入式 DAG:构建专属镜像
将 DAG 放入项目dags/目录,把依赖写入requirements/dags.txt,然后构建镜像:
make ENBEDDED_DAGS_LOCATION=$DAG_PATH之后将新镜像部署到集群即可。这是官方最推荐的生产方案,因为它能保证 DAG 及其依赖的完整性。
git-sync:让 DAG 自动更新
在values.yaml中开启dags.git_sync_enabled: true并指定git_repo地址,Scheduler 和 Worker 就会自动拉取最新代码。但请注意:如果 Scheduler 在 DAG 执行中途重载了新版 DAG,可能导致执行逻辑不一致。建议遵循两个原则——执行期间加锁不拉新,或让 DAG 保持不可变、只新增不修改。
Worker 扩容与运维实战
一键扩容 Worker
修改values.yaml中的celery.num_workers数值,重新应用即可完成扩容:
make apply由于 Worker 使用 StatefulSet,扩容后的新 Worker 会自动获得稳定 DNS,Webserver 也能正确抓取其任务日志。
使用 Flower 监控任务
Flower 面板(5555 端口)实时展示 Celery 任务队列、Worker 状态与执行统计。通过make browse-flower或配置好的 Ingress 即可访问,是排查任务积压问题的利器。
常见问题速查
Q:Scheduler 为什么不更新 DAG?检查scheduler_num_runs配置,设为-1表示无限循环但不会刷新 DAG;设为1则每次刷新后退出、由 Kubernetes 自动拉起,可根据需求选择。
Q:如何增加自定义 Python 依赖?将依赖写入requirements/dags.txt,构建镜像时会被自动安装,也可通过make REQUIREMENTS_TXT_LOCATION=/path/to/requirements.txt指定其他文件。
Q:同一命名空间想跑多个独立集群?利用 Chart 提供的 prefix 机制,为每个集群添加前缀即可,注意前缀不要包含引号、斜杠等特殊字符。
总结
kube-airflow 用最简洁的方式解决了在 Kubernetes 上运行 Apache Airflow 的核心难题:无需维护复杂的 Celery 基础设施,K8s 原生能力即是最佳的任务编排者。无论是新手快速搭建,还是生产环境的高可用部署,这份方案都能让你事半功倍。现在就 clone 项目,开启你的 Airflow + Kubernetes 之旅吧!
【免费下载链接】kube-airflowA docker image and kubernetes config files to run Airflow on Kubernetes项目地址: https://gitcode.com/gh_mirrors/ku/kube-airflow
创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考