Flux2」はJenkins X、Spinnaker、ArgoCD、Tektonなどと並ぶCD(Continuous Delivery)ツールです。2021年3月10日に、CNCF(Cloud Native Computing Foundation)のIncubationプロジェクトとなったことが発表され、注目を集めています。

今回は、このFlux2について解説します。

活況を見せるGitOpsの世界

Flux2のv0.1は、2020年10月1日にリリースされました。2021年3月21時点の最新バージョンは、v0.10.0です。2021年1月23日にv0.63であり、その後2カ月程度でv0.7.0~0.10.0まで14回リリースされていることから、活発に開発が進められていることがわかります。v0.1.8までは「GitOps Toolkit」の名前で開発されていましたが、v0.2になるタイミングでFlux2と改称されGitOps ToolkitはFlux2の主要コンポーネントとして位置付けられました。なお、Flux1は現在メンテナンスモードとなっており、2021年末には非推奨となります。

また、2019年11月14日に発表された、ArgoCDとFluxが共同開発する「Argo Flux」のニュースからも、GitOps界隈の動きの活発さが感じられます。同発表では、ArgoCDとArgo Fluxのベースとなる「GitOps Engine」の開発が進められていることも明らかにされました。

Flux2のアーキテクチャ

Flux2はKubernetesネイティブなツールで、YAMLによる宣言的な記述を行い、kubectlレスでKustomize、Helm、GitHub、GitLabなどと連動して動作します。主要コンポーネントであるGitOps Toolkitにより、CD(GitOps)を実現するさまざまなコンポーネントを保持しています。

Flux2は、以下に分類されるコントローラ(およびCRDコンポーネント群)で構成されます。大まかな動作としては、GitHubなどのリポジトリの変更を検知すると、k8s環境へリリースし、結果をSlackなどへ通知するイメージです。

アーキテクチャ

Flux2のアーキテクチャ/出典:Fluxの公式サイト

チュートリアルを試す

では早速、チュートリアルをやってみましょう。このチュートリアルでは、GitHubのリポジトリの変更を検知し、k8sの環境へリリースしたり、変更をSlackなどへ通知したりします。

fluxコマンドのインストール

まず、fluxコマンドをインストールします。

$brew install fluxcd/tap/flux
==> Installing flux from fluxcd/tap
==> Downloading https://github.com/fluxcd/flux2/releases/download/v0.7.4/flux_0.
Already downloaded: /Users/yujishono/Library/Caches/Homebrew/downloads/2805c940702898e3f4c51ad8eca8e1e1ce367642a62bdfbe497750d2387890d2--flux_0.7.4_darwin_amd64.tar.gz
  /usr/local/Cellar/flux/0.7.4: 3 files, 48.1MB, built in 4 seconds

事前条件のチェックも併せて実施しておきましょう。

コード

Flux環境の作成

Fluxのコンポーネントを作成し、Flux環境を構築します。$GITHUB_USERで指定したユーザーでgithubに「fleet-infra」という名称のリポジトリを作成します。

コード

また、各種コントローラも作成されます。

$kubectl -n flux-system get deployments,services
NAME                                      READY   UP-TO-DATE   AVAILABLE   AGE
deployment.apps/helm-controller           1/1     1            1           13m
deployment.apps/kustomize-controller      1/1     1            1           13m
deployment.apps/notification-controller   1/1     1            1           13m
deployment.apps/source-controller         1/1     1            1           13m

Webアプリの構築

Webアプリを構築するには、まず先ほど構築したGitリポジトリをクローンします。

$git clone https://github.com/$GITHUB_USER/fleet-infra
Cloning into 'fleet-infra'...
remote: Enumerating objects: 16, done.
remote: Counting objects: 100% (16/16), done.
remote: Compressing objects: 100% (9/9), done.
remote: Total 16 (delta 0), reused 13 (delta 0), pack-reused 0
Unpacking objects: 100% (16/16), done.
$cd fleet-infra

次に、「podinfo」という名前のWebアプリケーションのリポジトリをFlux2に登録します。実際には、Kindが”GitRepository”のk8sリソースを作成し、-intervalオプションで指定された間隔で同期処理を実行します。

$flux create source git podinfo  --url=https://github.com/stefanprodan/podinfo  --branch=master  --interval=30s --export > ./clusters/my-cluster/podinfo-source.yaml
$git add -A && git commit -m "Add podinfo GitRepository"
$git push

続いて、Kindが”Kustomization”のk8sリソースを作成します。これにより、podinfo WebアプリケーションのKustomizeのマニフェストを作成/適用します。

$flux create kustomization podinfo  --source=podinfo --path="./kustomize" --prune=true --validation=client --interval=5m    --export > ./clusters/my-cluster/podinfo-kustomization.yaml
$git add -A && git commit -m "Add podinfo Kustomization"
$git push

アクセスしてみましょう

Webアプリケーションにアクセスするには、以下のように「port-forward」を設定します。

$kubectl -n default port-forward svc/podinfo 9898:9898
Forwarding from 127.0.0.1:9898 -> 9898
Forwarding from [::1]:9898 -> 9898

ブラウザから「http://localhost:9898/」にアクセスします。

アクセス後のページ

* * *

Flux2は向こう数カ月の内にGA(General Availability)されることが公式サイトでアナウンスされています。後発であるが故、これまでのCDツールのいいところどりができており、GitOpsを実現する機能を一通りそろえています。 さらにツール自体がコンポーネント化されており、変化の早いKubernetes界隈の動きに追従しやすくなっています。現に、「Image Automation Controllers」は比較的直近のバージョン(v0.8.0)で追加された機能です。 今後の動きが見逃せないFlux2をぜひ、お手元の環境で触ってみてください。

著者紹介


正野 勇嗣 (SHONO Yuji ) - NTTデータ 課長

2011年まで開発自動化技術のR&Dに従事。その後、開発プロジェクト支援やトラブルシューティング等に主戦場を移す。「ソースコード自動生成」に加えて、JenkinsやMaven等の「ビルド自動化」、JsTestDriverやSelenium等の「テスト自動化」を扱うようになり、多様化する開発自動化技術動向に興味。

最近は第四の自動化であるInfrastructure as Code等の「基盤自動化」の魅力に惹かれている。開発自動化技術に関する雑誌・記事執筆も行う。3児のパパ。