Airflow docker單機版配置、部署
背景說明
近期,我負責的公司項目增加了大量的定時任務,維護的難度大量的增加,產生了開發一個監控平臺的需求。鑑於公司的技術棧,最後選型了airflow作爲平臺框架。將搭建過程進行簡單的記錄,防止以後繼續踩坑。
部署前提條件
- 已安裝docker(版本不限)
- 數據庫postgresql(mysql、oracle也可以了,只要下載對應的驅動包)
airflow docker鏡像選型
鏡像的選擇可以通過docker search搜索選擇自己心儀的鏡像,但是看到除了apache-airflow官方鏡像其他的stars都太少了,但是拉了一下官方鏡像太大了,最後還是決定自己去github上翻一番,最後發現了一個很好的打包好的鏡像:
https://github.com/puckel/docker-airflow.
鏡像代碼拉取
使用 git clone 命令將代碼拉取到本地
git clone [email protected]:puckel/docker-airflow.git
鏡像編譯
剛開始,我自己編譯了遍看了一下,發現這個確實簡約,基於python:3.7-slim-buster原始鏡像進行改造的,鏡像進去後除了python、airflow、ls等命令其他的啥也沒安裝。所以需要我們自己先提前修改一下Dockerfile,重新打包一下鏡像.
- 增加常用工具curl、vim、openssh-server
- 設置sshd啓動,這個要在USER airflow命令之前,畢竟是用root用戶安裝的嘛
RUN /etc/init.d/ssh start
- 創建ssh私鑰和公鑰,這個就要在USER airflow命令之後了,因爲以後是用airflow用戶下運行嘛(其實這個功能不是必須的,因爲定時任務全都是在其他服務器,所以需要使用airflow的SSHoperator)
RUN ssh-keygen -t rsa -P '' -f ~/.ssh/id_rsa
- 因爲airflow是採用的pip安裝方式,所以我們要安裝必要的airflow包,刪掉暫時沒用的其他包,因爲如果都安裝的話就太大了。
&& pip install apache-airflow[crypto,postgres,ssh${AIRFLOW_DEPS:+,}${AIRFLOW_DEPS}]==${AIRFLOW_VERSION} \
- airflow還配置了script/entrypoint.sh腳本,用來安裝和配置額外的東西,可以看到裏面配置了requirements.txt,還有數據庫,所以也需要把裏面的數據庫設置註釋掉,要不然config/airflow.cfg數據庫配置不起效。
# Other executors than SequentialExecutor drive the need for an SQL database, here PostgreSQL is used
#if [ "$AIRFLOW__CORE__EXECUTOR" != "SequentialExecutor" ]; then
# # Check if the user has provided explicit Airflow configuration concerning the database
......
......
# wait_for_port "Postgres" "$POSTGRES_HOST" "$POSTGRES_PORT"
#fi
- 接下來開始編譯
docker build -t airflow -f Dockerfile .
配置airflow.cfg
- 配置executor 參數爲LocalExecutor
executor = LocalExecutor
- 配置時區爲上海
default_timezone = Asia/Shanghai
- 配置數據庫postgresql
sql_alchemy_conn = postgresql://xxx:xxx@xxx/pid
- 設置默認不加載airflow example
load_examples = False
- 修改DAG自動檢測時長爲10s,默認是0,畢竟太頻繁了壓力太大
min_file_process_interval = 10
- 修改scheduler工作線程
max_threads = 5
配置docker-compose-LocalExecutor.yml
不多說直接上代碼,覆蓋
version: '3.7'
services:
webserver:
image: airflow:latest
restart: always
environment:
- LOAD_EX=n
- EXECUTOR=Local
logging:
options:
max-size: 10m
max-file: "3"
volumes:
- ./dags:/usr/local/airflow/dags
- ./script/entrypoint.sh:/entrypoint.sh
- ./config/airflow.cfg:/usr/local/airflow/airflow.cfg
- ./logs:/usr/local/airflow/logs
# - ./plugins:/usr/local/airflow/plugins
ports:
- "8080:8080"
tty: true
scheduler:
image: airflow:latest
restart: always
depends_on:
- webserver
volumes:
- ./dags:/usr/local/airflow/dags
- ./script/entrypoint.sh:/entrypoint.sh
- ./config/airflow.cfg:/usr/local/airflow/airflow.cfg
- ./logs:/usr/local/airflow/logs
# - ./plugins:/usr/local/airflow/plugins
environment:
- LOAD_EX=n
- EXECUTOR=Local
tty: true
啓動鏡像
docker-compose -f docker-compose-LocalExecutor.yml up -d
查看鏡像運行情況
docker ps
一般等十幾秒左右airflow會運行起來,瀏覽器訪問http://localhost:8080即可
增加用戶管理模塊
如果有用戶管理模塊的需求,也可以有一個簡單的配置,很方便的擁有了這個模塊
- 在airflow.cfg中修改以下參數:
[webserver]
security = Flask AppBuilder
secure_mode = True
rbac=True
-
airflow.cfg刪除掉authenticate和auth_backend配置參數,原因是和上面的配置不共存
-
重新初始化數據庫,進入到webserver容器內,執行 airflow resetdb
airflow resetdb
- 在webserver容器內創建admin超級管理員用戶
airflow create_user --lastname user --firstname admin --username admin --email [email protected] --role Admin --password 123456
- 在瀏覽器中刷新一下系統,就會發現多了一個security用戶管理模塊,棒棒噠。
需要記錄的坑
- airflow是ubuntu鏡像,在運行中,會有日誌文件產生,就涉及到創建文件的權限問題,因爲宿主目錄和鏡像中的目錄存在映射,不知道爲啥,有在創建日誌文件的時候沒有權限,後來測試將宿主項目權限改成ubuntu就可以了,後期在看看爲啥吧:
chown -R ubuntu:ubuntu airflow
暫時先更新這些,其他的有時間會繼續補充。