Flux という GitOps を実現するためのツールがあると知り、触って見たかったのでデータエンジニアもくもく会の時間を利用して触って見ました。
この辺りは前の現場までだと自分が直接触ることが無かったのでデータエンジニアリング領域とはあまり関係ないなと思っていたのですが、今の環境だと OSS 製品を安定して動かすことが求められており、データエンジニアリングが改めて総力戦だと実感しています。どうしたらデータ基盤を安定運用できるか考えており、いろんな方に聞きながら勉強していますが、GitOps も昨年知って勉強中です。
GitOps だと ArgoCD が有名だと思うのですが、データ領域で動かすにはちょっと過剰じゃないかとぼんやり思っていたので、CLIベースの軽量な Flux がもしかしたら適切かもと思っています。特に Flux は Helm のようなパッケージ化されたアプリケーションをデプロイ管理するのに適しているようで、Helm を使って Prefect, Airbyte をデプロイしている今の環境にもマッチしていそうです。まだ本格的な検証をしてはいませんが、他の GitOps 製品も比較しながら導入検討していきます。
チュートリアルをやってみる
Github アカウントに加えて Kubernetes 環境が必要です。私は colima でローカル環境で動かしています:
$ colima start --cpu 8 --memory 12 --disk 160 --kubernetes --network-address
詳しくはこちらをどうぞ:
Flux をインストール
Github トークンはこちらのページを参考にして、Github から設定できます。トークンの権限としては Codespaces, Contents, Metadata を追加しました。 個人用アクセス トークンを管理する - GitHubドキュメント
$ brew install fluxcd/tap/flux $ export GITHUB_TOKEN=<your-token> $ export GITHUB_USER=<your-username>
flux check の結果、kubernetes が認識されていて Flux が動かせることが確認できました:
$ flux check --pre ► checking prerequisites ✔ Kubernetes 1.30.0+k3s1 >=1.28.0-0 ✔ prerequisites checks passed
Github と接続
あらかじめ動作確認用のリポジトリとして fleet-infra を用意し、clone してリポジトリ配下に移動しておきます。このリポジトリに更新があれば、Flux が検知して Kubernetes 上に設定反映してくれるという仕組みです。
$ flux bootstrap github --token-auth --owner=$GITHUB_USER --repository=fleet-infra --branch=main --path=clusters/my-cluster --personal ... ► confirming components are healthy ✔ helm-controller: deployment ready ✔ kustomize-controller: deployment ready ✔ notification-controller: deployment ready ✔ source-controller: deployment ready ✔ all components are healthy
Kuberenetes クラスタの上に、Flux の Pod がデプロイされました:
$ kubectl get pod -n flux-system NAME READY STATUS RESTARTS AGE helm-controller-6f558f6c5d-x7xxv 1/1 Running 0 27s source-controller-6d597849c8-p592g 1/1 Running 0 27s kustomize-controller-74fb56995-2mwz4 1/1 Running 0 27s notification-controller-5d794dd575-l7dnf 1/1 Running 0 27s
アプリケーションを追加
サンプルアプリケーションを fleet-infra に追加し、Flux に起動してもらいます。まずはアプリケーションのソースを追加します:
$ mkdir -p ./clusters/my-cluster $ flux create source git podinfo \ --url=https://github.com/stefanprodan/podinfo \ --branch=master \ --interval=1m \ --export > ./clusters/my-cluster/podinfo-source.yaml
podinfo-source.yaml というマニフェストが生成されるので、コミット&プッシュすると、ポーリングしている Flux がファイルを検知してマニフェストを適用してくれます:
$ flux get sources all NAME REVISION SUSPENDED READY MESSAGE gitrepository/podinfo master@sha1:b99bf8c2 False True stored artifact for revision 'master@sha1:b99bf8c2' gitrepository/flux-system main@sha1:2ff5f9dc False True stored artifact for revision 'main@sha1:2ff5f9dc'
ソースの追加ができたので、アプリケーションを追加します:
$ flux create kustomization podinfo \ --target-namespace=default \ --source=podinfo \ --path="./kustomize" \ --prune=true \ --wait=true \ --interval=30m \ --retry-interval=2m \ --health-check-timeout=3m \ --export > ./clusters/my-cluster/podinfo-kustomization.yaml
生成された podinfo-kustomization.yaml をコミット&プッシュすると、podinfo のアプリケーションが Flux によってデプロイされます:
$ kubectl -n default get deployments,services NAME READY UP-TO-DATE AVAILABLE AGE deployment.apps/dbt-sample-domain 0/1 0 0 188d deployment.apps/podinfo 2/2 2 2 32s NAME TYPE CLUSTER-IP EXTERNAL-IP PORT(S) AGE service/kubernetes ClusterIP 10.43.0.1 <none> 443/TCP 230d service/podinfo ClusterIP 10.43.9.183 <none> 9898/TCP,9999/TCP 32s
サービスがあるので 9898 に繋いでみると、アプリケーションの起動が確認できます:
$ kubectl port-forward svc/podinfo 9898:9898 -n default Forwarding from 127.0.0.1:9898 -> 9898 Forwarding from [::1]:9898 -> 9898

