前言:
如果要用k8的方式部署airflow,采用helm安装是比较方便的,但是并不是按照官网给的命令,就可以简单顺利的安装成功的。需要很多前置工作,以及参数调试
作者经过近两周的摸索,形成了比较完整的的airflow on k8s 的部署流程。
集群整体情况介绍:
k8s 版本: 1.26.8
airflow 版本:2.6.2
集群运行方式: k8s + KubernetesExecutor + KubernetesPodOperator
优点:如此部署可以充分利用k8s的资源调度分配能力,已经自动扩展能力
可以使用pod_template_file,与argoworflows的使用方式接近
airflow简介:
简介:
Airflow是一个开源的任务调度和工作流编排平台,由Airbnb开发并于2016年贡献给Apache软件基金会。它的主要目标是帮助用户以编程方式创建、调度和监控复杂的工作流任务。
Airflow包括如下组件
-
a scheduler:用于触发预定的workflow,提交任务以执行等
-
an executor:用于执行任务。默认安装中,executor运行scheduler中的每个任务,而开发环境(production-suitable executors)多数executor将任务执行推送给workers执行
-
a webserver:提供UI用于监视(inspect)、触发和对DAGs与任务的debug,Flask
-
DAG文件夹:由scheduler、executor和workers读取
-
metadata数据库:scheduler、executor和webserver存储数据用
部署实施:
0,helm的安装与airflow源准备
a. helm安装
snap install helm --classic
b.创建kubernetes airflow 命名空间 kubectl create namespace airflow c.添加 airflow charts 仓库源 helm repo add apache-airflow https://airflow.apache.org d.更新 aiarflow 源 helm repo update e. 查看 airflow charts 所有版本 helm search repo apache-airflow/airflow -l
1, 创建airflow部署过程中用到的pv
因为airflow 的一些pod需要pv存储,不创建的话,pod会一直pending
a.创建目录
/mnt/airflow/pv1 等目录需要手动在服务器创建
b. 创建pv
kubectl apply -f xxx.yaml
yaml文件内容如下:
apiVersion: v1
kind: PersistentVolume
metadata:
name: airflow-pv1
spec:
capacity:
storage: 150Gi
accessModes:
- ReadWriteOnce
persistentVolumeReclaimPolicy: Retain
hostPath:
path: /mnt/airflow/pv1
---
apiVersion: v1
kind: PersistentVolume
metadata:
name: airflow-pv2
spec:
capacity:
storage: 150Gi
accessModes:
- ReadWriteOnce
persistentVolumeReclaimPolicy: Retain
hostPath:
path: /mnt/airflow/pv2
---
apiVersion: v1
kind: PersistentVolume
metadata:
name: airflow-pv3
spec:
capacity:
storage: 150Gi
accessModes:
- ReadWriteOnce
persistentVolumeReclaimPolicy: Retain
hostPath:
path: /mnt/airflow/pv3
---
apiVersion: v1
kind: PersistentVolume
metadata:
name: airflow-pv4
spec:
#storageClassName: airflowdev-storage
capacity:
storage: 150Gi
accessModes:
- ReadWriteOnce
persistentVolumeReclaimPolicy: Retain
hostPath:
path: /mnt/airflow/pv4
日志持久化pv/pvc
---
kind: PersistentVolume
apiVersion: v1
metadata:
name: testlog-volume
spec:
accessModes:
- ReadWriteMany
capacity:
storage: 20Gi
hostPath:
path: /mnt/airflow/logs
#storageClassName: standard
---
kind: PersistentVolumeClaim
apiVersion: v1
metadata:
name: testlog-volume
namespace: airflow
spec:
accessModes:
- ReadWriteMany
resources:
requests:
storage: 20Gi
2. Git相关的配置
配置git是为了方便管理和获取dags代码,避免很多dags文件找不到或没权限读取的问题
a.创建git的Secret
需要用到你git仓库账号和密码的base64
kubectl apply -f git-credentials.yaml
# git-credentials.yaml
apiVersion: v1
kind: Secret
metadata:
name: git-credentials
type: Opaque
data:
GIT_SYNC_USERNAME: xxxxxx(git用户名的base64)
GIT_SYNC_PASSWORD: xxxxxx (git密码的base64)
3. 最终的helm命令安装
参数较多,为了解决各种权限,日志持久化的问题
***使用时需要将 dags.gitSync.repo 替换成你自己的
helm install airflow apache-airflow/airflow -n airflow \
--set postgresql.volumePermissions.enabled=true \
--set worker.volumePermissions.enabled=true \
--set workers.persistence.enabled=false \
--set executor=KubernetesExecutor \
--set airflowVersion=2.7.0 \
--set triggerer.securityContext.runAsUser=0 \
--set triggerer.securityContext.fsGroup=0 \
--set images.gitSync.repository=registry.cn-hangzhou.aliyuncs.com/goojia/k8s\
--set images.gitSync.tag=git-sync-v3.3.0 \
--set dags.gitSync.enabled=true\
--set dags.gitSync.branch=master \
--set dags.gitSync.credentialsSecret=git-credentials\
--set dags.gitSync.repo=http://xxxxx:80/xxxxx/airflow-dags.git\
--set dag_folder=/opt/airflow/dags/repo \
--set logs.persistence.enabled=true\
--set logs.persistence.existingClaim=testlog-volume\
--set dagProcessor.securityContext.runAsUser=0 \
--set dagProcessor.securityContext.fsGroup=0 \
--set scheduler.securityContext.runAsUser=0 \
--set scheduler.securityContext.fsGroup=0 \
--set workers.securityContext.runAsUser=0 \
--set workers.securityContext.fsGroup=0 \
--set webserver.securityContext.runAsUser=0 --set webserver.securityContext.fsGroup=0 -f value.yaml
value.yaml的内容如下
config:
core:
# git上dags所在的目录,配置对即可在webserver中看到dags
dags_folder: /opt/airflow/dags/repo
hostname_callable: airflow.utils.net.get_host_ip_address
default_timezone: Asia/Shanghai
kubernetes:
multi_namespace_mode: True
kubernetes_executor:
multi_namespace_mode: True
multiNamespaceMode: True
webserverSecretKeySecretName: my-webserver-secret