Airflow on Kubernetes 用のマニフェストファイル公開しました

こんにちは、けんご(@N30nnnn)です。

はじめに

python3.7, 3.8~に対応した Airflow on Kubernetes 用のマニフェストファイルを公開しました。

kubectl apply -f で Airflow環境が立ち上がる仕様となっています。自前のライブラリ追加やビルド方法などはREADMEをご覧ください。

github.com

これは下記の素晴らしいリポジトリに修正を加えたものとなります。下記のリポジトリはpython3.5で動くものとなっており、そのままでは動作しないため修正を加えさせて頂きました。

github.com

ここでは解決した課題や残課題について残そうと思います。

課題

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するだけじゃだめなんだろうねぇ