🐳

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のチャートを使用します。
https://github.com/PrefectHQ/prefect-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/)

./prefect-agent/values.yaml
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のワーカーはエージェントの記述通り、フローの実行を行います。
タスクの依存管理やログ・メトリクスの収集を行いサーバーに送信する役割も担っています。

./prefect-worker/values.yaml
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を作成したり独自ドメインを設定して他の人も使用できるようにするとより良いと思います。
今回構築したサーバーを使用しながら実際にワークフローを実行する際の手順については、ぜひ次回の記事に書きたいと思います!

ここまでお読みいただき、ありがとうございました。

参考元

https://github.com/PrefectHQ/prefect/blob/main/LICENSE
https://github.com/PrefectHQ/prefect-helm/tree/main/charts
https://helm.sh/docs/helm/helm_install/
https://docs.prefect.io/latest/concepts/agents/
https://docs.prefect.io/latest/concepts/work-pools/

D2C m-tech

Discussion