「Gitを信頼の源(single source of truth)にする」というGitOpsの考え方は、宣言的な状態管理とクラスタ内エージェントによる継続的な調整で成り立ちます。ArgoCDとFluxを軸に、push型CIとの違いとAWS環境での勘所を整理します。

01GitOpsとは何か — Gitを「信頼の源」にする

GitOpsは、アプリケーションやインフラの「あるべき状態」をGitリポジトリに宣言的に記述し、そのGitを唯一の信頼の源(single source of truth)として扱う運用の考え方です。人がサーバやクラスタに直接手を入れるのではなく、Gitへのコミットを起点に、ソフトウェアエージェントが自動でその状態を反映・維持します。CNCFのGitOps Working Groupが運営するOpenGitOpsプロジェクトは、この考え方を4つの原則として明文化しました。

用語としてのGitOpsは、2017年にWeaveworksのAlexis Richardson氏が提唱したものが起点とされています。以来、Kubernetes(K8s)のエコシステムを中心に広がり、いまや宣言的デプロイの標準的な語彙になりました。この4原則自体はK8s専用の概念ではありませんが、宣言的APIと調整ループ(reconciliation loop)を前提とするK8sと相性が良く、実装が一気に進んだという経緯があります。

02push型CIとpull型GitOpsの違い

従来のCIパイプラインは、CIサーバがビルド後にkubectl applyhelm upgradeを実行し、外側からクラスタへ変更を「押し込む(push)」構造です。これに対しGitOpsは、クラスタ内に常駐するエージェントがGitを監視し、変更を「引き込む(pull)」構造を取ります。この違いは些細に見えて、運用のセキュリティと信頼性に大きく効いてきます。

現場のコツ:「GitOpsを入れる=既存CIを捨てる」ではありません。CNCFも、既存のCIツールを捨てずにGitOpsを足せると明言しています。実務では、ビルド・テスト・イメージ作成まではこれまでのCIで行い、デプロイ(状態の反映)だけをGitOpsに任せる分業がスムーズです。CIはマニフェスト用リポジトリのタグを書き換えるところまで、その先はArgoCD/Fluxに渡す、という切り分けが定番です。
push型 CI pull型 GitOps CIサーバ(外部) Gitリポジトリ Kubernetes クラスタ 監視 apply (push) Gitリポジトリ Kubernetesクラスタ GitOpsエージェント pull (調整)
図:push型CIは外部からクラスタへ適用を押し込む。pull型GitOpsはクラスタ内エージェントがGitを監視し変更を引き込む。

03ArgoCD — 差分の可視化と同期

ArgoCDは、Intuit社が開発しCNCFに寄贈された「Kubernetes向けの宣言的GitOps継続的デリバリツール」です。Gitリポジトリをアプリケーションのあるべき状態の源として使い、稼働中のアプリケーションを継続的に監視して、Gitの目標状態とライブ状態を突き合わせます。ライブ状態がGitから乖離すると、そのアプリケーションはOutOfSyncとして表示されます。

04Flux — GitOps Toolkitとコントローラ群

Fluxは、Weaveworks発の「Kubernetes向けのオープンで拡張可能な継続的デリバリソリューション」で、GitOps Toolkitと呼ばれるコントローラ群の上に構成されています。FluxはK8sのAPI拡張機構(カスタムリソース)をフルに使う設計で、GitRepositoryKustomizationHelmReleaseといったカスタムリソースとしてあるべき状態を宣言します。

現場のコツ:ArgoCDとFluxはどちらが上位互換という関係ではありません。ざっくりした傾向として、アプリチームにセルフサービスのUIを提供したいならArgoCD、プラットフォームチームがコントローラをK8sネイティブに組み込んで自動運用したいならFlux、という選び方が多い印象です。まずは非本番の一クラスタでどちらかを試し、UIの有無・マニフェスト管理のしやすさを実際に手で触って決めることをおすすめします。機能の細部やバージョン差はいずれも進化が速いため、公式ドキュメントで最新を要確認です。

05CNCFでの位置づけと潮流

ArgoCDとFluxは、いずれもCNCFのGraduated(卒業)プロジェクトです。CNCFのプロジェクト成熟度はSandbox → Incubating → Graduatedの三段階で、Graduatedは最上位に位置します。つまり両者とも、コミュニティの広がりとガバナンスの成熟が公式に認められた、事実上のデファクトと言える存在です。

加えて、これらのツールが実装する「GitOpsとは何か」の定義そのものを、CNCFのGitOps Working GroupがベンダーニュートラルにOpenGitOpsとして標準化しています。ツール選定に迷ったとき、まず4原則という共通の物差しに立ち返れるのは、エンタープライズにとって大きな安心材料です。特定ベンダーのマーケティング用語ではなく、Linux Foundation傘下のワーキンググループが定義した原則である、という点は稟議の場でも効いてきます。

06K8s前提の潮流とAWS環境での適用

GitOpsの実装が急速に広がった背景には、K8sの宣言的APIと調整ループがあります。裏を返すと、多くのGitOpsツールはK8sを前提に作られています。AWS環境で活かす場合、次のような整理が実務的です。

アカウントをまたぐ統制やIAMの現実的な設計は、GitOps単独では閉じません。土台となる考え方はマルチアカウント統制のページも併せてご覧ください。IaCとGitOpsをどう分担させるかは、状態管理の設計そのものと直結するため、IaCの状態管理の観点とセットで検討することをおすすめします。

07drift(構成ドリフト)の自動修復

GitOpsの4原則の最後、「継続的な調整」を運用に落とし込むのがdriftの自動修復です。誰かが緊急対応でクラスタを直接kubectl editしてしまった——こうした「Gitに書かれていない変更(ドリフト)」を、GitOpsは検知し、必要なら元に戻します。

現場のコツ:selfHealとpruneは強力ですが、既定で無効なのには理由があります。障害対応で入れた手当てを、GitOpsが気を利かせて即座に巻き戻してしまうと、火に油を注ぎかねません。導入初期は「検知はするが自動では戻さない(可視化のみ)」から始め、運用が回り始めてからselfHealを、最後にpruneを、という順で有効化していくのが堅実です。本番環境だけはメンテナンスウィンドウの概念や一時停止(sync window)を併用し、無防備な自動巻き戻しを避ける設計にしておくと安心です。

まとめ

GitOpsは「Gitを信頼の源にし、宣言的な状態をエージェントが継続的に調整し続ける」という、一貫した原則の集まりです。push型CIとの違いは認証情報の置き場所と監査性に効き、ArgoCDとFluxというCNCF卒業プロジェクトが、それぞれUI重視・K8sネイティブという性格で選べます。K8s(EKS)を使うなら第一候補ですが、クラスタ外のAWSリソースはIaCと役割分担し、selfHeal・pruneは段階的に有効化していくのが、大手SIer・エンタープライズの現場では無理のない進め方です。EMWは、既存のCIやIaC資産を活かしたまま、現場の運用習熟度に合わせてGitOpsを組み込む支援を行っています。導入事例は導入事例もご覧ください。

参考(一次情報)

GitOps基盤の設計やArgoCD/Flux導入、既存のCIパイプラインからの移行をご検討でしたら、お問い合わせください。現場の運用に合わせた無理のない移行計画をご提案します。

相談する
← ブログ一覧へ戻る