πΉ Argo CDμμ μ ν리μΌμ΄μ (Application)μ΄λ?
Argo CDμμ **μ ν리μΌμ΄μ (Application)**μ Kubernetes ν΄λ¬μ€ν°μμ κ΄λ¦¬λλ λͺ¨λ 리μμ€μ μ§ν©μ μλ―Έν©λλ€.
μ¦, Argo CDλ Git μ μ₯μμ μ μλ μ ν리μΌμ΄μ μ μ μΈμ 맀λνμ€νΈλ₯Ό μ½κ³ ,
μ΄λ₯Ό Kubernetes ν΄λ¬μ€ν°μ λ°°ν¬νκ³ λκΈ°ν(Sync)νλ μν μ ν©λλ€.
β Argo CD μ ν리μΌμ΄μ μ νΉμ§
β GitOps μμΉ κΈ°λ° → Git μ μ₯μμ μ μλ μνλ₯Ό Kubernetesμ μλ λ°μ
β μ μΈμ (Declarative) λ°©μ → YAML νμΌμ μ¬μ©νμ¬ μ μ
β μλνλ λκΈ°ν → Git μν λ³κ²½ μ μλ μ λ°μ΄νΈ κ°λ₯
β 리μμ€ λͺ¨λν°λ§ → Kubernetes 리μμ€μ μνλ₯Ό μ§μμ μΌλ‘ κ°μ
πΉ Argo CD μ ν리μΌμ΄μ μ μ£Όμ κ°λ
β 1. μ ν리μΌμ΄μ (Application) CRD
Argo CDμμ μ ν리μΌμ΄μ μ Kubernetesμ **Custom Resource Definition(CRD)**λ‘ κ΄λ¦¬λ©λλ€.
μ¦, Applicationμ΄λΌλ Kubernetes 리μμ€λ‘ λ±λ‘λλ©°, μ΄λ₯Ό ν΅ν΄ Argo CDκ° λ¦¬μμ€λ₯Ό κ°μνκ³ κ΄λ¦¬ν©λλ€.
β 2. νλ‘μ νΈ(Project) κΈ°λ° μ ν리μΌμ΄μ κ΄λ¦¬
Argo CDλ μ¬λ¬ μ ν리μΌμ΄μ μ “νλ‘μ νΈ(Project)” λ¨μλ‘ κ·Έλ£Ήννμ¬ κ΄λ¦¬ν μ μμ΅λλ€.
μ΄λ₯Ό ν΅ν΄ **RBAC(Role-Based Access Control)**μ μ μ©νκ±°λ, νΉμ λ€μμ€νμ΄μ€μ λ°°ν¬λλ μ ν리μΌμ΄μ μ μ μ΄ν μ μμ΅λλ€.
β 3. μ ν리μΌμ΄μ λκΈ°ν(Sync) λ° μν λͺ¨λν°λ§
Argo CDλ μ ν리μΌμ΄μ μ΄ Git μνμ μΌμΉνλμ§ μ§μμ μΌλ‘ κ°μνλ©°,
OutOfSync μν λ°μ μ μλ λλ μλμΌλ‘ λκΈ°ν μμ μ μνν©λλ€.
πΉ Argo CD μ ν리μΌμ΄μ 맀λνμ€νΈ(YAML) μμ
μλλ Argo CDμμ μ ν리μΌμ΄μ μ μ μνλ YAML μμ μ λλ€.
apiVersion: argoproj.io/v1alpha1 # Argo CDμ API λ²μ μ§μ
kind: Application # Argo CDμμ κ΄λ¦¬νλ μ ν리μΌμ΄μ
리μμ€
metadata:
name: example-app # μ ν리μΌμ΄μ
μ΄λ¦
namespace: argocd # Argo CD λ€μμ€νμ΄μ€
spec:
project: default # Argo CDμμ κ΄λ¦¬νλ νλ‘μ νΈ μ΄λ¦
source:
repoURL: https://github.com/example/repo.git # μ ν리μΌμ΄μ
μ Git μ μ₯μ URL
targetRevision: HEAD # μ΅μ λ²μ μ μ¬μ©
path: manifests # μ ν리μΌμ΄μ
맀λνμ€νΈκ° μμΉν λλ ν°λ¦¬
destination:
server: https://kubernetes.default.svc # Kubernetes API μλ² μ£Όμ
namespace: example-app # λ°°ν¬ν λ€μμ€νμ΄μ€
syncPolicy:
automated:
prune: true # Git μνμ λ€λ₯Ό κ²½μ° λΆνμν 리μμ€ μλ μμ
selfHeal: true # Kubernetes 리μμ€κ° λ³κ²½λμμ κ²½μ° μλ μνλ‘ μλ 볡ꡬ
β μ€λͺ
• repoURL → Git μ μ₯μμ URL
• targetRevision → μ μ©ν Git λΈλμΉ λλ νκ·Έ
• path → Git μ μ₯μ λ΄μ 맀λνμ€νΈ νμΌμ΄ μμΉν λλ ν°λ¦¬
• destination → λ°°ν¬λ Kubernetes ν΄λ¬μ€ν° λ° λ€μμ€νμ΄μ€
• syncPolicy → μ ν리μΌμ΄μ μ μλ λκΈ°ννλ μ€μ
πΉ μ ν리μΌμ΄μ λκΈ°ν(Sync) λ° λ°°ν¬ μ리
Argo CDλ GitOps μμΉμ λ°λΌ Git μ μ₯μμ μ μ₯λ μ ν리μΌμ΄μ μ μ μΈμ μνμ Kubernetes ν΄λ¬μ€ν°μ μ€μ μνλ₯Ό λΉκ΅νμ¬ λκΈ°νν©λλ€.
β 1. λκΈ°ν μν(Sync Status)
Sync μν | μ€λͺ |
Synced | μ ν리μΌμ΄μ μ΄ Git μνμ λμΌ |
OutOfSync | μ ν리μΌμ΄μ μ΄ Git μνμ λΆμΌμΉ |
Unknown | μ ν리μΌμ΄μ μνλ₯Ό νμΈν μ μμ |
β 2. μλ λκΈ°ν(Automated Sync) μ€μ
Argo CDλ syncPolicy μ€μ μ ν΅ν΄ μλμΌλ‘ μ ν리μΌμ΄μ μ λκΈ°νν μ μμ΅λλ€.
syncPolicy:
automated:
prune: true # λΆνμν 리μμ€ μλ μμ
selfHeal: true # Kubernetes 리μμ€κ° μλ λ³κ²½λμμ κ²½μ° μλ 볡ꡬ
β prune: true → Gitμμ μμ λ 리μμ€λ Kubernetesμμλ μμ λ¨
β selfHeal: true → Kubernetes 리μμ€κ° λ³κ²½λλ©΄ Git μνλ‘ μλ 볡ꡬ
πΉ Argo CD μ ν리μΌμ΄μ CLI λͺ λ Ήμ΄
β 1. μ ν리μΌμ΄μ λͺ©λ‘ μ‘°ν
argocd app list
β 2. μ ν리μΌμ΄μ μμΈ μ 보 νμΈ
argocd app get example-app
β 3. μ ν리μΌμ΄μ λκΈ°ν(Sync)
argocd app sync example-app
β 4. μ ν리μΌμ΄μ λ‘€λ°±(Rollback)
argocd app rollback example-app 2
πΉ μ ν리μΌμ΄μ λ‘€λ°± μ μ΄μ λ²μ νμΈ λ°©λ²
Argo CDμμ μ ν리μΌμ΄μ μ λ‘€λ°±ν λ **λ²μ λ²νΈ(μ: 2)**λ ν΄λΉ μ ν리μΌμ΄μ μ λ°°ν¬ μ΄λ ₯μ μ‘°ννμ¬ νμΈν μ μμ΅λλ€.
β μ ν리μΌμ΄μ μ λ°°ν¬ μ΄λ ₯(Revision) νμΈ
argocd app history example-app
π‘ μμ μΆλ ₯ κ°
ID DATE COMMIT SYNC STATUS HEALTH STATUS PARAMETERS
1 2025-03-10 12:00:00 UTC a1b2c3d Synced Healthy replicas=3
2 2025-03-12 15:30:00 UTC d4e5f6g OutOfSync Degraded replicas=2
3 2025-03-15 10:45:00 UTC h7i8j9k Synced Healthy replicas=3
β λ‘€λ°±ν λ²μ μ ν
μμ λ°°ν¬ μ΄λ ₯μμ IDκ° 2μΈ κ²½μ°, μ΄λ₯Ό λ‘€λ°±νλ €λ©΄ λ€μ λͺ λ Ήμ΄λ₯Ό μ€ννλ©΄ λ©λλ€.
argocd app rollback example-app 2
π‘ μμ μΆλ ₯ κ°
Rolled back 'example-app' to revision 2.
β μ 리
• λ°°ν¬ μ΄λ ₯ μ‘°ν: argocd app history <APP_NAME>
• λ‘€λ°±ν λ²μ νμΈ: ID κ° νμΈ
• νΉμ λ²μ μΌλ‘ λ‘€λ°±: argocd app rollback <APP_NAME> <ID>