πΉ μ ν리μΌμ΄μ λκΈ°ν(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 μ΅μ ν"**λ₯Ό μ€λΉνκ² μ΅λλ€. π