GitOps 원칙
Git을 단일 진실 공급원으로 사용하는 현대적인 인프라 운영 방식
Git을 단일 진실 공급원으로 사용하는 현대적인 인프라 운영 방식
목표: GitOps 원칙을 이해하고 도구를 활용하여 선언적 인프라를 운영할 수 있는 수준
🎯 GitOps 정의
원칙
graph TB
subgraph "GitOps 원칙"
GIT["📁 Git Repository"] -->|"1. 선언적 시스템"| DECLARATIVE["📋 선언적 정의"]
DECLARATIVE -->|"2. 버전 관리"| VERSION["🔢 버전 관리"]
VERSION -->|"3. 자동 적용"| AUTO["🔄 자동 동기화"]
AUTO -->|"4. 드리프트 감지"| DRIFT["📊 드리프트 감지"]
end
4가지 원칙:
- 선언적 시스템: 원하는 상태를 선언적으로 정의
- 버전 관리: 모든 설정을 Git으로 관리
- 자동 적용: Git 상태를 자동으로 클러스터에 적용
- 드리프트 감지: 수동 변경 감지 및 복구
🔄 GitOps vs 전통적 CD
비교
| 특징 | 전통적 CD | GitOps |
|---|---|---|
| 트리거 | CI 도구 | Git 변경 |
| 접근 방식 | 명령적 | 선언적 |
| 롤백 | 수동 | Git revert |
| 감사 | 어려움 | Git history |
| 드리프트 | 감지 어려움 | 자동 감지 |
아키텍처 비교
graph TB
subgraph "전통적 CD"
DEV["👨💻 개발자"] -->|"Push"| CI["🔨 CI"]
CI -->|"Deploy"| K8S["☸️ Kubernetes"]
CI -->|"kubectl"| K8S
end
subgraph "GitOps"
DEV2["👨💻 개발자"] -->|"Push"| GIT["📁 Git"]
GIT -->|"Watch"| ARGO["🎯 GitOps Agent"]
ARGO -->|"Apply"| K8S2["☸️ Kubernetes"]
end
🛠️ GitOps 도구
ArgoCD
# application.yaml
apiVersion: argoproj.io/v1alpha1
kind: Application
metadata:
name: my-app
namespace: argocd
spec:
project: default
source:
repoURL: https://github.com/myorg/my-app.git
targetRevision: HEAD
path: k8s/overlays/production
destination:
server: https://kubernetes.default.svc
namespace: production
syncPolicy:
automated:
prune: true
selfHeal: true
syncOptions:
- CreateNamespace=true
Flux
# GitRepository
apiVersion: source.toolkit.fluxcd.io/v1
kind: GitRepository
metadata:
name: my-app
namespace: flux-system
spec:
interval: 1m
url: https://github.com/myorg/my-app
ref:
branch: main
---
# Kustomization
apiVersion: kustomize.toolkit.fluxcd.io/v1
kind: Kustomization
metadata:
name: my-app
namespace: flux-system
spec:
interval: 10m
path: ./k8s/overlays/production
prune: true
sourceRef:
kind: GitRepository
name: my-app
📁 저장소 구조
GitOps 저장소
gitops-repo/
├── apps/
│ ├── production/
│ │ ├── my-app/
│ │ │ ├── kustomization.yaml
│ │ │ └── patches/
│ │ └── another-app/
│ └── staging/
│ └── my-app/
├── infrastructure/
│ ├── nginx-ingress/
│ ├── cert-manager/
│ └── monitoring/
└── clusters/
├── production/
│ ├── flux-system/
│ └── apps.yaml
└── staging/
└── apps.yaml
🔄 동기화 전략
자동 동기화
spec:
syncPolicy:
automated:
prune: true # Git에 없는 리소스 삭제
selfHeal: true # 수동 변경 자동 복구
allowEmpty: false # 빈 매니페스트 허용 안함
syncOptions:
- CreateNamespace=true
- PrunePropagationPolicy=foreground
- PruneLast=true
수동 승인
spec:
syncPolicy:
automated: null # 자동 동기화 비활성화
# 수동 동기화
argocd app sync my-app
# 동기화 (특정 리소스)
argocd app sync my-app --resource apps:Deployment:my-app
🛡️ 보안
RBAC
apiVersion: argoproj.io/v1alpha1
kind: AppProject
metadata:
name: production
namespace: argocd
spec:
description: Production project
sourceRepos:
- https://github.com/myorg/production.git
destinations:
- namespace: production
server: https://kubernetes.default.svc
clusterResourceWhitelist:
- group: ''
kind: Namespace
namespaceResourceBlacklist:
- group: ''
kind: ResourceQuota
roles:
- name: developer
description: Developer access
policies:
- p, proj:production:developer, applications, get, production/*, allow
- p, proj:production:developer, applications, sync, production/*, allow
groups:
- github:developers
📋 체크리스트
- GitOps 원칙 이해
- 저장소 구조 설계
- ArgoCD/Flux 설치
- Application 정의
- 자동 동기화 설정
- RBAC 구성
- 드리프트 감지
- 롤백 전략
- 모니터링 설정
- 알림 설정
🔗 관련 노트
- 03-09-GitOps-ArgoCD — ArgoCD 상세
- 01-01-CI-CD-개념 — CI/CD 개념
- 01-02-버전관리-Git — Git
마지막 업데이트: 2026-06-01