PrefectでCI/CDを行う

2024/06/23に公開
2

要約

  • gitlab.comでgitを取り扱い、hub.dockercomでdockerイメージを取り扱う事でGitOpsを行います。

インストールする環境

  • server
    • CPU: 3コア
    • メモリ: 2GB
    • OS: Debian系Linux Kernel 6.6.15 amd64

必要なもの

  • gitlab.com 無料版 のprivateリポジトリ1個
    • 今回はprefectという名前のリポジトリにしました。
  • hub.docker.com 無料版 のprivateリポジトリ1個
    • 今回はprefectという名前のリポジトリにしました。

構成概略

  • 開発者はコードに集中できるようになる

環境構築

minikubeのインストール~Prefect環境の構築

https://zenn.dev/syakesaba/articles/install_prefect_minikube

Gitlab-Runnerの構築

Gitlab Runnerをkubernetesにインストールし有効化

# Gitlab Helmリポジトリの追加
helm repo add gitlab https://charts.gitlab.io/
helm repo update

# Gitlab共通URL。
# 実際はrunner-tokenが実projectと紐づいています。
GITLAB_URL=https://gitlab.com/

# runner-tokenはGitlabの画面で発行してください。
# 今回、このrunnerはtagsに minikube を設定しています。
GITLAB_RUNNER_TOKEN=glrt-xxxxxxxxxxxxxxxxxxxx

## Gitlab-Runnerのダウンロードと実行
# ダウンロード
helm pull gitlab/gitlab-runner --untar
# 実行
helm install gitlab-runner ./gitlab-runner \
--namespace prefect \
--set gitlabUrl=${GITLAB_URL} \
--set runnerToken=${GITLAB_RUNNER_TOKEN} \
--set rbac.create=true

# サービスの稼働を確認
kubectl get pods -n prefect
# gitlab-runnerのrunner-tokenがk8sのsecretに保存されている事を確認 (暗号化してないのでBASE64の平文)
kubectl  get secret -n prefect gitlab-runner -o yaml
# Podの中の設定ファイルを確認
kubectl exec -ti -n prefect deployment/gitlab-runner -- cat 'home/gitlab-runner/.gitlab-runner/config.toml'

RunnerTokenを発行したプロジェクトのGitlabのProject Runnersの画面を開いてみて、該当RunnerのStatusランプが🟢であればOK

status_runners.png

ファイル構成と、それぞれ考慮すべきポイント

https://github.com/syakesaba/prefect-ci/tree/main

.gitlab-ci.yml

https://github.com/syakesaba/prefect-ci/blob/main/.gitlab-ci.yml

Gitlab Variablesの設定、Kubernetes ServiceAccountの設定

https://github.com/syakesaba/prefect-ci/blob/main/README.md

  • Gitlab VariablesはkanikoがDockerイメージをpushする際に必要。
  • Kubernetes ServiceAccountはPrefect WorkerがDockerHubのPrivateRegistryからDockerイメージをpullする際に必要。

Dockerfileの作成

https://github.com/syakesaba/prefect-ci/blob/main/dev/Dockerfile

  • ここでも、Prefectのbaseイメージのバージョンは合わせること。
  • Prefectで必要なプラグインライブラリはrequirements.txtで記述する。

requirements.txtの作成

https://github.com/syakesaba/prefect-ci/blob/main/dev/requirements.txt

  • Prefect自体の依存ライブラリ、特にcertifiのバージョンに注意すること。

prefect.yamlの作成

https://github.com/syakesaba/prefect-ci/blob/main/dev/prefect.yaml

  • ここでも、Prefectのbaseイメージのバージョンは合わせること。
  • work_poolに対して、以下を指定
    • image: pullすべきDockerリポジトリ (今回はdocker.io)
    • namespace: prefect-serverと同じ名前空間
    • service_account_name: ImagePullSecret (今回はdocker.ioの認証情報)を持ったSNを指定
    • image_pull_policy: 常に最新のものをdocker.ioから取ってくるように。
    • finished_job_ttl: ttlSecondsAfterFinishedを終了後30秒にセット
  • image_pull_policyはもうちょっとうまい方法があると思われる。このままだと、Flowを更新した後最初に実行するFlow Runの実行時間がimage pullの際に長くなる。CI/CDの中でノードにDockerイメージをプリフェッチする仕組みを取るべきである。

実行結果

  • deploymentされている様子

cicd_deployed.png

  • deploymentをQuick Runした結果

cicd_prefect.png

まとめ

Kubernetesの名前空間でクローズしたCI/CDが可能になりました

Discussion

syakesabasyakesaba

psqlのアクセス

kubectl exec -ti -n prefect prefect-server-postgresql-0 bash
psql -U prefect -d server # pass: prefect-rocks

ハングアップしたレコードのdelete

delete from flow_run where id = 'flowid';