本文记录了笔者最近基于Helm在K8S上部署airflow2.5.1版本遇到的一系列问题及最终的一键部署脚本,欢迎关注算法小生免费阅读
由于之前在airflow的使用上是单worker节点,为了支持多worker节点以及简化部署流程,特此新增了airflow-plus[命名空间也为此,防止影响目前运行的任务,稳定后任务在切换]
笔者遇到了以下问题,将会为你一一解答
- airflow db init未执行报错问题
- redis连接问题
- 日志无法查看问题
- 多woker不启动问题
- helm upgrade问题
- 缓存问题
- 数据库不存在问题
- 动态安装依赖问题
其中有些问题,官网写的比较模糊,还是直接根据问题查看源码找到对应配置会快些
1. 新建secret.yaml文件
该文件主要存放git与repo访问秘钥
apiVersion: v1
kind: Secret
metadata:name: git-credentials
type: Opaque
data:GIT_SYNC_USERNAME: XXXXXXXGIT_SYNC_PASSWORD: XXXXXXX
---
apiVersion: v1
kind: Secret
type: kubernetes.io/dockerconfigjson
metadata:name: nexus-registry-secretnamespace: airflow-plus
data:".dockerconfigjson": "XXXXXXX"
部署该文件到命名空间airflow-plus
kubectl apply -f secret.yaml --namespace airflow-plus
2. 新建values.yaml文件
该文件主要进行一些重写工作,可参照源码values.yaml
config:core:# git上dags所在的目录,配置对即可在webserver中看到dagsdags_folder: /opt/airflow/dags/repo/dags # 根据ip方式通信,默认hostname域名方式,解决访问worker节点日志无法查看问题hostname_callable: airflow.utils.net.get_host_ip_addressdefault_timezone: Asia/Shanghai
webserver:# 重写args方法,执行airflow webserver前执行airflow db init解决初始化报错问题args:- "bash"- "-c"- |-exec \airflow db init \|-exec \airflow webserverservice:type: NodePortports:- name: airflow-uiport: 8080targetPort: 8080# 浏览器访问端口映射nodePort: 30120
3. 新建uninstall.sh
主要对airflow进行一键卸载
helm delete airflow --namespace airflow-plus
4. 新建install.sh
一键安装airflow,重点来了
helm repo add apache-airflow https://airflow.apache.org
export RELEASE_NAME=airflow
# upgrade若报错helm list --namespace airflow-plus查看对应release是否存在,不存在则install,并且指定刚才的values.yaml文件
helm upgrade --install $RELEASE_NAME apache-airflow/airflow --namespace airflow-plus -f values.yaml \# K8S部署选用该Executor--set executor=CeleryKubernetesExecutor \--set defaultAirflowRepository=apache/airflow \--set airflowVersion=2.5.1 \--set data.metadataConnection.user=airflow \# pgsql密码--set postgresql.auth.postgresPassword=XXXXX \# pgsql连接IP--set data.metadataConnection.host=192.168.0.XXX \# pgsql元数据访问密码,一般与密码一致--set data.metadataConnection.pass=XXXXX \# pgsql连接端口,根据实际进行修改--set data.metadataConnection.port=35432 \# pgsql授权用户名--set postgresql.auth.username=airflow \# pgsql授权密码,一般与密码一致--set postgresql.auth.password=XXXXX \# 外部redis连接地址,注意格式,否则连接会报错--set data.brokerUrl=redis://redis-pod.middleware:6379/0 \# 元数据连接数据库名,不存在则到pgsql中新建,否则报错--set data.metadataConnection.db=airflow_plus \# false表示使用外部pgsql--set postgresql.enabled=false \# false表示使用外部redis--set redis.enabled=false \# 由于直接在新的命名空间与新库部署,所以不需要迁移,设置为false--set triggerer.waitForMigrations.enabled=false \--set webserver.waitForMigrations.enabled=false \--set scheduler.waitForMigrations.enabled=false \# git工具仓库地址--set images.gitSync.repository=registry.cn-hangzhou.aliyuncs.com/goojia/k8s \# git版本--set images.gitSync.tag=git-sync-v3.3.0 \# 公司gitlab airflow项目地址--set dags.gitSync.repo=http://gitlab.XXXX.com/dev0/airflow.git \# 允许git同步--set dags.gitSync.enabled=true \# git同步分支--set dags.gitSync.branch=master \# git同步授权秘钥,就是secret.yaml中配置的--set dags.gitSync.credentialsSecret=git-credentials \# 其他的一些暂时用不到的先为false--set createUserJob.applyCustomEnv=false \--set createUserJob.serviceAccount.create=false \--set migrateDatabaseJob.applyCustomEnv=false \--set createUserJob.useHelmHooks=false \--set migrateDatabaseJob.enabled=false \--set migrateDatabaseJob.serviceAccount.create=false \--set migrateDatabaseJob.useHelmHooks=false \--set cleanup.serviceAccount.create=false \# workers默认为Stateful Sets,需要设置为false,才会为Deployment部署为Pod--set workers.persistence.enabled=false \# workers pod数--set workers.replicas=3 \# 开启创建默认用户job--set webserver.defaultUser.enabled=true \# 如果有对镜像改造的需求,这里授权访问公司repo#--set registry.secretName=nexus-registry-secret
至此一切OK了,./install.sh
一键部署吧
5.访问airflow
http://IP:30120/, 默认用户名admin 密码admin
主页面:
日志查看:
K8S妥妥的多worker节点:
6. 总结与其他
在实操的过程中,遇到问题询问ChatGPT会省不少时间,有些ChatGPT也解答不好的话,最好下载下来Helm Chart对应版本源码,及Airflow源码,也可能会很快搜到一些有效信息
其实在用的时候,公司有自己的工具类,目前的话手工到workers中去一个个安装,即使更新也是手工修改,也尝试了通过改写父类方法每次都提前安装的方式不过没成功,任务多起来每次都要安装还不如一个个worker去安装,反正目前worker数也不多,如果你有更好的方式欢迎与我沟通交流