KR_CS_GitOps - somaz94/DevOps-Engineer GitHub Wiki

Q7: GitOps κ°œλ…κ³Ό ArgoCD ν™œμš©

질문: GitOps의 핡심 원칙과 λ™μž‘ 방식을 μ„€λͺ…ν•˜κ³ , ArgoCDλ₯Ό μ‚¬μš©ν•œ Kubernetes 배포 μžλ™ν™” 과정을 μ„€λͺ…ν•˜μ„Έμš”. Declarative 방식과 Reconciliation Loop의 역할을 μ€‘μ‹¬μœΌλ‘œ μ„€λͺ…ν•˜μ„Έμš”.


μ£Όμš” μš©μ–΄

μš©μ–΄ μ„€λͺ…
GitOps Git을 단일 μ§„μ‹€ κ³΅κΈ‰μ›μœΌλ‘œ μ‚¬μš©ν•˜λŠ” 운영 방식
Declarative μ‹œμŠ€ν…œμ˜ μ›ν•˜λŠ” μƒνƒœλ₯Ό μ„ μ–Έν•˜λŠ” 방식 (What)
Imperative μ‹œμŠ€ν…œμ— μˆ˜ν–‰ν•  λͺ…령을 μ§€μ‹œν•˜λŠ” 방식 (How)
Reconciliation μ„ μ–Έλœ μƒνƒœμ™€ μ‹€μ œ μƒνƒœλ₯Ό μΌμΉ˜μ‹œν‚€λŠ” ν”„λ‘œμ„ΈμŠ€
ArgoCD Kubernetes용 GitOps CD 도ꡬ
Flux CNCF Graduated GitOps 도ꡬ
Sync Git μƒνƒœμ™€ ν΄λŸ¬μŠ€ν„° μƒνƒœλ₯Ό λ™κΈ°ν™”ν•˜λŠ” μž‘μ—…
Self-heal μˆ˜λ™ 변경을 κ°μ§€ν•˜μ—¬ Git μƒνƒœλ‘œ μžλ™ 볡ꡬ

GitOps 4κ°€μ§€ 핡심 원칙

원칙 μ„€λͺ…
Declarative μ‹œμŠ€ν…œμ˜ μ›ν•˜λŠ” μƒνƒœλ₯Ό μ„ μ–Έμ μœΌλ‘œ μ •μ˜
Versioned & Immutable Git을 ν†΅ν•œ λͺ¨λ“  λ³€κ²½ 이λ ₯ 좔적 및 λ‘€λ°± κ°€λŠ₯
Pulled Automatically Git μ €μž₯μ†Œλ₯Ό μ§€μ†μ μœΌλ‘œ λͺ¨λ‹ˆν„°λ§ν•˜μ—¬ λ³€κ²½ 감지 μ‹œ μžλ™ 배포
Continuously Reconciled μ‹€μ œ μƒνƒœμ™€ μ„ μ–Έ μƒνƒœ 비ꡐ ν›„ μžλ™ μˆ˜μ •

전톡적 CI/CD vs GitOps

전톡적 CI/CD:
Git Commit β†’ CI Build β†’ kubectl apply β†’ Kubernetes
문제: kubectl κΆŒν•œ ν•„μš”, μ‹€μ œ μƒνƒœμ™€ Git 뢈일치 κ°€λŠ₯

GitOps (ArgoCD):
Git Commit β†’ CI Build β†’ Container Registry
     ↓
Git Manifest μ €μž₯μ†Œ ← ArgoCD 폴링 β†’ Kubernetes μžλ™ Sync
μž₯점: Git κΆŒν•œλ§Œ ν•„μš”, 항상 Git = μ‹€μ œ μƒνƒœ

Reconciliation Loop λ™μž‘ 원리

1. Observe  β†’ Gitμ—μ„œ Desired State 확인 (replicas: 3)
     ↓
