Airflow on Kubernetes 用のマニフェストファイル公開しました
こんにちは、けんご(@N30nnnn)です。
はじめに
python3.7, 3.8~に対応した Airflow on Kubernetes 用のマニフェストファイルを公開しました。
kubectl apply -f
で Airflow環境が立ち上がる仕様となっています。自前のライブラリ追加やビルド方法などはREADMEをご覧ください。
これは下記の素晴らしいリポジトリに修正を加えたものとなります。下記のリポジトリはpython3.5で動くものとなっており、そのままでは動作しないため修正を加えさせて頂きました。
ここでは解決した課題や残課題について残そうと思います。
課題
ImportError: pipのアップデートエラー
現在、 apt install python3-pip
経由でインストールした pip を pip install -U pip
などでアップデートすると、下記のようなエラーのため失敗します。
Traceback (most recent call last): File "/usr/local/bin/pip", line 7, in <module> from pip import main ImportError: No module named pip
これはドキュメントにもある通り、 get-pip.py
経由で pip を取得するべきです。
$ curl https://bootstrap.pypa.io/get-pip.py -o get-pip.py $ python get-pip.py $ pip install -U pip
ちなみに、上記元リポジトリのコンテナでは debian:stretch
と絞ってあるため、 curl を使うのに apt install certificates
が必要になります。
Syntax Error: marshmallow-sqlalchemyのpython3.5サポート終了
Airflow ではデータベースとのやり取りを SQLAlchemy を介して行います。
その中で使われているパッケージ marshmallow-sqlalchemy
がpython3.5のサポートを終了したことで、最新版をインストールするとSyntaxエラーで起動しません。
サポート終了のコミットが入ったバージョンが 0.17.3
のため、 python3.5で動かすためには echo "marshmallow-sqlalchemy==0.17.2" >> requirements/airflow.txt
で動くのですが、長い目でみて価値があるのはバージョンアップかなと思い、そちらに切り替えました。
pythonアップデート
元のDockerfileでベースイメージに使用されているのは debian:stretch
のため、ベースイメージを python:3.7-slim-stretch
に差し替えることでバージョンアップされ、かつイメージサイズの縮小されました。軽量イメージに自前でpythonをインストールする覚悟でいたのに、 slim
すごい。
ちなみに python:3.8-slim
にすることで python3.8での動作も確認できたため、バージョンアップが楽ちんになりました。これぞ Docker の夢。
残課題
- Scheduler Podの
CrashLoopBackoff
- 実行履歴の永続化
SchedulerPodの CrashLoopBackoff
現状では airflow scheduler
の立ち上げに -n 5
を渡していることで、5つのタスクを処理するとschedulerがexitします。それによってkubernetesは元のPodを落としてschedulerを再起動します。
-n -1
として schedulerを立てっぱなしにしない理由は、schedulerを強制再起動させてDAGの更新を取得しにいくかららしいのですが、 この様にして再起動させるとステータスが CrashLoopBackoff
として落ち、また RESTARTS
がひたすら情報していくので健康状態が最悪です。ここは改善したい。
CronJobで解決できるのではという提案もあるが、果たして。。。 webserver, schedulerともどもsyncするだけじゃだめなんだろうねぇ