祝CNCF Graduated project👏Flux OCI Artifactsサポートを利用したGitOpsについて（概要編）

![flux-horizontal-color.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/39615/5684fb5f-f1f6-7ede-608a-0a064ccf7c24.png)

Fujitsu Advent Calendarの2日目です。今年は、[つい先日2022年11月30日にCNCF Graduated projectとなりました](https://fluxcd.io/blog/2022/11/flux-is-a-cncf-graduated-project/)Fluxの最新機能の１つであるOCI Artifactsサポートについてみていきたいと思います。

# そもそもFluxとは何か
* k8s 環境でGitOps によりcontinuous delivery及びprogressive delivery（flaggerも併せて利用）を実現可能にするOSSツールです。GitOpsを提唱するWeaveworks社内で2016年にプロジェクトがスタートし、その後CNCFに寄贈されました。
* 冒頭でお伝えした通り、今はKubernetes等と並んでCNCFのGraduated projectとして認定されています。
* k8sインフラ及びk8sワークロードのデプロイメントでGitOpsを実現するために使われます。
* [Flux公式サイト](https://fluxcd.io/)

# Flux OCI Artifactsサポートとは
* アプリケーションデプロイメントのマニフェストやコンフィグレーションをアプリケーションと同一のOCIレジストリ（コンテナレジストリ）に登録して、OCI Artifactsに基づいてk8sクラスタのreconcileが行われます。なので、[もはやGitOpsという用語ではなくなるの?](https://twitter.com/Futuredon/status/1558014155956912129?s=200)という質問をメンテナの方がもらっていましたが、あくまで根源というかthe Source of Truthは変わらずGitであり、OCI Artifactsは中間ファイルに該当する、と回答してました。

## OCIとは
* Open container initiativeの略で、コンテナのフォーマットやランタイムに関する仕様の標準化を目的としたプロジェクトであり、Linux Foundationの支援のもとで活動しています。
* コンテナフォーマット、ランタイム、コンテナレジストリの3つの標準化活動に分かれています。

## OCI Artifactsとは
* OCI ArtifactsはDistribution-spec（コンテナレジストリ関連の仕様）内で規定されている仕様の1つです。
* OCI Artifactsは、ユーザがOCIレジストリを介してコンテナイメージ以外のものを格納および配布するために利用されます。
    * 任意のファイルの格納、配布にコンテナ形式をわざわ選択するメリットとしては、様々な環境でコンテナ形式によるワークロードのデプロイメントをサポートしている点が挙げられます。
* このOCI Artifactsを利用するトレンドはHelmやOPAなど、他のツールにも既に広まっています。Docker Hubも先日2022/10/31にOCI Artifactsのサポートをアナウンスしています（[Announcing Docker Hub OCI Artifacts Support - Docker](https://www.docker.com/blog/announcing-docker-hub-oci-artifacts-support/)）。
    * Helm：2021/01/14リリースのHelm 3.5.0よりOCIレジストリからのChartのPullをサポート
    * OPA：2022/04/28リリースのOPA v0.40.0よりOCIレジストリからBundlesを取得する機能をpreviewとして追加

# 何を解決してくれるのか
* cuelangやjsonnetの利用でk8sクラスタに最終的に適用されるマニフェストやコンフィグレーションはGitリポジトリにコミットされたものとは一致しないことがあります。CI/CDパイプラインの過程で、Gitリポジトリのファイルをベースにマニフェスト等が動的に生成されるためです。そのためGitリポジトリ上のファイルが厳密にはsingle source of truthではなくなる、という問題が生じます。
* 今回紹介するFluxのOCI Artifactsサポート機能を利用すれば、動的に生成されたマニフェストやコンフィグレーションをOCI artifactとしてOCIレジストリに中間ファイルとして保存（Push）し、Gitのリポジトリではなく、OCIのレジストリ上のOCI ArtifactsをGitOpsの同期ターゲットとすることでimmutableな環境再現が可能となります。
* またGitレポジトリと同期をとるより、OCIレジストリと同期をとる方がパフォーマンスが良く、スケーラビリティが向上するというメリットが挙げられます。またOCIレジストリ上のイメージ利用の方が、Gitリポジトリ上のコンテンツを利用する場合よりもセキュリティが担保しやすい点もメリットとして挙げられます。
    * 大抵Cloudプラットフォーム上にコンテナレジストリが用意されており、IAMでアクセス制御できるため、Gitレポジトリにアクセスする際に必要なキーやトークンのマネジメント等が不要になる、という意味で「セキュリティが担保しやすい」と言えます。


# ハンズオンについて

## ハンズオンで実現するGitOps環境

実現する環境は以下の要素で構成されます：

* Github上のリポジトリ
* GitHub ActionによるCIパイプライン
* Github上のコンテナレジストリ（OCIレジストリ）
* k8sクラスタ上のFlux

Github上のリポジトリへのコミットによってCIパイプラインがトリガーされ、OCI ArtifactsをOCIレジストリに格納するジョブが実行されます。k8sクラスタ上のFluxがOCI Artifactsのハッシュが更新されたことを検出して、OCI Artifactsに含まれるマニフェストを取得し、クラスタに適用します。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/39615/130aa7ad-8c79-63c9-a690-6c05ac51395a.png)（出典：[OCI cheatsheet | Flux](https://fluxcd.io/flux/cheatsheets/oci-artifacts/)）

## 利用するツール
* VSCode 拡張機能: GitOps Tools for Flux 
    * Fluxの主な操作をVSCode上から実施するためのVSCode拡張機能になります。
* Github Container Registry
    * OCI準拠のコンテナレジストリとしてghcrを利用します。
* kind + kubectl
    * kindを使ってローカルホスト上にシングルノードクラスタを作成し、その上にデモ環境を構築します。
* Github Action
    * OCI Artifactsを作成/PushするCIパイプラインをGithub Action上に構築します。
* Flux CLI
    * 主な操作はVSCodeから実施しますが、VSCode拡張機能を動かすには、このCLIをホスト上にインストールしておく必要があります。


以下の ハンズオン編 に続きます。
* [Flux OCI Artifactsサポートを利用したGitOpsについて（ハンズオン編）](https://qiita.com/nekia/items/b11767f0e5dece3ffe4f)

---

# 参考URL
* [OCI cheatsheet | Flux](https://fluxcd.io/flux/cheatsheets/oci-artifacts/)
* [OCI Repositories | Flux](https://fluxcd.io/flux/components/source/ocirepositories/)
* [go-containerregistry/crane.md at main · google/go-containerregistry](https://github.com/google/go-containerregistry/blob/main/cmd/crane/doc/crane.md)
* [OCI Artifacts Explained. Are they real? Kind of! | by Dan Lorenc | Medium](https://dlorenc.medium.com/oci-artifacts-explained-8f4a77945c13)
* [OCI Artifacts and a View of the Future – Steve Lasker](https://stevelasker.blog/2019/08/25/oci-artifacts-and-a-view-of-the-future/)
* [flux2/rfcs/0003-kubernetes-oci at main · fluxcd/flux2](https://github.com/fluxcd/flux2/tree/main/rfcs/0003-kubernetes-oci)
* [Flux Security & Scalability using VS Code GitOps Extension - YouTube](https://www.youtube.com/watch?v=Bmh7kKYLIhY)
* [Flux’s Security & Scalability with OCI & Helm (Part 2) with Kingdon Barrett - YouTube](https://www.youtube.com/watch?v=uRiCRTSkPOQ)