๋ณธ๋ฌธ ๋ฐ”๋กœ๊ฐ€๊ธฐ

Docker and Kubernetes

ArgoCD๋ž€ ๋ฌด์—‡์ธ์ง€, ์„ค์น˜๋ถ€ํ„ฐ ์„ค์ •, ํ™œ์šฉ๊นŒ์ง€

๋ฐ˜์‘ํ˜•

๐Ÿ”ง ArgoCD๋ž€? ์„ค์น˜๋ถ€ํ„ฐ ์„ค์ •, ์‹ค์ „ ํ™œ์šฉ๊นŒ์ง€ ์™„๋ฒฝ ๊ฐ€์ด๋“œ

โ€œGit์— Pushํ•˜๋ฉด ์ž๋™์œผ๋กœ Kubernetes์— ๋ฐฐํฌ๋˜๋„๋ก ๋งŒ๋“ค ์ˆ˜ ์—†์„๊นŒ?โ€
๋ฐ”๋กœ ๊ทธ ํ•ด๋‹ต์ด ArgoCD์ž…๋‹ˆ๋‹ค.


๐Ÿง  ArgoCD๋ž€?

**ArgoCD(Argo Continuous Delivery)**๋Š” GitOps ๋ฐฉ์‹์˜ Kubernetes ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜ ๋ฐฐํฌ ๋„๊ตฌ์ž…๋‹ˆ๋‹ค. Git ์ €์žฅ์†Œ๋ฅผ **๋‹จ์ผ ์†Œ์Šค ์˜ค๋ธŒ ํŠธ๋ฃจ์Šค(Single Source of Truth)**๋กœ ์‚ผ์•„, Git์— ์ •์˜๋œ ์ƒํƒœ์™€ ์‹ค์ œ ํด๋Ÿฌ์Šคํ„ฐ ์ƒํƒœ๋ฅผ ๋น„๊ตํ•˜๊ณ  ์ž๋™์œผ๋กœ ๋™๊ธฐํ™”ํ•ด์ค๋‹ˆ๋‹ค.

์ฃผ์š” ํŠน์ง•:

  • โœ… Git ๊ธฐ๋ฐ˜ ๋ฐฐํฌ ์ž๋™ํ™” (GitOps)
  • โœ… UI / CLI / API ๋ชจ๋‘ ์ œ๊ณต
  • โœ… Helm, Kustomize, YAML ๋“ฑ ๋‹ค์–‘ํ•œ ํ˜•์‹ ์ง€์›
  • โœ… ์‹ค์‹œ๊ฐ„ ์ƒํƒœ ๋ชจ๋‹ˆํ„ฐ๋ง ๋ฐ ๋กค๋ฐฑ ๊ธฐ๋Šฅ
  • โœ… ๋ฉ€ํ‹ฐ ํด๋Ÿฌ์Šคํ„ฐ ์ง€์›

๐Ÿ”ง ์„ค์น˜ํ•˜๊ธฐ

โœ… ์ „์ œ ์กฐ๊ฑด

  • Kubernetes ํด๋Ÿฌ์Šคํ„ฐ๊ฐ€ ๊ตฌ์„ฑ๋˜์–ด ์žˆ์–ด์•ผ ํ•ฉ๋‹ˆ๋‹ค (minikube, kind, EKS ๋“ฑ)
  • kubectl ๋ช…๋ น์–ด ์‚ฌ์šฉ ๊ฐ€๋Šฅํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค

๐Ÿ“ฅ ์„ค์น˜ ๋ช…๋ น์–ด

kubectl create namespace argocd

kubectl apply -n argocd -f https://raw.githubusercontent.com/argoproj/argo-cd/stable/manifests/install.yaml

โณ ์„ค์น˜ ํ™•์ธ

kubectl get pods -n argocd

๋ชจ๋“  pod๊ฐ€ Running ์ƒํƒœ๊ฐ€ ๋  ๋•Œ๊นŒ์ง€ ๊ธฐ๋‹ค๋ฆฝ๋‹ˆ๋‹ค.


๐ŸŒ ArgoCD ์ ‘์†ํ•˜๊ธฐ

๊ธฐ๋ณธ์ ์œผ๋กœ argocd-server๋Š” ClusterIP๋กœ ์„ค์น˜๋˜๋ฏ€๋กœ ์™ธ๋ถ€์—์„œ ์ ‘์†ํ•˜๋ ค๋ฉด ๋‹ค์Œ ์ค‘ ํ•˜๋‚˜๋ฅผ ์„ ํƒํ•˜์„ธ์š”:

๐Ÿ”น ๋ฐฉ๋ฒ• 1: ํฌํŠธํฌ์›Œ๋”ฉ (๋กœ์ปฌ ํ…Œ์ŠคํŠธ์šฉ)

kubectl port-forward svc/argocd-server -n argocd 8080:443

โ†’ ๋ธŒ๋ผ์šฐ์ €์—์„œ https://localhost:8080 ์ ‘์†

๐Ÿ”น ๋ฐฉ๋ฒ• 2: Ingress ๋˜๋Š” NodePort ์„ค์ •

