⏩
PrefectでCI/CDを行う
要約
- 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環境の構築
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
ファイル構成と、それぞれ考慮すべきポイント
.gitlab-ci.yml
- PrefectでDockerイメージのbuildとpushやると色々しんどいので、kanikoでbuildとpushを実施
- PrefectにDeploymentsをdeployする際の設定は極力prefect.yamlで実施
- 参考URL
Gitlab Variablesの設定、Kubernetes ServiceAccountの設定
- Gitlab VariablesはkanikoがDockerイメージをpushする際に必要。
- Kubernetes ServiceAccountはPrefect WorkerがDockerHubのPrivateRegistryからDockerイメージをpullする際に必要。
Dockerfileの作成
- ここでも、Prefectのbaseイメージのバージョンは合わせること。
- Prefectで必要なプラグインライブラリはrequirements.txtで記述する。
requirements.txtの作成
- Prefect自体の依存ライブラリ、特にcertifiのバージョンに注意すること。
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されている様子
- deploymentをQuick Runした結果
まとめ
Kubernetesの名前空間でクローズしたCI/CDが可能になりました
Discussion
次のステップ: 同じnamespaceにweb ide
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';