2. Diff     β†’ Kubernetesμ—μ„œ Actual State 확인 (Running: 2)
             Desired β‰  Actual β†’ Out of Sync
     ↓
3. Act      β†’ kubectl apply μ‹€ν–‰, Pod 1개 μΆ”κ°€
     ↓
4. Verify   β†’ μƒνƒœ μž¬ν™•μΈ (Running: 3) β†’ Synced
     ↓
     λ‹€μ‹œ 1번으둜 반볡 (κΈ°λ³Έ 3λΆ„λ§ˆλ‹€)

ArgoCD Application μ •μ˜

apiVersion: argoproj.io/v1alpha1
kind: Application
metadata:
  name: my-app
  namespace: argocd
spec:
  source:
    repoURL: https://github.com/example/my-app.git
    targetRevision: main
    path: k8s/overlays/production
  destination:
    server: https://kubernetes.default.svc
    namespace: production
  syncPolicy:
    automated:
      prune: true       # Gitμ—μ„œ μ‚­μ œλœ λ¦¬μ†ŒμŠ€ μžλ™ 제거
      selfHeal: true    # μˆ˜λ™ λ³€κ²½ μžλ™ 볡ꡬ
    syncOptions:
    - CreateNamespace=true
    retry:
      limit: 5
      backoff:
        duration: 5s
        factor: 2
        maxDuration: 3m

배포 μ‹œλ‚˜λ¦¬μ˜€ (이미지 μ—…λ°μ΄νŠΈ)

# 1. Git에 이미지 νƒœκ·Έ λ³€κ²½ 컀밋
git commit -m "Update app to v2.0.0"
git push origin main

# 2. ArgoCDκ°€ λ³€κ²½ 감지 (폴링 λ˜λŠ” Webhook)
# 3. Diff 확인
argocd app diff my-app

# 4. Auto Sync λ˜λŠ” μˆ˜λ™ Sync
argocd app sync my-app

# 5. λ‘€λ°± (ν•„μš” μ‹œ Git revert β†’ ArgoCD μžλ™ 볡ꡬ)
git revert HEAD && git push origin main

ν™˜κ²½λ³„ 관리 (Kustomize)

my-app/
β”œβ”€β”€ base/
β”‚   β”œβ”€β”€ deployment.yaml
β”‚   └── service.yaml
└── overlays/
    β”œβ”€β”€ dev/        # replicas: 1
    β”œβ”€β”€ staging/    # replicas: 2
    └── production/ # replicas: 5 + HPA

각 ν™˜κ²½λ§ˆλ‹€ 별도 ArgoCD Application으둜 관리.


ArgoCD vs Flux 비ꡐ

νŠΉμ§• ArgoCD Flux
UI κ°•λ ₯ν•œ Web UI 제곡 CLI 쀑심
Sync 방식 Pull (κΈ°λ³Έ 3λΆ„) Push + Pull
Helm 지원 Native 지원 Helm Controller
Image μžλ™ μ—…λ°μ΄νŠΈ Image Updater (별도) λ‚΄μž₯ (Image Automation)
CNCF μƒνƒœ Incubating Graduated

GitOps μž₯점 μš”μ•½

ν•­λͺ© λ‚΄μš©
λ³΄μ•ˆ Kubernetes 직접 μ ‘κ·Ό λΆˆν•„μš”, Git κΆŒν•œμœΌλ‘œλ§Œ ν†΅μ œ
μ‹ λ’°μ„± 선언적 μƒνƒœ 일관성 보μž₯, Self-healing, μ‰¬μš΄ λ‘€λ°±
κ°€μ‹œμ„± Web UI 전체 μƒνƒœ 확인, Diff 미리보기, Health λͺ¨λ‹ˆν„°λ§
ν˜‘μ—… Git 기반 μ½”λ“œ 리뷰, PR둜 배포 승인, λ³€κ²½ 이λ ₯ μžλ™ 좔적

μ°Έκ³ 

⚠️ **GitHub.com Fallback** ⚠️