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 2 apiVersion: argoproj.io/v1alpha1 3 kind: Application 4 metadata: 5 name: my-app 6 namespace: argocd 7 spec: 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 2 apiVersion: source.toolkit.fluxcd.io/v1 3 kind: GitRepository 4 metadata: 5 name: my-app 6 namespace: flux-system 7 spec: 8 interval: 1m 9 url: https://github.com/myorg/my-app-manifests 10 ref: 11 branch: main 12 --- 13 # Flux Kustomization 14 apiVersion: kustomize.toolkit.fluxcd.io/v1 15 kind: Kustomization 16 metadata: 17 name: my-app 18 namespace: flux-system 19 spec: 20 interval: 10m 21 sourceRef: 22 kind: GitRepository 23 name: my-app 24 path: ./production 25 prune: true
リポジトリ構成パターン
モノレポ
全環境・全アプリのマニフェストを1リポジトリで管理。シンプルだが権限管理が難しい。
アプリ/環境ごとに分離
アプリケーションコードとマニフェストを分離。環境ごとにブランチまたはディレクトリ。
1 # 推奨構成例 2 manifests/ 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の習得が必要