/home/by-natures/dev*

データ界隈で働くエンジニアとしての技術的なメモと、たまに普通の日記。

Flux 触ってみる(GitOps)

Flux という GitOps を実現するためのツールがあると知り、触って見たかったのでデータエンジニアもくもく会の時間を利用して触って見ました。

この辺りは前の現場までだと自分が直接触ることが無かったのでデータエンジニアリング領域とはあまり関係ないなと思っていたのですが、今の環境だと OSS 製品を安定して動かすことが求められており、データエンジニアリングが改めて総力戦だと実感しています。どうしたらデータ基盤を安定運用できるか考えており、いろんな方に聞きながら勉強していますが、GitOps も昨年知って勉強中です。

GitOps だと ArgoCD が有名だと思うのですが、データ領域で動かすにはちょっと過剰じゃないかとぼんやり思っていたので、CLIベースの軽量な Flux がもしかしたら適切かもと思っています。特に Flux は Helm のようなパッケージ化されたアプリケーションをデプロイ管理するのに適しているようで、Helm を使って Prefect, Airbyte をデプロイしている今の環境にもマッチしていそうです。まだ本格的な検証をしてはいませんが、他の GitOps 製品も比較しながら導入検討していきます。

チュートリアルをやってみる

fluxcd.io

Github アカウントに加えて Kubernetes 環境が必要です。私は colima でローカル環境で動かしています:

$ colima start --cpu 8 --memory 12 --disk 160 --kubernetes --network-address

詳しくはこちらをどうぞ:

bynatures.hatenadiary.jp

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

Podinfo サンプルアプリケーションが Flux によってデプロイされました