TL

GitOps

「あるべき状態」を Git に宣言し、エージェントが自動で実環境を一致させる運用モデル。Git が唯一の正、デプロイは Pull 型、ズレ(ドリフト)は検知して直す。

中級GitOpsKubernetesCD宣言的最終更新: 2026-06-04
TL;DR要点だけ先に
  • 1.GitOps は 宣言的:望ましい状態を Git に書き、Git を“唯一の正(Single Source of Truth)”にする。
  • 2.同期は Pull 型:クラスタ内のエージェントが Git を監視し、差分を自動で適用。手元から直接 kubectl apply しない。
  • 3.ドリフト(実環境と Git のズレ)を常時検知し、Git の状態へ自動で引き戻す。変更は Pull Request 経由で監査・ロールバックできる。

なぜ「Git を正」にするのか

従来のデプロイは、CI の最後に手元やパイプラインから kubectl applyhelm upgrade外から押し込む(Push) やり方が主流でした。これには弱点があります。

  • 実環境の状態がどこにも一元化されていない:「いま本番に何が入っているか」は誰かの手元の操作履歴やログにしか残らない。
  • 手作業の割り込み(緊急の kubectl edit)で、リポジトリと実環境が静かにズレていく。
  • ロールバックや監査が「人の記憶」頼りになりやすい。

GitOps はこれを反転させます。「あるべき状態」を Git に宣言的に書き、実環境をそこに合わせる。Git のコミット履歴がそのまま「いつ・誰が・何を・なぜ」の監査ログになり、git revert がロールバックになります。

4つの原則

OpenGITOPS(CNCF)が整理する GitOps の核は、次の4点です。

  1. 宣言的(Declarative):手順ではなく「望ましい状態」を記述する(kubectl run … ではなく Deployment の YAML)。
  2. バージョン管理され不変(Versioned & Immutable):その状態は Git に保存され、改ざんできない履歴として残る。
  3. 自動で取り込む(Pulled Automatically):エージェントが望ましい状態を 自分から取りに行き、適用する。
  4. 継続的に収束(Continuously Reconciled):実環境を観測し、宣言と差があれば自動で一致させ続ける(一度きりではない)。
「宣言的」が前提条件

GitOps は宣言的な記述(Kubernetes マニフェスト・Helm・Kustomize など)と相性が良い、というより 宣言的であることが前提。手続き的なスクリプトを Git に置いただけでは、状態の収束やドリフト検知は成立しません。GitOps はまず IaC(/devops/iac/)の宣言的アプローチの上に立ちます。

仕組み:Reconciliation ループ

中心にあるのは 収束ループ(reconciliation loop) です。クラスタ内に常駐するエージェント(Argo CD・Flux など)が、次を回し続けます。

  1. 望ましい状態を取得:Git リポジトリの対象パスを監視(ポーリング or Webhook)。
  2. 実際の状態を観測:クラスタの現状(実際に動いている Deployment 等)を取得。
  3. 差分を計算:望ましい状態 と 実際の状態 を比較。
  4. 収束(apply):差があればエージェントが適用して一致させる。
  5. これを繰り返す(継続的)。
# Git に置く「望ましい状態」の一例(Kubernetes Deployment)
apiVersion: apps/v1
kind: Deployment
metadata:
  name: web
spec:
  replicas: 3          # ここを 4 にして PR をマージ → エージェントが自動で 4 に収束
  template:
    spec:
      containers:
        - name: web
          image: registry.example.com/web:v1.4.2  # イメージタグの更新もコミットで

開発者がやることは Git を変えるだけreplicas: 3 → 4 の PR をマージすれば、エージェントが差分を検知して本番を 4 レプリカに収束させます。CI(ビルド・テスト・イメージ作成)と CD(同期)が Git を境に分離 されるのもポイントです(/devops/ci-cd/)。

ドリフト検知と自己修復

ドリフト(drift) とは、実環境が Git の宣言からズレた状態のこと。誰かが手で kubectl scale した、別ツールが書き換えた、といった原因で起きます。

収束ループは差分を常に見ているので、ドリフトを 検知 できます。さらに設定次第で 自己修復(self-heal) ――Git の状態へ自動で引き戻す――も可能です。

自己修復は諸刃の剣

自己修復を有効にすると、緊急の手動変更も「ドリフト」として勝手に巻き戻され ます。インシデント対応で kubectl edit した直後にエージェントが元に戻し、状況を悪化させることも。本番では「検知はするが自動修復はしない(差分を可視化して人が判断)」運用や、メンテ時の一時停止も検討しましょう。

Push 型デプロイとの違い

同じ CD でも、変更を 外から押し込む Push 型 と、内から取りに行く Pull 型 では性質が大きく異なります。

