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가지 원칙:

  1. 선언적 시스템: 원하는 상태를 선언적으로 정의
  2. 버전 관리: 모든 설정을 Git으로 관리
  3. 자동 적용: Git 상태를 자동으로 클러스터에 적용
  4. 드리프트 감지: 수동 변경 감지 및 복구

🔄 GitOps vs 전통적 CD

비교

특징전통적 CDGitOps
트리거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