์„ ํƒ์ ์œผ๋กœ Ingress๋ฅผ ๊ตฌ์„ฑํ•˜๊ฑฐ๋‚˜ argocd-server ์„œ๋น„์Šค๋ฅผ NodePort๋กœ ๋ณ€๊ฒฝํ•˜์—ฌ ์™ธ๋ถ€์—์„œ ์ ‘๊ทผํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.


๐Ÿ”‘ ๋กœ๊ทธ์ธํ•˜๊ธฐ

โ–ถ๏ธ ๊ธฐ๋ณธ ๋กœ๊ทธ์ธ ์ •๋ณด

# admin ์ดˆ๊ธฐ ๋น„๋ฐ€๋ฒˆํ˜ธ ํ™•์ธ
kubectl get secret argocd-initial-admin-secret -n argocd -o jsonpath="{.data.password}" | base64 -d && echo

โ†’ ID: admin, ๋น„๋ฐ€๋ฒˆํ˜ธ: ์œ„์—์„œ ํ™•์ธํ•œ ๊ฐ’

โ–ถ๏ธ CLI ๋กœ๊ทธ์ธ

# CLI ์„ค์น˜ (macOS ๊ธฐ์ค€)
brew install argocd

# ๋กœ๊ทธ์ธ
argocd login localhost:8080 --username admin --password <๋น„๋ฐ€๋ฒˆํ˜ธ>

๐Ÿ“ ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜ ๋ฐฐํฌํ•˜๊ธฐ

1. Git ์ €์žฅ์†Œ์— Kubernetes manifest ํŒŒ์ผ ์˜ฌ๋ฆฌ๊ธฐ

์˜ˆ:

my-app/
  โ””โ”€โ”€ k8s/
       โ”œโ”€โ”€ deployment.yaml
       โ”œโ”€โ”€ service.yaml

GitHub์— ํ‘ธ์‹œํ•ด๋‘ก๋‹ˆ๋‹ค.

2. ArgoCD์— ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜ ๋“ฑ๋ก

โœ… CLI ๋ฐฉ์‹

argocd app create my-app \
  --repo https://github.com/your-username/your-repo.git \
  --path k8s \
  --dest-server https://kubernetes.default.svc \
  --dest-namespace default

โœ… UI ๋ฐฉ์‹

  • โ€œNew Appโ€ ํด๋ฆญ
  • Git ์ €์žฅ์†Œ ์ •๋ณด, ๊ฒฝ๋กœ(path), ํด๋Ÿฌ์Šคํ„ฐ, ๋„ค์ž„์ŠคํŽ˜์ด์Šค ์ง€์ •

๐Ÿ”„ ๋ฐฐํฌ ๋ฐ ๋™๊ธฐํ™”

์ˆ˜๋™ ๋™๊ธฐํ™”

argocd app sync my-app

๋˜๋Š” UI์—์„œ Sync ๋ฒ„ํŠผ ํด๋ฆญ

์ž๋™ ๋™๊ธฐํ™” ์„ค์ • (Auto Sync)

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

โ†’ Git์— Pushํ•˜๋ฉด ์ž๋™ ๋ฐฐํฌ๋ฉ๋‹ˆ๋‹ค ๐ŸŽ‰


๐Ÿ” ์ƒํƒœ ํ™•์ธ ๋ฐ ๋กค๋ฐฑ

argocd app get my-app
argocd app history my-app
argocd app rollback my-app <revision>

UI์—์„œ๋„ ์‰ฝ๊ฒŒ ๋กค๋ฐฑ ๊ฐ€๋Šฅํ•ฉ๋‹ˆ๋‹ค.


๐Ÿ’ก GitOps ํ๋ฆ„ ์ •๋ฆฌ

๊ฐœ๋ฐœ โ†’ Git์— Push โ†’ ArgoCD ๊ฐ์ง€ โ†’ Kubernetes ์ž๋™ ๋ฐฐํฌ

Git์ด ๋ฐฐํฌ ์ƒํƒœ์˜ ๊ธฐ์ค€(GitOps)์ด ๋˜๋ฉฐ, ์ธํ”„๋ผ ์ฝ”๋“œ์™€ ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜ ๋ฐฐํฌ๊ฐ€ ์ผ๊ด€๋˜๊ณ  ์•ˆ์ „ํ•˜๊ฒŒ ๊ด€๋ฆฌ๋ฉ๋‹ˆ๋‹ค.


๐Ÿงฉ ๋ณด๋„ˆ์Šค: Helm, Kustomize ์ง€์›

ArgoCD๋Š” ๋‹จ์ˆœํ•œ YAML๋ฟ ์•„๋‹ˆ๋ผ ๋‹ค์Œ๋„ ์ง€์›ํ•ฉ๋‹ˆ๋‹ค:

  • Helm Charts (--helm)
  • Kustomize (--kustomize)
  • Jsonnet ๋“ฑ

โ€œCI๋Š” GitHub Actions, CD๋Š” ArgoCDโ€ โ€“ ๊ฐ€์žฅ ๊น”๋”ํ•œ ๋ฐฐํฌ ํŒŒ์ดํ”„๋ผ์ธ์˜ ์‹œ์ž‘์ž…๋‹ˆ๋‹ค.

๋ฐ˜์‘ํ˜•