๐Ÿš€ Git Push ํ•˜๋‚˜๋กœ ๋ฐฐํฌ ์™„์„ฑ – ArgoCD GitOps ํŒŒ์ดํ”„๋ผ์ธ ๊ตฌ์ถ•๊ธฐ

“๋ฐฐํฌ๋ฅผ ์ž๋™ํ™”ํ•œ๋‹ค”๋Š” ๋ง์€ ๋“ค์–ด๋ดค๋Š”๋ฐ, ์‹ค์ œ๋กœ ์–ด๋–ป๊ฒŒ ์ž‘๋™ํ•˜๋Š” ๊ฑธ๊นŒ์š”? ์ฝ”๋“œ๋ฅผ ์ˆ˜์ •ํ•˜๊ณ  Git์— ์˜ฌ๋ฆฌ๋ฉด ์„œ๋ฒ„์— ์ž๋™์œผ๋กœ ๋ฐ˜์˜๋˜๋Š” ๊ทธ ๋งˆ๋ฒ•. ๊ทธ๋ฆฌ๊ณ  ๋ˆ„๊ตฐ๊ฐ€ ์„œ๋ฒ„๋ฅผ ์‹ค์ˆ˜๋กœ ๊ฑด๋“œ๋ฆฌ๋ฉด ์ž๋™์œผ๋กœ ๋˜๋Œ์•„์˜ค๋Š” ์ž๊ฐ€์น˜์œ . ์ด๋ฒˆ ์‹ค์Šต์€ ArgoCD๋กœ ์ด ๋‘ ๊ฐ€์ง€๋ฅผ ์ง์ ‘ ๊ตฌํ˜„ํ•ด๋ณธ ๊ธฐ๋ก์ž…๋‹ˆ๋‹ค.


๐Ÿค” ArgoCD๋ฅผ ์™œ ์“ฐ๋Š”๊ฐ€ โ€” Push vs Pull

๊ธฐ์กด CI/CD ๋„๊ตฌ(Jenkins ๋“ฑ)๋Š” Push ๋ชจ๋ธ์ž…๋‹ˆ๋‹ค. ์™ธ๋ถ€์—์„œ ํด๋Ÿฌ์Šคํ„ฐ์— ์ ‘๊ทผ ๊ถŒํ•œ์„ ๊ฐ€์ง€๊ณ  ๋“ค์–ด์™€์„œ ๋ฐฐํฌํ•ฉ๋‹ˆ๋‹ค. ์„œ๋ฒ„ ์—ด์‡ ๋ฅผ ์™ธ๋ถ€์— ์ค˜์•ผ ํ•˜๋Š” ๊ตฌ์กฐ์ฃ .

ArgoCD๋Š” Pull ๋ชจ๋ธ์ž…๋‹ˆ๋‹ค. ArgoCD๊ฐ€ ํด๋Ÿฌ์Šคํ„ฐ ์•ˆ์— ์‚ด๋ฉด์„œ Git์„ ๊ฐ์‹œํ•ฉ๋‹ˆ๋‹ค. Git์— ๋ณ€๊ฒฝ์ด ์ƒ๊ธฐ๋ฉด ์Šค์Šค๋กœ ๊ฐ€์ ธ์™€์„œ ์ ์šฉํ•ฉ๋‹ˆ๋‹ค.

[๊ธฐ์กด Push ๋ฐฉ์‹]
Jenkins โ†’ (ํด๋Ÿฌ์Šคํ„ฐ ์ ‘๊ทผ ๊ถŒํ•œ ํ•„์š”) โ†’ Kubernetes Cluster

[ArgoCD Pull ๋ฐฉ์‹]
Git Repository โ† ArgoCD (ํด๋Ÿฌ์Šคํ„ฐ ๋‚ด๋ถ€์—์„œ ๊ฐ์‹œ) โ†’ ์ž๋™ ๋ฐฐํฌ

๋ณด์•ˆ ๊ด€์ ์—์„œ Pull์ด ์œ ๋ฆฌํ•œ ์ด์œ : ์™ธ๋ถ€์—์„œ ๋“ค์–ด์˜ค๋Š” ๊ฒŒ ์•„๋‹ˆ๋ผ ๋‚ด๋ถ€์—์„œ ๋‚˜๊ฐ€๋Š” ๊ตฌ์กฐ์ด๋ฏ€๋กœ, ํด๋Ÿฌ์Šคํ„ฐ ์ธ์ฆ ์ •๋ณด๋ฅผ ์™ธ๋ถ€์— ์ค„ ํ•„์š”๊ฐ€ ์—†์Šต๋‹ˆ๋‹ค.


๐Ÿ› ๏ธ Step 1 โ€” ArgoCD ์„ค์น˜

