「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などへ通知するイメージです。
- source-controller:GitHub, Gitlabのリポジトリとの接続を管理します
- kustomize-controller:kustomizeによるマニフェストの作成/適用を管理します
- helm-controller:helmによるリソース構築を管理します
- notification-controller:リポジトリにおけるソースの変更を監視し、SlackやTeamsなどへの通知を管理します
- Image Automation Controllers:新しいコンテナイメージが利用可能になった際にGit repositoryをUpdateします
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児のパパ。