Airflow docker版配置、部署

背景說明

近期,我負責的公司項目增加了大量的定時任務,維護的難度大量的增加,產生了開發一個監控平臺的需求。鑑於公司的技術棧,最後選型了airflow作爲平臺框架。將搭建過程進行簡單的記錄,防止以後繼續踩坑。

部署前提條件

  1. 已安裝docker(版本不限)
  2. 數據庫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,重新打包一下鏡像.

  1. 增加常用工具curl、vim、openssh-server
    在這裏插入圖片描述
  2. 設置sshd啓動,這個要在USER airflow命令之前,畢竟是用root用戶安裝的嘛
RUN /etc/init.d/ssh start
  1. 創建ssh私鑰和公鑰,這個就要在USER airflow命令之後了,因爲以後是用airflow用戶下運行嘛(其實這個功能不是必須的,因爲定時任務全都是在其他服務器,所以需要使用airflow的SSHoperator)
RUN ssh-keygen -t rsa -P '' -f ~/.ssh/id_rsa
  1. 因爲airflow是採用的pip安裝方式,所以我們要安裝必要的airflow包,刪掉暫時沒用的其他包,因爲如果都安裝的話就太大了。
&& pip install apache-airflow[crypto,postgres,ssh${AIRFLOW_DEPS:+,}${AIRFLOW_DEPS}]==${AIRFLOW_VERSION} \
  1. 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
  1. 接下來開始編譯
docker build -t airflow -f Dockerfile .

配置airflow.cfg

  1. 配置executor 參數爲LocalExecutor
executor = LocalExecutor
  1. 配置時區爲上海
default_timezone = Asia/Shanghai
  1. 配置數據庫postgresql
sql_alchemy_conn = postgresql://xxx:xxx@xxx/pid
  1. 設置默認不加載airflow example
load_examples = False
  1. 修改DAG自動檢測時長爲10s,默認是0,畢竟太頻繁了壓力太大
min_file_process_interval = 10
  1. 修改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即可

增加用戶管理模塊

如果有用戶管理模塊的需求,也可以有一個簡單的配置,很方便的擁有了這個模塊

  1. 在airflow.cfg中修改以下參數:
[webserver]
security = Flask AppBuilder
secure_mode = True
rbac=True
  1. airflow.cfg刪除掉authenticate和auth_backend配置參數,原因是和上面的配置不共存

  2. 重新初始化數據庫,進入到webserver容器內,執行 airflow resetdb

airflow resetdb
  1. 在webserver容器內創建admin超級管理員用戶
airflow create_user --lastname user --firstname admin --username admin --email [email protected] --role Admin --password 123456
  1. 在瀏覽器中刷新一下系統,就會發現多了一個security用戶管理模塊,棒棒噠。

需要記錄的坑

  1. airflow是ubuntu鏡像,在運行中,會有日誌文件產生,就涉及到創建文件的權限問題,因爲宿主目錄和鏡像中的目錄存在映射,不知道爲啥,有在創建日誌文件的時候沒有權限,後來測試將宿主項目權限改成ubuntu就可以了,後期在看看爲啥吧:
chown -R ubuntu:ubuntu airflow

暫時先更新這些,其他的有時間會繼續補充。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章