# ArgoCD๊ฐ€ ์‚ด ๋„ค์ž„์ŠคํŽ˜์ด์Šค ์ƒ์„ฑ
kubectl create namespace argocd

# ๊ณต์‹ ๋งค๋‹ˆํŽ˜์ŠคํŠธ๋กœ ์„ค์น˜ (๋ชจ๋“  ๋ฆฌ์†Œ์Šค๊ฐ€ ํ•œ ๋ฒˆ์—)
kubectl apply -n argocd -f \
  https://raw.githubusercontent.com/argoproj/argo-cd/stable/manifests/install.yaml

# ๋ชจ๋“  ํŒŒ๋“œ๊ฐ€ Running์ด ๋  ๋•Œ๊นŒ์ง€ ๋Œ€๊ธฐ
kubectl get pods -n argocd -w

์™ธ๋ถ€ ์ ‘์† ์„ค์ • (NodePort)

# ArgoCD UI์— ์™ธ๋ถ€์—์„œ ์ ‘์†ํ•  ์ˆ˜ ์žˆ๋„๋ก NodePort๋กœ ๋ณ€๊ฒฝ
kubectl patch svc argocd-server -n argocd \
  -p '{"spec": {"type": "NodePort"}}'

# ํ• ๋‹น๋œ ํฌํŠธ ํ™•์ธ
kubectl get svc argocd-server -n argocd
# PORT(S): 80:3xxxx/TCP, 443:3yyyy/TCP

์ดˆ๊ธฐ admin ๋น„๋ฐ€๋ฒˆํ˜ธ ํ™•์ธ

kubectl -n argocd get secret argocd-initial-admin-secret \
  -o jsonpath="{.data.password}" | base64 -d

๋ธŒ๋ผ์šฐ์ €์—์„œ https://192.168.56.10:3xxxx๋กœ ์ ‘์† โ†’ admin / (์œ„ ๋น„๋ฐ€๋ฒˆํ˜ธ)๋กœ ๋กœ๊ทธ์ธํ•ฉ๋‹ˆ๋‹ค.


๐Ÿ”— Step 2 โ€” GitOps ํŒŒ์ดํ”„๋ผ์ธ ์—ฐ๊ฒฐ

GitHub์— Helm Chart ์˜ฌ๋ฆฌ๊ธฐ

์ง€๋‚œ ์‹ค์Šต์—์„œ ๋งŒ๋“  mywebapp Helm Chart๋ฅผ GitHub์— ์˜ฌ๋ฆฝ๋‹ˆ๋‹ค.

cd ~
git init
git add mywebapp
git commit -m "Add mywebapp helm chart: v.init"
git branch -M main
git remote add origin https://github.com/<๋‚ด์•„์ด๋””>/helm-argocd-lab.git
git push -u origin main

ArgoCD Application ์ฃผ๋ฌธ์„œ ์ž‘์„ฑ

ArgoCD์—๊ฒŒ “์–ด๋””์„œ ๊ฐ€์ ธ์™€์„œ, ์–ด๋””์— ๋ฐฐํฌํ•ด”๋ฅผ ์•Œ๋ ค์ฃผ๋Š” YAML ํŒŒ์ผ์ž…๋‹ˆ๋‹ค.

# application.yaml
apiVersion: argoproj.io/v1alpha1
kind: Application
metadata:
  name: my-webapp
  namespace: argocd
spec:
  project: default

  # ์–ด๋””์„œ ๊ฐ€์ ธ์™€? (Source)
  source:
    repoURL: https://github.com/<๋‚ด์•„์ด๋””>/helm-argocd-lab.git
    targetRevision: main
    path: mywebapp           # Git ์ €์žฅ์†Œ ์•ˆ์˜ ํด๋”๋ช…

  # ์–ด๋””์— ๋ฐฐํฌํ•ด? (Destination)
  destination:
    server: https://kubernetes.default.svc
    namespace: default

  # ์–ด๋–ป๊ฒŒ ๊ด€๋ฆฌํ•ด? (Sync Policy)
  syncPolicy:
    automated:
      prune: true            # Git์—์„œ ํŒŒ์ผ ์ง€์šฐ๋ฉด ํด๋Ÿฌ์Šคํ„ฐ์—์„œ๋„ ์‚ญ์ œ
      selfHeal: true         # ํด๋Ÿฌ์Šคํ„ฐ ์ƒํƒœ๊ฐ€ Git๊ณผ ๋‹ฌ๋ผ์ง€๋ฉด ์ž๋™ ๋ณต๊ตฌ
kubectl apply -f application.yaml

ArgoCD ์›น UI๋ฅผ ๋ณด๋ฉด my-webapp ์นด๋“œ๊ฐ€ ์ƒ๊ธฐ๊ณ , ์ž ์‹œ ํ›„ Synced โœ… / Healthy ๐Ÿ’š ์ƒํƒœ๊ฐ€ ๋ฉ๋‹ˆ๋‹ค.


