GitOps

Gitを信頼の源としたインフラ/アプリ管理

GitOpsとは

Gitリポジトリを「あるべき状態」の唯一の情報源(Single Source of Truth)とし、 自動的にシステムをその状態に同期させる運用手法。

GitOpsの4原則

1. 宣言的に記述

システム全体を宣言的に記述。YAMLマニフェスト、Helmチャート等。

2. Gitでバージョン管理

あるべき状態はGitに保存。変更履歴、監査ログ、ロールバックが可能。

3. 自動的に適用

承認された変更は自動的にシステムに適用される。

4. 継続的な調整

実際の状態を監視し、Gitの状態に自動的に戻す(自己修復)。

Push vs Pull モデル

Push型(従来のCI/CD)

CIがビルド後、クラスターにデプロイをPush。CI系がクラスターへの 認証情報を持つ。

例: Jenkins, GitHub Actions

Pull型(GitOps)

クラスター内のエージェントがGitを監視し、変更をPull。 クラスター外に認証情報を渡さない。

例: ArgoCD, Flux

ArgoCD

Kubernetes向けの宣言的GitOpsツール。Web UI、CLI、Syncステータスの可視化。

1# ArgoCD Application
2apiVersion: argoproj.io/v1alpha1
3kind: Application
4metadata:
5 name: my-app
6 namespace: argocd
7spec:
8 project: default
9 source:
10 repoURL: https://github.com/myorg/my-app-manifests.git
11 targetRevision: HEAD
12 path: overlays/production
13 destination:
14 server: https://kubernetes.default.svc
15 namespace: my-app
16 syncPolicy:
17 automated:
18 prune: true # 不要なリソースを削除
19 selfHeal: true # drift検出時に自動修復
20 syncOptions:
21 - CreateNamespace=true

Flux

CNCFプロジェクト。Kubernetes上でGitOpsを実現するツールキット。

1# Flux GitRepository
2apiVersion: source.toolkit.fluxcd.io/v1
3kind: GitRepository
4metadata:
5 name: my-app
6 namespace: flux-system
7spec:
8 interval: 1m
9 url: https://github.com/myorg/my-app-manifests
10 ref:
11 branch: main
12---
13# Flux Kustomization
14apiVersion: kustomize.toolkit.fluxcd.io/v1
15kind: Kustomization
16metadata:
17 name: my-app
18 namespace: flux-system
19spec:
20 interval: 10m
21 sourceRef:
22 kind: GitRepository
23 name: my-app
24 path: ./production
25 prune: true

リポジトリ構成パターン

モノレポ

全環境・全アプリのマニフェストを1リポジトリで管理。シンプルだが権限管理が難しい。

アプリ/環境ごとに分離

アプリケーションコードとマニフェストを分離。環境ごとにブランチまたはディレクトリ。

1# 推奨構成例
2manifests/
3├── base/ # 共通定義
4│ ├── deployment.yaml
5│ └── service.yaml
6├── overlays/
7│ ├── development/ # 開発環境
8│ │ └── kustomization.yaml
9│ ├── staging/ # ステージング
10│ │ └── kustomization.yaml
11│ └── production/ # 本番
12│ └── kustomization.yaml

メリット

監査性

Git履歴が変更ログ

ロールバック

git revertで即座に戻せる

セキュリティ

外部にクラスター認証情報を渡さない

復旧

クラスター再構築時もGitから復元

注意点

シークレット管理

生の機密情報をGitに入れない。Sealed Secrets、SOPS、External Secrets Operatorを使用

イメージタグ

:latestは使わない。具体的なタグまたはダイジェストを使用

学習コスト

Kustomize、Helm、ArgoCD/Fluxの習得が必要