Kubernetes Tools/ArgoCD

[Ep.24] [Argo CD μ„±λŠ₯ μ΅œμ ν™” #1] Argo CD μ• ν”Œλ¦¬μΌ€μ΄μ…˜ 동기화 μ΅œμ ν™” μ „λž΅

ygtoken 2025. 3. 17. 13:10
728x90

 

πŸ”Ή μ• ν”Œλ¦¬μΌ€μ΄μ…˜ 동기화(Synchronization)λž€?

Argo CDμ—μ„œ μ• ν”Œλ¦¬μΌ€μ΄μ…˜ 동기화(Synchronization) λŠ” Git μ €μž₯μ†Œμ˜ 선언적 μƒνƒœμ™€ Kubernetes ν΄λŸ¬μŠ€ν„°μ˜ μ‹€μ œ μƒνƒœλ₯Ό μΌμΉ˜μ‹œν‚€λŠ” κ³Όμ •μž…λ‹ˆλ‹€.
즉, Git에 μ •μ˜λœ λ§€λ‹ˆνŽ˜μŠ€νŠΈλ₯Ό Kubernetes에 μ μš©ν•˜μ—¬ GitOps 원칙을 μœ μ§€ν•˜λŠ” 핡심 κΈ°λŠ₯μž…λ‹ˆλ‹€.

βœ… Argo CD λ™κΈ°ν™”μ˜ μ£Όμš” κΈ°λŠ₯
βœ” Git의 λ³€κ²½ 사항을 κ°μ§€ν•˜κ³  μžλ™ 반영
βœ” Kubernetes λ¦¬μ†ŒμŠ€μ˜ μ‹€μ œ μƒνƒœμ™€ μ›ν•˜λŠ” μƒνƒœλ₯Ό 비ꡐ
βœ” 변경이 λ°œμƒν•˜λ©΄ μžλ™ λ˜λŠ” μˆ˜λ™μœΌλ‘œ 동기화 μ‹€ν–‰ κ°€λŠ₯
βœ” Self-Healing을 톡해 μ˜λ„ν•˜μ§€ μ•Šμ€ λ³€κ²½ 사항 μžλ™ 볡ꡬ κ°€λŠ₯


πŸ”Ή Argo CD 동기화 μ΅œμ ν™”κ°€ ν•„μš”ν•œ 이유

βœ… λΉ λ₯΄κ³  μ•ˆμ •μ μΈ 배포λ₯Ό μœ„ν•΄
βœ” λΆˆν•„μš”ν•œ λ¦¬μ†ŒμŠ€ μ—…λ°μ΄νŠΈ λ°©μ§€
βœ” 동기화 속도 μ΅œμ ν™”λ‘œ 배포 μ‹œκ°„μ„ 단좕

βœ… 운영 λΉ„μš© μ ˆκ°μ„ μœ„ν•΄
βœ” λΆˆν•„μš”ν•œ API 호좜 κ°μ†Œ → Kubernetes API μ„œλ²„ λΆ€λ‹΄ κ°μ†Œ
βœ” CI/CD νŒŒμ΄ν”„λΌμΈκ³Όμ˜ 연계λ₯Ό μ΅œμ ν™”ν•˜μ—¬ λ¦¬μ†ŒμŠ€ νš¨μœ¨μ„± ν–₯상

βœ… 배포 μ•ˆμ •μ„±μ„ 높이기 μœ„ν•΄
βœ” 동기화 μΆ©λŒμ„ μ΅œμ†Œν™”ν•˜κ³  예츑 κ°€λŠ₯ν•œ 배포 μˆ˜ν–‰
βœ” Canary 및 Blue-Green 배포와 ν•¨κ»˜ 졜적의 동기화 μ „λž΅ 적용


πŸ”Ή 1. 동기화 μ •μ±…(Sync Policy) μ΅œμ ν™”

Argo CD의 동기화 정책은 μžλ™(Automated) κ³Ό μˆ˜λ™(Manual) 두 κ°€μ§€ λ°©μ‹μœΌλ‘œ μ„€μ •ν•  수 μžˆμŠ΅λ‹ˆλ‹€.
μ΅œμ ν™”λœ 섀정을 톡해 배포λ₯Ό 더 효과적으둜 관리할 수 μžˆμŠ΅λ‹ˆλ‹€.

βœ… μžλ™ 동기화 ν™œμ„±ν™” (μžλ™ν™” 배포)

syncPolicy:
  automated:
    prune: true  # λΆˆν•„μš”ν•œ λ¦¬μ†ŒμŠ€λ₯Ό μžλ™ 정리
    selfHeal: true  # Kubernetes μƒνƒœκ°€ λ³€κ²½λ˜μ—ˆμ„ 경우 μžλ™ 볡ꡬ
  syncOptions:
    - CreateNamespace=true  # λ„€μž„μŠ€νŽ˜μ΄μŠ€κ°€ μ—†μœΌλ©΄ μžλ™ 생성
    - PrunePropagationPolicy=foreground  # 쒅속 λ¦¬μ†ŒμŠ€ μ‚­μ œ μ •μ±… μ„€μ •
    - PruneLast=true  # 쒅속 λ¦¬μ†ŒμŠ€λ₯Ό λ§ˆμ§€λ§‰μ— μ‚­μ œ

βœ… μ„€λͺ…:
βœ” prune: true → Gitμ—μ„œ 제거된 λ¦¬μ†ŒμŠ€λ₯Ό Kubernetesμ—μ„œλ„ μžλ™ μ‚­μ œ
βœ” selfHeal: true → Kubernetesμ—μ„œ λ³€κ²½λœ λ¦¬μ†ŒμŠ€λ₯Ό Git μƒνƒœλ‘œ μžλ™ 볡ꡬ
βœ” CreateNamespace=true → λ„€μž„μŠ€νŽ˜μ΄μŠ€κ°€ 없을 경우 μžλ™ 생성
βœ” PrunePropagationPolicy=foreground → λ¦¬μ†ŒμŠ€κ°€ κ³„μΈ΅μ μœΌλ‘œ μ‚­μ œλ˜λ„λ‘ μ„€μ •
βœ” PruneLast=true → μ΅œμƒμœ„ λ¦¬μ†ŒμŠ€λ₯Ό κ°€μž₯ λ§ˆμ§€λ§‰μ— μ‚­μ œ

βœ… 적용 방법:

kubectl apply -f argocd-app.yaml
argocd app sync my-app

βœ… μˆ˜λ™ 동기화 μ„€μ • (운영 ν™˜κ²½μ—μ„œ μ•ˆμ „ν•˜κ²Œ 배포)

운영 ν™˜κ²½μ—μ„œλŠ” μˆ˜λ™ 승인 ν›„ 배포가 μ§„ν–‰λ˜λ„λ‘ μ„€μ •ν•  μˆ˜λ„ μžˆμŠ΅λ‹ˆλ‹€.

syncPolicy:
  automated: {}  # μžλ™ 동기화 λΉ„ν™œμ„±ν™”
  syncOptions:
    - ApplyOutOfSyncOnly=true  # λ³€κ²½λœ λ¦¬μ†ŒμŠ€λ§Œ 동기화

βœ… μ„€λͺ…:
βœ” automated: {} → μžλ™ 동기화 λΉ„ν™œμ„±ν™”
βœ” ApplyOutOfSyncOnly=true → λ³€κ²½λœ λ¦¬μ†ŒμŠ€λ§Œ 동기화

βœ… 동기화 μˆ˜λ™ μ‹€ν–‰:

argocd app sync my-app

πŸ”Ή 2. 동기화 μ›¨μ΄λΈŒ(Sync Waves) 및 ν›…(Hooks) ν™œμš©

βœ… 동기화 μ›¨μ΄λΈŒ(Sync Waves)
동기화 μˆœμ„œλ₯Ό μ œμ–΄ν•˜μ—¬ μ˜μ‘΄μ„±μ΄ μžˆλŠ” λ¦¬μ†ŒμŠ€λ₯Ό 순차적으둜 배포할 수 μžˆμŠ΅λ‹ˆλ‹€.
예λ₯Ό λ“€μ–΄, ConfigMap을 λ¨Όμ € μƒμ„±ν•œ ν›„ Deploymentλ₯Ό λ°°ν¬ν•˜λ„λ‘ μ„€μ •ν•  수 μžˆμŠ΅λ‹ˆλ‹€.

metadata:
  annotations:
    argocd.argoproj.io/sync-wave: "1"  # λ¨Όμ € 싀행됨

βœ… 예제: ConfigMap → Deployment → Service 순으둜 배포

# ConfigMap (Sync Wave 1)
apiVersion: v1
kind: ConfigMap
metadata:
  name: app-config
  namespace: my-namespace
  annotations:
    argocd.argoproj.io/sync-wave: "1"
data:
  ENV: "production"
---
# Deployment (Sync Wave 2)
apiVersion: apps/v1
kind: Deployment
metadata:
  name: my-app
  namespace: my-namespace
  annotations:
    argocd.argoproj.io/sync-wave: "2"
spec:
  replicas: 2
  template:
    spec:
      containers:
        - name: my-app
          image: my-image:latest
---
# Service (Sync Wave 3)
apiVersion: v1
kind: Service
metadata:
  name: my-app-service
  namespace: my-namespace
  annotations:
    argocd.argoproj.io/sync-wave: "3"
spec:
  selector:
    app: my-app

βœ… μ„€λͺ…:
βœ” sync-wave: "1" → ConfigMap을 λ¨Όμ € 배포
βœ” sync-wave: "2" → Deploymentλ₯Ό ConfigMap 배포 ν›„ μ‹€ν–‰
βœ” sync-wave: "3" → Serviceλ₯Ό λ§ˆμ§€λ§‰μ— 배포

βœ… 동기화 μ‹€ν–‰:

argocd app sync my-app

βœ… 동기화 ν›…(Sync Hooks) ν™œμš©
νŠΉμ • λ¦¬μ†ŒμŠ€λ₯Ό λ°°ν¬ν•˜κΈ° 전후에 PreSync, Sync, PostSync 훅을 μ‹€ν–‰ν•  수 μžˆμŠ΅λ‹ˆλ‹€.

apiVersion: batch/v1
kind: Job
metadata:
  name: pre-sync-job
  namespace: my-namespace
  annotations:
    argocd.argoproj.io/hook: PreSync  # 동기화 전에 μ‹€ν–‰
spec:
  template:
    spec:
      containers:
        - name: init
          image: busybox
          command: ["sh", "-c", "echo 'Running pre-sync job'"]
      restartPolicy: Never

βœ… ν›… μ’…λ₯˜:
βœ” PreSync → 동기화 전에 μ‹€ν–‰ (DB λ§ˆμ΄κ·Έλ ˆμ΄μ…˜ λ“±)
βœ” Sync → 동기화 κ³Όμ •μ—μ„œ μ‹€ν–‰
βœ” PostSync → 동기화 ν›„ μ‹€ν–‰ (μ•Œλ¦Ό 전솑 λ“±)


πŸ”Ή 3. μ• ν”Œλ¦¬μΌ€μ΄μ…˜ 동기화 νŠΈλŸ¬λΈ”μŠˆνŒ…

βœ… 1️⃣ 동기화 μƒνƒœ 확인

argocd app get my-app

βœ… 좜λ ₯ μ˜ˆμ‹œ:

Name:               my-app
Project:            default
Sync Status:        OutOfSync  (1 missing, 1 modified)
Health Status:      Healthy

βœ… 2️⃣ νŠΉμ • λ¦¬μ†ŒμŠ€λ§Œ 동기화

argocd app sync my-app --resource deployment/my-app

βœ… 3️⃣ μžλ™ 동기화 ν™œμ„±ν™” μ—¬λΆ€ 확인

argocd app get my-app | grep Automated

βœ… μžλ™ 동기화가 κΊΌμ Έ 있으면 λ‹€μŒ λͺ…λ Ήμ–΄λ‘œ ν™œμ„±ν™”:

argocd app set my-app --sync-policy automated

πŸ”Ή κ²°λ‘ : 이번 κΈ€μ—μ„œ 배운 핡심 λ‚΄μš© 정리

🟒 Argo CD의 λ™κΈ°ν™”λŠ” Git μƒνƒœμ™€ Kubernetes μƒνƒœλ₯Ό μΌμΉ˜μ‹œν‚€λŠ” μ€‘μš”ν•œ κ³Όμ •
🟒 μžλ™ 동기화(Automated Sync)λ₯Ό μ‚¬μš©ν•˜λ©΄ GitOps 원칙을 μœ μ§€ν•˜λ©΄μ„œ λΉ λ₯Έ 배포 κ°€λŠ₯
🟒 Sync Wave 및 Sync Hooksλ₯Ό ν™œμš©ν•˜λ©΄ 배포 μˆœμ„œλ₯Ό μ„Έλ°€ν•˜κ²Œ μ‘°μ • κ°€λŠ₯
🟒 νŠΈλŸ¬λΈ”μŠˆνŒ…μ„ μœ„ν•΄ Argo CD의 동기화 μƒνƒœλ₯Ό ν™•μΈν•˜κ³  νŠΉμ • λ¦¬μ†ŒμŠ€λ§Œ κ°œλ³„ 동기화 κ°€λŠ₯


μΆ”μ²œ νƒœκ·Έ
μΏ λ²„λ„€ν‹°μŠ€, kubernetes, k8s, gitops, argocd, devops, ci/cd, sync, deployment

이제 **"[Ep.25] [GitOps와 Argo CD의 기초 #25] Argo CDμ—μ„œ Helm μ°¨νŠΈμ™€ Kustomize μ΅œμ ν™”"**λ₯Ό μ€€λΉ„ν•˜κ² μŠ΅λ‹ˆλ‹€. 😊

728x90