koukiblog

たぶんweb系の話題

Flux2について調べた

久しぶりにFluxを調べたらFlux2が出ていて、別物になっていたので調べたことをまとめます。

Flux2について

ArgoCDと合流して、GitOpsEngineを開発していくみたいな話になったのですが、結局両者は別れることにことになり、WeaveWorks社が出したのがFlux2 です。 Fluxをカスタムコントローラーなどを利用してリライトしたものという理解でよさそうです。 思想は引き継いでいますが、インストール方法や設定方法はFlux1とは全然違います。

変わったところ

Fluxの各機能はコンポーネント化されていて、カスタムリソースを利用して設定していく形になっています。 また、Helmも正式サポートされています。

Helmを使った例がわかりやすいので紹介すると、今までHelmを利用する場合は下記のようにhelmコマンドを使ってインストールしていたと思います。 helm repo add で chartをレポジトリに追加し、 helm installでchartをクラスタにインストールしています。

helm repo add traefik https://helm.traefik.io/traefik
helm install my-traefik traefik/traefik \
  --version 9.18.2 \
  --namespace traefik

それが、Fluxを使うとこうなります。

flux create source helm traefik --url https://helm.traefik.io/traefik
flux create helmrelease --chart my-traefik \
  --source HelmRepository/traefik \
  --chart-version 9.18.2 \
  --namespace traefik

flux create コマンドはk8sクラスタにリソースを作っているわけではなく、それぞれ、 Source, HelmRelease というFluxが定義したカスタムリソースを作成しています。 そして、そのカスタムリソースをHelm Controllerが参照してChartをクラスタにデプロイします。

Gitレポジトリからマニフェストを取得してApplyする場合は、 source として GitRepositryを定義し、それをapplyするkustomizeリソースを作成します。最初ちょっとわかりづらかったのですが、kubectl applyするだけのリソースはなく、 kustomizeリソースを利用するようです。

先ほどのHelmの例で作ったカスタムリソースは下記のようになります。これをkustomizationリソースで反映しても flux create コマンドと同じことができます。

# /flux/boot/traefik/helmrepo.yaml
apiVersion: source.toolkit.fluxcd.io/v1beta1
kind: HelmRepository
metadata:
  name: traefik
  namespace: traefik
spec:
  interval: 1m0s
  url: https://helm.traefik.io/traefik
# /flux/boot/traefik/helmrelease.yaml
apiVersion: helm.toolkit.fluxcd.io/v2beta1
kind: HelmRelease
metadata:
  name: traefik
  namespace: traefik
spec:
  chart:
    spec:
      chart: traefik
      sourceRef:
        kind: HelmRepository
        name: traefik
      version: 9.18.2
  interval: 1m0s

GitOpsツール自体の設定の可視化は課題だと思っていたので、カスタムリソースで定義できるのは非常によさそうです。

Configレポジトリのサンプル

マニフェストを保存するConfigレポジトリのサンプルが提供されていました。これをベースにカスタマイズしていくのがよさそうかなと思います。

github.com

ArgoCD との比較

こちらにまとまっていました。個人的にはArgoCDは権限周りが複雑そうで、k8sのRBACをそのまま使えるFluxが好みです。

ArgoCD と Flux2 の比較