๐Ÿ”ฅ Step 3 โ€” GitOps ๋ฐฐํฌ ํ๋ฆ„ ํ™•์ธ

์ด์ œ ์‹ค์ œ GitOps๋ฅผ ์ฒดํ—˜ํ•ด๋ด…๋‹ˆ๋‹ค. kubectl edit ๋ช…๋ น์–ด๋ฅผ ์“ฐ์ง€ ์•Š๊ณ , Git ์ˆ˜์ •๋งŒ์œผ๋กœ ๋ฐฐํฌ๋ฅผ ๋ณ€๊ฒฝํ•ฉ๋‹ˆ๋‹ค.

ArgoCD ์›น UI์—์„œ Progressing (ํŒŒ๋ž€ ํšŒ์ „) ์ƒํƒœ๊ฐ€ ๋ณด์ด๋ฉด, ํŒŒ๋“œ ์ƒ์„ฑ ์ค‘์ธ ๊ฒ๋‹ˆ๋‹ค.

๋ฐฐํฌ๊ฐ€ ์™„๋ฃŒ๋˜๋ฉด ํŒŒ๋“œ, ์„œ๋น„์Šค, Replica Set์ด ์—ฐ๊ฒฐ๋œ ํ† ํด๋กœ์ง€ ๊ทธ๋ž˜ํ”„๊ฐ€ ๋ณด์ž…๋‹ˆ๋‹ค.


๐Ÿ›ก๏ธ Step 4 โ€” ์ž๊ฐ€ ์น˜์œ  (Self-Healing) ์‹คํ—˜

ArgoCD์˜ ๊ฐ€์žฅ ๊ฐ•๋ ฅํ•œ ๊ธฐ๋Šฅ์„ ํ…Œ์ŠคํŠธํ•ด๋ดค์Šต๋‹ˆ๋‹ค.

Git์—๋Š” ํŒŒ๋“œ 2๊ฐœ(replicaCount: 2)๋ผ๊ณ  ์ ํ˜€ ์žˆ์Šต๋‹ˆ๋‹ค. ๋ˆ„๊ตฐ๊ฐ€ ์‹ค์ˆ˜๋กœ ํŒŒ๋“œ๋ฅผ ์ „๋ถ€ ์ง€์›Œ๋ฒ„๋ ธ๋‹ค๊ณ  ๊ฐ€์ •ํ•ฉ๋‹ˆ๋‹ค.

# ํŒŒ๋“œ๋ฅผ ๊ฐ•์ œ๋กœ 0๊ฐœ๋กœ ์ถ•์†Œ (์‚ฌ๊ณ  ์‹œ๋ฎฌ๋ ˆ์ด์…˜)
kubectl scale deployment my-webapp-mywebapp --replicas=0

ArgoCD ์›น UI๋ฅผ ๋ณด๋ฉด:

  1. ์ˆœ๊ฐ„์ ์œผ๋กœ OutOfSync (๋…ธ๋ž€์ƒ‰) ํ‘œ์‹œ โ€” “์–ด? Git์ด๋ž‘ ๋‹ค๋ฅด๋„ค?”
  2. ์ฆ‰์‹œ ์ž๋™์œผ๋กœ ํŒŒ๋“œ ์žฌ์ƒ์„ฑ ์‹œ์ž‘
  3. ์ž ์‹œ ํ›„ ๋‹ค์‹œ ํŒŒ๋“œ 2๊ฐœ๊ฐ€ Running ์ƒํƒœ๋กœ ๋ณต๊ตฌ
# ํ™•์ธ
kubectl get pods
# my-webapp-xxx   Running   โ† ์‚ด์•„๋‚ฌ๋‹ค!
# my-webapp-yyy   Running

๐Ÿ’ก GitOps ๋กค๋ฐฑ์€ ๋ฒ„ํŠผ์ด ์•„๋‹ˆ๋ผ Git revert

ArgoCD ์›น UI์— ROLLBACK ๋ฒ„ํŠผ์ด ์žˆ์ง€๋งŒ, Auto Sync + Self Heal์ด ์ผœ์ง„ ์ƒํƒœ์—์„œ ๋ฒ„ํŠผ์œผ๋กœ ๋กค๋ฐฑํ•ด๋„ ArgoCD๊ฐ€ ์ฆ‰์‹œ ์ตœ์‹  Git ์ƒํƒœ๋กœ ๋˜๋Œ๋ ค๋ฒ„๋ฆฝ๋‹ˆ๋‹ค.

์ง„์ •ํ•œ GitOps ๋กค๋ฐฑ์€:

