Kubernetes Tools/ArgoCD

[Ep.1] [GitOps์™€ Argo CD์˜ ๊ธฐ์ดˆ #1] GitOps๋ž€ ๋ฌด์—‡์ธ๊ฐ€? ๊ธฐ์กด Kubernetes ๋ฐฐํฌ ๋ฐฉ์‹๊ณผ์˜ ์ฐจ์ด์ 

ygtoken 2025. 3. 17. 12:04
728x90

๐Ÿ”น GitOps๋ž€ ๋ฌด์—‡์ธ๊ฐ€?

โœ… GitOps์˜ ์ •์˜

GitOps๋Š” ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜ ๋ฐ ์ธํ”„๋ผ๋ฅผ Git ์ €์žฅ์†Œ๋ฅผ ๋‹จ์ผ ์‹ ๋ขฐ ์›์ฒœ(Single Source of Truth)์œผ๋กœ ์‚ผ์•„ ์ž๋™์œผ๋กœ ๊ด€๋ฆฌํ•˜๋Š” ์šด์˜ ๋ฐฉ์‹์ž…๋‹ˆ๋‹ค.
์ฆ‰, Kubernetes ํ™˜๊ฒฝ์—์„œ Git์— ์ €์žฅ๋œ ์„ ์–ธ์ (Declarative) ์„ค์ •์„ ๊ธฐ๋ฐ˜์œผ๋กœ ๋ฐฐํฌ์™€ ์šด์˜์„ ์ž๋™ํ™”ํ•˜๋Š” ๋ฐฉ๋ฒ•๋ก ์ž…๋‹ˆ๋‹ค.

โœ… GitOps์˜ ํ•ต์‹ฌ ๋ชฉํ‘œ

1๏ธโƒฃ Git ์ €์žฅ์†Œ๋ฅผ ๋‹จ์ผ ์šด์˜ ์›์ฒœ์œผ๋กœ ์‚ฌ์šฉ → ๋ชจ๋“  ๋ณ€๊ฒฝ ์‚ฌํ•ญ์ด Git์—์„œ ๊ด€๋ฆฌ๋จ
2๏ธโƒฃ ์„ ์–ธ์ (Declarative) ๋ฐฉ์‹์œผ๋กœ ์ธํ”„๋ผ ๋ฐ ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜ ์„ค์ • ๊ด€๋ฆฌ
3๏ธโƒฃ ์ž๋™ํ™”๋œ ๋™๊ธฐํ™” ๋ฐ ๋ฐฐํฌ → Git์˜ ๋ณ€๊ฒฝ ์‚ฌํ•ญ์ด ์ž๋™์œผ๋กœ Kubernetes์— ์ ์šฉ๋จ
4๏ธโƒฃ ๊ฐ์‚ฌ ๊ฐ€๋Šฅ(Auditability) ๋ฐ ๋กค๋ฐฑ ์ง€์› → Git ์ปค๋ฐ‹์„ ๊ธฐ๋ฐ˜์œผ๋กœ ๊ณผ๊ฑฐ ์ƒํƒœ๋กœ ๋ณต๊ตฌ ๊ฐ€๋Šฅ

GitOps๋Š” Kubernetes ํ™˜๊ฒฝ์—์„œ CI/CD๋ฅผ ๊ตฌ์ถ•ํ•˜๋Š” ๋ฐ ํ•„์ˆ˜์ ์ธ ๊ฐœ๋…์ด๋ฉฐ, Argo CD ๊ฐ™์€ ๋„๊ตฌ๋ฅผ ํ™œ์šฉํ•˜๋ฉด ์ด๋ฅผ ์‰ฝ๊ฒŒ ์ ์šฉํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.


๐Ÿ”น ๊ธฐ์กด Kubernetes ๋ฐฐํฌ ๋ฐฉ์‹๊ณผ GitOps ๋ฐฉ์‹ ๋น„๊ต

Kubernetes์— ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์„ ๋ฐฐํฌํ•˜๋Š” ๋ฐฉ๋ฒ•์—๋Š” ํฌ๊ฒŒ ๋ช…๋ นํ˜•(Imperative) ๋ฐฉ์‹๊ณผ ์„ ์–ธํ˜•(Declarative) ๋ฐฉ์‹์ด ์žˆ์Šต๋‹ˆ๋‹ค.
GitOps๋Š” ์„ ์–ธํ˜• ๋ฐฉ์‹์˜ ๊ฐ•์ ์„ ๊ทน๋Œ€ํ™”ํ•˜์—ฌ CI/CD๋ฅผ ์ž๋™ํ™”ํ•˜๋Š” ์ ‘๊ทผ๋ฒ•์ž…๋‹ˆ๋‹ค.


โœ… ๊ธฐ์กด Kubernetes ๋ฐฐํฌ ๋ฐฉ์‹ (๋ช…๋ นํ˜• ๋ฐฉ์‹)

๐Ÿ”น ๋ช…๋ นํ˜•(Imperative) ๋ฐฐํฌ ๋ฐฉ์‹์ด๋ž€?

  • ์šด์˜์ž๊ฐ€ kubectl apply ๋“ฑ์˜ ๋ช…๋ น์–ด๋ฅผ ์ง์ ‘ ์‹คํ–‰ํ•˜์—ฌ ๋ฆฌ์†Œ์Šค๋ฅผ ๋ฐฐํฌ
  • ํŠน์ • ์ƒํƒœ๋ฅผ ์œ ์ง€ํ•˜๊ธฐ ์œ„ํ•ด ์‚ฌ๋žŒ์ด ์ง์ ‘ ํด๋Ÿฌ์Šคํ„ฐ๋ฅผ ๊ด€๋ฆฌํ•ด์•ผ ํ•จ
  • ๋ณ€๊ฒฝ ์‚ฌํ•ญ์ด Kubernetes ํด๋Ÿฌ์Šคํ„ฐ์—์„œ ์ฆ‰๊ฐ ์ ์šฉ๋˜์ง€๋งŒ, ๊ธฐ๋ก์ด ๋‚จ์ง€ ์•Š์Œ

๐Ÿ”น ๋ช…๋ นํ˜• ๋ฐฉ์‹์˜ ๋ฌธ์ œ์ 
โŒ ๋ณ€๊ฒฝ ์ด๋ ฅ ๊ด€๋ฆฌ๊ฐ€ ์–ด๋ ค์›€ → ์–ด๋–ค ์„ค์ •์ด ์ ์šฉ๋˜์—ˆ๋Š”์ง€ ์ถ”์  ๋ถˆ๊ฐ€๋Šฅ
โŒ ์šด์˜์ž์˜ ์‹ค์ˆ˜ ๊ฐ€๋Šฅ์„ฑ → ์‚ฌ๋žŒ์ด ์ง์ ‘ ์‹คํ–‰ํ•ด์•ผ ํ•˜๋ฏ€๋กœ ์‹ค์ˆ˜ ๊ฐ€๋Šฅ์„ฑ์ด ๋†’์Œ
โŒ ์ž๋™ํ™” ๋ถ€์กฑ → ์ง€์†์ ์ธ ์šด์˜ ๋ฐ ์œ ์ง€๋ณด์ˆ˜์— ๋งŽ์€ ์‹œ๊ฐ„์ด ํ•„์š”

# ๋ช…๋ นํ˜• ๋ฐฉ์‹ ์˜ˆ์ œ (kubectl ๋ช…๋ น์–ด ์‹คํ–‰)
kubectl apply -f deployment.yaml
kubectl scale deployment my-app --replicas=3
kubectl delete pod my-pod

โœ… GitOps ๊ธฐ๋ฐ˜ Kubernetes ๋ฐฐํฌ ๋ฐฉ์‹ (์„ ์–ธํ˜• ๋ฐฉ์‹)

๐Ÿ”น ์„ ์–ธํ˜•(Declarative) ๋ฐฐํฌ ๋ฐฉ์‹์ด๋ž€?

  • Git ์ €์žฅ์†Œ์— Kubernetes ๋งค๋‹ˆํŽ˜์ŠคํŠธ๋ฅผ ์ €์žฅํ•˜๊ณ , ๋ณ€๊ฒฝ ์‚ฌํ•ญ์„ ์ž๋™์œผ๋กœ ํด๋Ÿฌ์Šคํ„ฐ์— ์ ์šฉ
  • ์šด์˜์ž๋Š” Git์—์„œ ์ฝ”๋“œ๋ฅผ ๋ณ€๊ฒฝํ•˜๋Š” ๊ฒƒ๋งŒ์œผ๋กœ Kubernetes ์ƒํƒœ๋ฅผ ์กฐ์ • ๊ฐ€๋Šฅ
  • CI/CD์™€ ์—ฐ๊ณ„ํ•˜์—ฌ ์ž๋™ํ™”๋œ ๋ฐฐํฌ ๋ฐ ๋กค๋ฐฑ ์ง€์›

๐Ÿ”น GitOps ๋ฐฉ์‹์˜ ์žฅ์ 
โœ… ๋ชจ๋“  ๋ณ€๊ฒฝ ์‚ฌํ•ญ์„ Git์—์„œ ์ถ”์  ๊ฐ€๋Šฅ → ๋ฐฐํฌ ์ด๋ ฅ์ด ๋‚จ์•„ ๊ฐ์‚ฌ(Audit)๊ฐ€ ๊ฐ€๋Šฅ
โœ… ์ž๋™ํ™”๋œ ๋ฐฐํฌ → ์‚ฌ๋žŒ์ด ๊ฐœ์ž…ํ•  ํ•„์š” ์—†์ด CI/CD ํŒŒ์ดํ”„๋ผ์ธ์—์„œ ์ž๋™ ์‹คํ–‰
โœ… ๋กค๋ฐฑ์ด ๊ฐ„ํŽธ → ํŠน์ • ์ปค๋ฐ‹์œผ๋กœ ๋˜๋Œ๋ฆฌ๋ฉด Kubernetes ์ƒํƒœ๋„ ์ž๋™์œผ๋กœ ๋กค๋ฐฑ๋จ

# GitOps ๋ฐฉ์‹ ์˜ˆ์ œ (Git์— ์ €์žฅ๋œ deployment.yaml)
apiVersion: apps/v1
kind: Deployment
metadata:
  name: my-app
  namespace: default
spec:
  replicas: 3  # ์›ํ•˜๋Š” ์ƒํƒœ ์„ ์–ธ (Git์— ์ €์žฅ)
  selector:
    matchLabels:
      app: my-app
  template:
    metadata:
      labels:
        app: my-app
    spec:
      containers:
      - name: my-app
        image: my-app:v1.0

GitOps ๋ฐฉ์‹์„ ์‚ฌ์šฉํ•˜๋ฉด, ๊ฐœ๋ฐœ์ž๋Š” **Git์— git push**ํ•˜๋Š” ๊ฒƒ๋งŒ์œผ๋กœ ๋ฐฐํฌ๋ฅผ ์ง„ํ–‰ํ•  ์ˆ˜ ์žˆ์œผ๋ฉฐ,
Argo CD ๊ฐ™์€ ๋„๊ตฌ๊ฐ€ ์ด๋ฅผ ๊ฐ์ง€ํ•˜๊ณ  ์ž๋™์œผ๋กœ Kubernetes์— ๋ฐ˜์˜ํ•ด ์ค๋‹ˆ๋‹ค.


๐Ÿ”น GitOps vs ๊ธฐ์กด CI/CD ๋ฐฉ์‹ ๋น„๊ต

๋น„๊ต ํ•ญ๋ชฉ ๊ธฐ์กด CI/CD ๋ฐฉ์‹ GitOps ๋ฐฉ์‹

๋ฐฐํฌ ๋ฐฉ์‹ ์ˆ˜๋™(๋ช…๋ นํ˜•) ์ž๋™(์„ ์–ธํ˜•)
๋ณ€๊ฒฝ ์‚ฌํ•ญ ๊ด€๋ฆฌ ์ผ๋ถ€ CI/CD ๋กœ๊ทธ์—์„œ๋งŒ ํ™•์ธ ๊ฐ€๋Šฅ Git์—์„œ ๋ณ€๊ฒฝ ์ด๋ ฅ ์ถ”์  ๊ฐ€๋Šฅ
๋กค๋ฐฑ ๋ฐฉ์‹ ์ˆ˜๋™์œผ๋กœ ํŠน์ • ๋ฒ„์ „ ์žฌ์ ์šฉ ํ•„์š” Git ์ปค๋ฐ‹ ๋˜๋Œ๋ฆฌ๊ธฐ๋งŒ ํ•˜๋ฉด ์ž๋™ ๋กค๋ฐฑ
์ž๋™ํ™” ์ˆ˜์ค€ CI/CD ํ•„์š”, ์‚ฌ๋žŒ์ด ์ง์ ‘ ๋ช…๋ น ์‹คํ–‰ Git๊ณผ Argo CD๊ฐ€ ์ž๋™์œผ๋กœ ๋™๊ธฐํ™”
์šด์˜ ๋ถ€๋‹ด ์šด์˜์ž๊ฐ€ ์ง์ ‘ ๊ด€๋ฆฌํ•ด์•ผ ํ•จ ์ž๋™ํ™”๋กœ ์šด์˜ ๋ถ€๋‹ด ๊ฐ์†Œ

GitOps๋Š” CI/CD์˜ ํ•ต์‹ฌ ๊ฐœ๋…์ธ **Infrastructure as Code(IaC)**๋ฅผ ์‹คํ˜„ํ•˜๋ฉฐ,
Kubernetes ํด๋Ÿฌ์Šคํ„ฐ ์šด์˜์„ ๋”์šฑ ํšจ์œจ์ ์ด๊ณ  ์•ˆ์ „ํ•˜๊ฒŒ ๋งŒ๋“ค์–ด ์ค๋‹ˆ๋‹ค.


๐Ÿ”น GitOps๋ฅผ ์‹คํ˜„ํ•˜๋Š” ๋„๊ตฌ: Argo CD

GitOps๋ฅผ Kubernetes์—์„œ ์ ์šฉํ•˜๋ ค๋ฉด, Git๊ณผ Kubernetes๋ฅผ ์ž๋™์œผ๋กœ ๋™๊ธฐํ™”ํ•ด ์ค„ ์ˆ˜ ์žˆ๋Š” ๋„๊ตฌ๊ฐ€ ํ•„์š”ํ•ฉ๋‹ˆ๋‹ค.
๊ฐ€์žฅ ๋Œ€ํ‘œ์ ์ธ ๋„๊ตฌ๊ฐ€ ๋ฐ”๋กœ Argo CD์ž…๋‹ˆ๋‹ค.

 

โœ… Argo CD์˜ ์—ญํ• 

  • Git ์ €์žฅ์†Œ์˜ ์ƒํƒœ๋ฅผ Kubernetes ํด๋Ÿฌ์Šคํ„ฐ์— ์ž๋™์œผ๋กœ ๋™๊ธฐํ™”
  • Kubernetes ๋ฆฌ์†Œ์Šค ๋ณ€๊ฒฝ ์‚ฌํ•ญ์„ ๊ฐ์ง€ํ•˜๊ณ , ํ•„์š” ์‹œ ๋กค๋ฐฑ ์ง€์›
  • UI ๋ฐ CLI๋ฅผ ์ œ๊ณตํ•˜์—ฌ ๋ฐฐํฌ ์ƒํƒœ๋ฅผ ์‰ฝ๊ฒŒ ๋ชจ๋‹ˆํ„ฐ๋ง ๊ฐ€๋Šฅ
  • Helm, Kustomize ๋“ฑ ๋‹ค์–‘ํ•œ ๋ฐฐํฌ ๋ฐฉ์‹์„ ์ง€์›

๐Ÿ”น ๊ฒฐ๋ก : ์ด๋ฒˆ ๊ธ€์—์„œ ๋ฐฐ์šด ํ•ต์‹ฌ ๋‚ด์šฉ ์ •๋ฆฌ

๐ŸŸข GitOps๋Š” Git์„ ๋‹จ์ผ ์‹ ๋ขฐ ์›์ฒœ์œผ๋กœ ์‚ผ์•„ Kubernetes ๋ฐฐํฌ๋ฅผ ์ž๋™ํ™”ํ•˜๋Š” ๋ฐฉ๋ฒ•๋ก 
๐ŸŸข ๊ธฐ์กด ๋ช…๋ นํ˜• ๋ฐฐํฌ ๋ฐฉ์‹๊ณผ ๋น„๊ตํ–ˆ์„ ๋•Œ GitOps๋Š” ์ž๋™ํ™”, ๋กค๋ฐฑ, ๋ณ€๊ฒฝ ์ด๋ ฅ ์ถ”์ ์ด ํ›จ์”ฌ ํšจ์œจ์ 
๐ŸŸข GitOps๋ฅผ ์‹คํ˜„ํ•˜๋Š” ๋Œ€ํ‘œ์ ์ธ ๋„๊ตฌ๋กœ Argo CD๊ฐ€ ์žˆ์œผ๋ฉฐ, ์ด๋ฅผ ํ†ตํ•ด Kubernetes ํด๋Ÿฌ์Šคํ„ฐ๋ฅผ ์ž๋™ ๊ด€๋ฆฌ ๊ฐ€๋Šฅ

728x90