GitOps
「あるべき状態」を Git に宣言し、エージェントが自動で実環境を一致させる運用モデル。Git が唯一の正、デプロイは Pull 型、ズレ(ドリフト)は検知して直す。
- 1.GitOps は 宣言的:望ましい状態を Git に書き、Git を“唯一の正(Single Source of Truth)”にする。
- 2.同期は Pull 型:クラスタ内のエージェントが Git を監視し、差分を自動で適用。手元から直接 kubectl apply しない。
- 3.ドリフト(実環境と Git のズレ)を常時検知し、Git の状態へ自動で引き戻す。変更は Pull Request 経由で監査・ロールバックできる。
なぜ「Git を正」にするのか
従来のデプロイは、CI の最後に手元やパイプラインから kubectl apply や helm upgrade を 外から押し込む(Push) やり方が主流でした。これには弱点があります。
- 実環境の状態がどこにも一元化されていない:「いま本番に何が入っているか」は誰かの手元の操作履歴やログにしか残らない。
- 手作業の割り込み(緊急の
kubectl edit)で、リポジトリと実環境が静かにズレていく。 - ロールバックや監査が「人の記憶」頼りになりやすい。
GitOps はこれを反転させます。「あるべき状態」を Git に宣言的に書き、実環境をそこに合わせる。Git のコミット履歴がそのまま「いつ・誰が・何を・なぜ」の監査ログになり、git revert がロールバックになります。
4つの原則
OpenGITOPS(CNCF)が整理する GitOps の核は、次の4点です。
- 宣言的(Declarative):手順ではなく「望ましい状態」を記述する(
kubectl run …ではなく Deployment の YAML)。 - バージョン管理され不変(Versioned & Immutable):その状態は Git に保存され、改ざんできない履歴として残る。
- 自動で取り込む(Pulled Automatically):エージェントが望ましい状態を 自分から取りに行き、適用する。
- 継続的に収束(Continuously Reconciled):実環境を観測し、宣言と差があれば自動で一致させ続ける(一度きりではない)。
GitOps は宣言的な記述(Kubernetes マニフェスト・Helm・Kustomize など)と相性が良い、というより 宣言的であることが前提。手続き的なスクリプトを Git に置いただけでは、状態の収束やドリフト検知は成立しません。GitOps はまず IaC(/devops/iac/)の宣言的アプローチの上に立ちます。
仕組み:Reconciliation ループ
中心にあるのは 収束ループ(reconciliation loop) です。クラスタ内に常駐するエージェント(Argo CD・Flux など)が、次を回し続けます。
- 望ましい状態を取得:Git リポジトリの対象パスを監視(ポーリング or Webhook)。
- 実際の状態を観測:クラスタの現状(実際に動いている Deployment 等)を取得。
- 差分を計算:望ましい状態 と 実際の状態 を比較。
- 収束(apply):差があればエージェントが適用して一致させる。
- これを繰り返す(継続的)。
# 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)まで延長 したものと言えます。
つまずきポイント
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、ネットワーク、監視、バックアップとの接続方法を先に洗い出す。
- 小さく試してから、本番移行、権限設計、障害時手順、コスト監視を決める。