# Git์—์„œ ์ด์ „ ์ปค๋ฐ‹์œผ๋กœ ๋˜๋Œ๋ฆฌ๊ธฐ
git revert HEAD
git push origin main

# ArgoCD๊ฐ€ ๊ฐ์ง€ํ•˜๊ณ  ์ž๋™์œผ๋กœ ์ด์ „ ๋ฒ„์ „ ๋ฐฐํฌ

Git์ด ์ง„์‹ค์˜ ์›์ฒœ(Single Source of Truth)์ž…๋‹ˆ๋‹ค. ํด๋Ÿฌ์Šคํ„ฐ ์ƒํƒœ๋Š” ํ•ญ์ƒ Git๊ณผ ๋™์ผํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค.


๐Ÿ“‹ ArgoCD ํ•ต์‹ฌ ๋ช…๋ น์–ด

๊ตฌ๋ถ„๋ช…๋ น์–ด์„ค๋ช…
์„ค์น˜kubectl apply -n argocd -f [URL]ArgoCD ์„ค์น˜
์ ‘์†kubectl get svc argocd-server -n argocdUI ํฌํŠธ ํ™•์ธ
kubectl -n argocd get secret ... | base64 -d์ดˆ๊ธฐ ๋น„๋ฐ€๋ฒˆํ˜ธ
๋ฐฐํฌkubectl apply -f application.yamlApp ์ฃผ๋ฌธ์„œ ์ œ์ถœ
Gitgit add . && git commit -m "..." && git push๋ณ€๊ฒฝ โ†’ ์ž๋™ ๋ฐฐํฌ ํŠธ๋ฆฌ๊ฑฐ
๋ชจ๋‹ˆํ„ฐ๋งkubectl get pods -wํŒŒ๋“œ ์ƒ์„ฑ ์‹ค์‹œ๊ฐ„ ํ™•์ธ

๐ŸŒ ์ „์ฒด GitOps ํ”Œ๋กœ์šฐ ์ •๋ฆฌ

[๊ฐœ๋ฐœ์ž]
  โ””โ”€ ์ฝ”๋“œ ์ˆ˜์ •
  โ””โ”€ git push

[GitHub]
  โ””โ”€ ๋ณ€๊ฒฝ ๊ฐ์ง€๋จ

[ArgoCD (ํด๋Ÿฌ์Šคํ„ฐ ๋‚ด๋ถ€)]
  โ””โ”€ Git ๋ณ€๊ฒฝ ๊ฐ์ง€ (3๋ถ„ ์ฃผ๊ธฐ or Webhook)
  โ””โ”€ ์ƒˆ YAML ๋‹ค์šด๋กœ๋“œ
  โ””โ”€ kubectl apply (์ž๋™)
  โ””โ”€ ์ƒํƒœ ๋ชจ๋‹ˆํ„ฐ๋ง โ†’ Self-Heal

[Kubernetes Cluster]
  โ””โ”€ ๋ฐฐํฌ ์™„๋ฃŒ โœ…

โœ… ๋งˆ์น˜๋ฉฐ

K8s ํด๋Ÿฌ์Šคํ„ฐ ๊ตฌ์ถ• โ†’ Helm์œผ๋กœ ํŒจํ‚ค์ง• โ†’ ArgoCD๋กœ GitOps ํŒŒ์ดํ”„๋ผ์ธ ์™„์„ฑ. ์ด ์„ธ ๋‹จ๊ณ„๊ฐ€ ํ˜„๋Œ€ ์ฟ ๋ฒ„๋„คํ‹ฐ์Šค ์šด์˜์˜ ํ•ต์‹ฌ ํ๋ฆ„์ž…๋‹ˆ๋‹ค.

ArgoCD๋ฅผ ์“ฐ๊ณ  ๋‚˜๋ฉด “๋ˆ„๊ฐ€, ์–ธ์ œ, ๋ฌด์—‡์„ ๋ฐฐํฌํ–ˆ๋Š”์ง€”๊ฐ€ ์ „๋ถ€ Git ํžˆ์Šคํ† ๋ฆฌ๋กœ ๋‚จ์Šต๋‹ˆ๋‹ค. ์‚ฌ๊ณ ๊ฐ€ ๋‚˜๋„ ์›์ธ์„ ์ถ”์ ํ•˜๊ธฐ ์‰ฝ๊ณ , ๋กค๋ฐฑ๋„ git revert ํ•œ ์ค„์ด๋ฉด ๋ฉ๋‹ˆ๋‹ค. ๋ฐฐํฌ๊ฐ€ ์ฝ”๋“œ๋กœ ๊ด€๋ฆฌ๋˜๋Š” ์„ธ์ƒ, GitOps์ž…๋‹ˆ๋‹ค.