Kubernetes(Helm)を使用してPrefect 2を構築してみた
はじめに
こんにちは、D2Cのデータサイエンティスト(MLエンジニア)をやっている須田です。
私が所属している部署では、MLが伴うワークフローの管理にAirflowを使用しています。
最近Airflowよりも使いやすい管理ツールがないか調査をしていたところ、Prefectを見つけました。
今回、Helmを使用してPrefectをKubernetes上で試してみましたので、その内容を記事にしたいと思います。
Prefectとは?
PrefectとはPythonで書かれたオープンソース(Apache License 2.0)のワークフロー管理システムです。開発に関わったのはAirflowのコントリビューターで、Prefectはネガティブデータエンジニアリングを元に設計されています。詳しい設計やPrefectが誕生した経緯についてはまた別途記事を書きたいと思います。
Helmで構築してみた
以下GithubにあるHelmのチャートを使用します。
Prefectのチャートリポジトリをローカルに追加し、更新する
helm repo add prefect https://prefecthq.github.io/prefect-helm
helm repo update
結果
"prefect" has been added to your repositories
追加したPrefectのチャートリポジトリの確認
helm search repo prefect
結果
NAME CHART VERSION APP VERSION DESCRIPTION
prefect/prefect-agent 2023.10.12 2.13.6 Prefect Agent application bundle
prefect/prefect-server 2023.10.12 2.13.6 Prefect server application bundle
prefect/prefect-worker 2023.10.12 2.13.6 Prefect Worker application bundle
3つの種類のチャートが追加されていますね。
Kubernetes上でPrefectを動かすために必要なリソースは3つ
それぞれの役割と構築方法を紹介します。
1. サーバー(server)を作成
Prefectのサーバーはフローの状況に関する情報を保持し、それらを表示するためのUIを提供してくれます。
加えて、ワークフロー管理、スケジューリング、監視、イベント通知を行う機能を持ちます。
helm install prefect-server ./prefect-server --values values.yaml
上記だけで簡単にサーバーは立ち上げられます。この時、フローの状況を保管するためのPostgreSQLも立ち上がるのですが、既存のものを使用したい場合はvalues.yamlで設定が必要になりますのでREADMEを確認してください。
今回はvalues.yamlの値を上書きしたかったため、--values values.yamlをつけています。
2. エージェント(agent)を作成
Prefectののエージェントはワークプール(work pool)から定期的にポーリングを行い、キューイングされたフローの情報を取得&そのフローを実行するためにWorkerを起動する役割をします。
ちなみにワークプールとはキューの一種で、フローを一時的に保持・実行の制御をする役割をしています。
(詳細:https://docs.prefect.io/latest/concepts/work-pools/)
agent:
serverApiConfig:
# prefect-serverはKubernetesのサービス名
apiUrl: http://prefect-server:4200/api
上記、values.yamlのserverApiConfigに従うと、同じクラスター内でapiとエージェントを立てる場合には、そのクラスター内で使用されているapiのurlを設定する必要があるそうです。
今回はPod間での名前解決のため、サーバーで作成されたサービス名を使いapiUrlを指定します。
あとはhelm installでエージェントのリソースを作成します。
prefect-server同様、values.yamlの値を上書きしたかったため、--values values.yamlをつけています。
helm install prefect-agent ./prefect-agent --values values.yaml
3. ワーカー(worker)を作成
Prefectのワーカーはエージェントの記述通り、フローの実行を行います。
タスクの依存管理やログ・メトリクスの収集を行いサーバーに送信する役割も担っています。
worker:
serverApiConfig:
# prefect-serverはKubernetesのサービス名
apiUrl: http://prefect-server:4200/api
workerのvalues.yamlのapiUrlも修正が必要です。agentの場合と同様に定義します。
あとはhelm installでリソースを作成。
prefect-server同様、values.yamlの値を上書きしたかったため、--values values.yamlをつけています。
helm install prefect-worker ./prefect-worker -values values.yaml
コンテナポートフォワードで接続する
kubectl port-forward svc/prefect-server 4200:4200
UIにアクセスしてみる
http://127.0.0.1:4200 にアクセスしてみます。
上記のような画面になりましたでしょうか?
おわりに
ローカルでサクッと立てたかったのでポートフォワードを使用しましたが、ingressを作成したり独自ドメインを設定して他の人も使用できるようにするとより良いと思います。
今回構築したサーバーを使用しながら実際にワークフローを実行する際の手順については、ぜひ次回の記事に書きたいと思います!
ここまでお読みいただき、ありがとうございました。
参考元
株式会社D2C d2c.co.jp のテックブログです。 D2Cは、NTTドコモと電通などの共同出資により設立されたデジタルマーケティング企業です。 ドコモの膨大なデータを活用した最適化を行える広告配信システムの開発をしています。
Discussion