観点Push 型(従来の CD)Pull 型(GitOps)
変更の起点CI/パイプラインが外から applyクラスタ内エージェントが Git から取得
正の所在パイプライン設定・手元Git リポジトリ(Single Source of Truth)
認証情報CI に本番クラスタの強い権限が必要エージェントが内側に常駐、外部に鍵を渡さない
ドリフト気づきにくい継続的に検知(自己修復も可)
ロールバック再実行・手作業に頼りがちgit revert で履歴から戻す
監査ログを横断して追うコミット履歴がそのまま監査ログ
セキュリティ上の効き目

Pull 型では、デプロイの権限を持つエージェントが クラスタの内側 にいます。外部の CI に本番への強い認証情報を渡さずに済むため、攻撃面が小さくなるのが利点。CI が漏れても、本番を直接いじる鍵までは握られにくい構図です。

Kubernetes と相性が良い理由

GitOps が Kubernetes 文脈で広まったのは偶然ではありません。Kubernetes 自身が 「望ましい状態を宣言 → コントローラが収束させる」 という、GitOps と同じ思想で動いているからです(/devops/tools/kubernetes/)。

  • すべてのリソースが 宣言的な YAML/API オブジェクト で表せる。
  • 標準で 収束ループ を持つ(あるべき replica 数へ寄せ続ける等)。
  • GitOps エージェントは、その「望ましい状態」の 供給源を Git にする だけ。

つまり GitOps は、Kubernetes の収束モデルを クラスタの外(Git)まで延長 したものと言えます。

つまずきポイント

Git は唯一の正、を本気で守る

GitOps の効果は「Git に書いていない変更を一切しない」規律があって初めて出ます。手で kubectl apply する抜け道を残すと、Git と実環境が二重管理になり、かえって混乱します。緊急対応すら「Git を直して反映」を基本に据えるのが理想です。

  • シークレットの扱い:パスワードや鍵を平文で Git に置くのは厳禁。Sealed Secrets・外部シークレットストア連携・暗号化(SOPS 等)で「暗号化された状態」だけをコミットする。
  • リポジトリ構成:アプリのコードと、デプロイ用マニフェストの置き場を分ける構成(config リポジトリ分離)が定番。環境ごと(dev/stg/prod)の出し分けは Kustomize の overlay などで。
  • 「自動」への過信:GitOps は 状態の同期 を自動化するもので、テストや段階的リリースまで肩代わりはしません。カナリア/ブルーグリーンなどの段階的展開(/devops/deployment-strategies/)や、収束結果を見るための監視(/devops/observability/)と組み合わせて初めて安全に回せます。

まとめ:何が変わるのか

  • 正は Git:あるべき状態を宣言的に書き、唯一の真実とする。
  • デプロイは Pull 型:エージェントが Git から取りに行き、自動で収束させる。
  • ズレは検知:ドリフトを継続監視し、必要なら Git の状態へ引き戻す。
  • 運用は PR ベース:変更・レビュー・監査・ロールバックがすべて Git のワークフローに乗る。

「サーバに入って直す」から「Git を直すと環境が直る」へ。これが GitOps がもたらす一番の発想転換です。

DevOps/インフラ Article

GitOpsを実務で読む

TL;DRは入口です。実際に選ぶ・使う段階では、何を解決するか、何と比較するか、導入後にどこで詰まるかまで見る必要があります。

解決すること

GitOps

比較で見る軸

難易度: intermediate / カテゴリ: DevOps/インフラ / タグ数: 4

導入後に効く点

同期は Pull 型:クラスタ内のエージェントが Git を監視し、差分を自動で適用。手元から直接 kubectl apply しない。

先に潰すリスク

用語だけ覚えても、設計・実装・運用でどこに効くかを確認しないと判断を誤る。

数字・仕様の読み方
難易度
intermediate
カテゴリ
DevOps/インフラ
タグ数
4

判断チェックリスト

  • 自社の用途が「GitOps / Kubernetes」に近いか確認する。
  • 強みである「GitOps は 宣言的:望ましい状態を Git に書き、Git を“唯一の正(Single Source of Truth)”にする。」が本当に評価軸になるか確認する。
  • 注意点の「用語だけ覚えても、設計・実装・運用でどこに効くかを確認しないと判断を誤る。」を運用で吸収できるか確認する。
  • 公開値や仕様値は、対象プラン・対象機種・対象リージョンまで確認する。
  • 既存システム、ID、ネットワーク、監視、バックアップとの接続方法を先に洗い出す。
  • 小さく試してから、本番移行、権限設計、障害時手順、コスト監視を決める。

次に確認する観点

GitOpsKubernetesCD宣言的GitOpsKubernetesCD宣言的
参考: 公式情報