Kubernetes Tools/ArgoCD

[Ep.26] [Argo CD ์„ฑ๋Šฅ ์ตœ์ ํ™” #3] Argo CD์™€ GitOps ๊ธฐ๋ฐ˜์˜ CI/CD ํŒŒ์ดํ”„๋ผ์ธ ๊ตฌ์ถ•

ygtoken 2025. 3. 17. 13:11
728x90

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

CI/CD(Continuous Integration / Continuous Deployment)๋Š” ์†Œํ”„ํŠธ์›จ์–ด ๊ฐœ๋ฐœ ๋ฐ ๋ฐฐํฌ๋ฅผ ์ž๋™ํ™”ํ•˜๋Š” ํ•ต์‹ฌ ๊ฐœ๋…์ž…๋‹ˆ๋‹ค.
GitOps์™€ Argo CD๋ฅผ ํ™œ์šฉํ•˜๋ฉด CI/CD ํŒŒ์ดํ”„๋ผ์ธ์„ ๋”์šฑ ํšจ์œจ์ ์œผ๋กœ ๊ตฌ์ถ•ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

โœ… GitOps ๊ธฐ๋ฐ˜ CI/CD ํŒŒ์ดํ”„๋ผ์ธ์˜ ํ•ต์‹ฌ ์š”์†Œ

 

๊ตฌ์„ฑ ์š”์†Œ ์„ค๋ช…
Git ์ €์žฅ์†Œ (Git Repository) ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜ ์ฝ”๋“œ ๋ฐ Kubernetes ๋งค๋‹ˆํŽ˜์ŠคํŠธ๋ฅผ ๊ด€๋ฆฌ
CI ์‹œ์Šคํ…œ (GitHub Actions, Jenkins, Argo Workflows) ์ฝ”๋“œ ๋ณ€๊ฒฝ์„ ๊ฐ์ง€ํ•˜๊ณ  ์ปจํ…Œ์ด๋„ˆ ์ด๋ฏธ์ง€๋ฅผ ๋นŒ๋“œ
์ด๋ฏธ์ง€ ๋ ˆ์ง€์ŠคํŠธ๋ฆฌ (Docker Hub, ECR, GCR) ๋นŒ๋“œ๋œ ์ปจํ…Œ์ด๋„ˆ ์ด๋ฏธ์ง€๋ฅผ ์ €์žฅ
GitOps ๋„๊ตฌ (Argo CD) Git ์ƒํƒœ๋ฅผ ๊ฐ์‹œํ•˜๊ณ  Kubernetes ํด๋Ÿฌ์Šคํ„ฐ์— ์ž๋™ ๋ฐฐํฌ
Kubernetes ํด๋Ÿฌ์Šคํ„ฐ ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์ด ๋ฐฐํฌ๋  ํ™˜๊ฒฝ

๐Ÿ”น GitOps ๊ธฐ๋ฐ˜ CI/CD ํŒŒ์ดํ”„๋ผ์ธ์˜ ๋™์ž‘ ์›๋ฆฌ

1๏ธโƒฃ ๊ฐœ๋ฐœ์ž๊ฐ€ ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜ ์ฝ”๋“œ๋ฅผ Git ์ €์žฅ์†Œ์— Push
2๏ธโƒฃ CI ์‹œ์Šคํ…œ์ด ๋ณ€๊ฒฝ ์‚ฌํ•ญ์„ ๊ฐ์ง€ํ•˜๊ณ  ์ปจํ…Œ์ด๋„ˆ ์ด๋ฏธ์ง€๋ฅผ ๋นŒ๋“œํ•˜์—ฌ ์ด๋ฏธ์ง€ ๋ ˆ์ง€์ŠคํŠธ๋ฆฌ์— Push
3๏ธโƒฃ GitOps ๋ฐฉ์‹์œผ๋กœ Kubernetes ๋งค๋‹ˆํŽ˜์ŠคํŠธ๊ฐ€ ์—…๋ฐ์ดํŠธ๋จ
4๏ธโƒฃ Argo CD๊ฐ€ ๋ณ€๊ฒฝ ์‚ฌํ•ญ์„ ๊ฐ์ง€ํ•˜๊ณ  Kubernetes ํด๋Ÿฌ์Šคํ„ฐ์— ์ž๋™ ๋™๊ธฐํ™”


๐Ÿ”น 1. GitOps ๊ธฐ๋ฐ˜ CI/CD ํŒŒ์ดํ”„๋ผ์ธ ๊ตฌ์ถ• ๋ฐฉ๋ฒ•

GitOps ๋ฐฉ์‹์œผ๋กœ CI/CD ํŒŒ์ดํ”„๋ผ์ธ์„ ๊ตฌ์ถ•ํ•˜๋ ค๋ฉด ๋‹ค์Œ ๋‹จ๊ณ„๋ฅผ ์ˆ˜ํ–‰ํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค.

โœ… 1๏ธโƒฃ Argo CD ์ž๋™ ๋™๊ธฐํ™” ํ™œ์„ฑํ™”

Argo CD์—์„œ Git ๋ณ€๊ฒฝ ์‚ฌํ•ญ์ด ์ž๋™์œผ๋กœ Kubernetes์— ๋ฐ˜์˜๋˜๋„๋ก ์ž๋™ ๋™๊ธฐํ™”(Automated Sync) ์„ค์ •์„ ํ™œ์„ฑํ™”ํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค.

syncPolicy:
  automated:
    prune: true  # Git์—์„œ ์‚ญ์ œ๋œ ๋ฆฌ์†Œ์Šค๋ฅผ Kubernetes์—์„œ๋„ ์ž๋™ ์‚ญ์ œ
    selfHeal: true  # Kubernetes ๋ฆฌ์†Œ์Šค๊ฐ€ ๋ณ€๊ฒฝ๋˜์—ˆ์„ ๊ฒฝ์šฐ ์›๋ž˜ ์ƒํƒœ๋กœ ์ž๋™ ๋ณต๊ตฌ
  syncOptions:
    - CreateNamespace=true  # ๋„ค์ž„์ŠคํŽ˜์ด์Šค๊ฐ€ ์—†์œผ๋ฉด ์ž๋™ ์ƒ์„ฑ

 

โœ… ์„ค๋ช…:
โœ” prune: true → Git์—์„œ ์‚ญ์ œ๋œ ๋ฆฌ์†Œ์Šค๊ฐ€ Kubernetes์—์„œ๋„ ์‚ญ์ œ๋จ
โœ” selfHeal: true → Kubernetes ๋ฆฌ์†Œ์Šค๊ฐ€ ๋ณ€๊ฒฝ๋˜๋ฉด Git ์ƒํƒœ๋กœ ์ž๋™ ๋ณต๊ตฌ
โœ” CreateNamespace=true → ๋„ค์ž„์ŠคํŽ˜์ด์Šค๊ฐ€ ์—†์„ ๊ฒฝ์šฐ ์ž๋™ ์ƒ์„ฑ


โœ… 2๏ธโƒฃ GitHub Actions๋ฅผ ํ™œ์šฉํ•œ CI/CD ํŒŒ์ดํ”„๋ผ์ธ ๊ตฌ์ถ•

GitHub Actions๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ Git ๋ณ€๊ฒฝ ์‚ฌํ•ญ์ด ๋ฐœ์ƒํ•˜๋ฉด ์ปจํ…Œ์ด๋„ˆ ์ด๋ฏธ์ง€๋ฅผ ๋นŒ๋“œํ•˜๊ณ ,
Argo CD๊ฐ€ ์ด๋ฅผ ์ž๋™์œผ๋กœ ๋ฐฐํฌํ•˜๋„๋ก ์„ค์ •ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

 

โœ… GitHub Actions CI/CD ํŒŒ์ดํ”„๋ผ์ธ ์˜ˆ์ œ (.github/workflows/deploy.yml)

name: Deploy to Kubernetes with Argo CD

on:
  push:
    branches:
      - main  # main ๋ธŒ๋žœ์น˜์— Push ์ด๋ฒคํŠธ ๋ฐœ์ƒ ์‹œ ์‹คํ–‰

jobs:
  build:
    runs-on: ubuntu-latest
    steps:
      - name: Checkout repository
        uses: actions/checkout@v2  # ํ˜„์žฌ Git ์ €์žฅ์†Œ๋ฅผ ๊ฐ€์ ธ์˜ด

      - name: Build Docker image
        run: |
          docker build -t ghcr.io/example/app:${{ github.sha }} .  # Docker ์ด๋ฏธ์ง€ ๋นŒ๋“œ
          docker push ghcr.io/example/app:${{ github.sha }}  # ๋นŒ๋“œ๋œ ์ด๋ฏธ์ง€ ์—…๋กœ๋“œ

      - name: Update Kubernetes manifests
        run: |
          sed -i "s|image: ghcr.io/example/app:.*|image: ghcr.io/example/app:${{ github.sha }}|g" k8s/deployment.yaml
          git config user.name "GitHub Actions"
          git config user.email "actions@github.com"
          git add k8s/deployment.yaml
          git commit -m "Update deployment image to ${{ github.sha }}"
          git push origin main

 

โœ… ์„ค๋ช…:
โœ” docker build → GitHub Actions์—์„œ Docker ์ด๋ฏธ์ง€๋ฅผ ๋นŒ๋“œ
โœ” docker push → ๋นŒ๋“œ๋œ ์ด๋ฏธ์ง€๋ฅผ GitHub Container Registry(GHCR)์— Push
โœ” sed -i → Kubernetes ๋งค๋‹ˆํŽ˜์ŠคํŠธ์˜ ์ด๋ฏธ์ง€๋ฅผ ์ตœ์‹  ๋ฒ„์ „์œผ๋กœ ์—…๋ฐ์ดํŠธ
โœ” git commit & push → ์—…๋ฐ์ดํŠธ๋œ ๋งค๋‹ˆํŽ˜์ŠคํŠธ๋ฅผ Git ์ €์žฅ์†Œ์— ๋‹ค์‹œ Push

 

โœ… ๋™์ž‘ ๊ณผ์ •:

  1. GitHub Actions๊ฐ€ ์ฝ”๋“œ๋ฅผ ๋นŒ๋“œํ•˜๊ณ  ์ปจํ…Œ์ด๋„ˆ ์ด๋ฏธ์ง€๋ฅผ ๋ ˆ์ง€์ŠคํŠธ๋ฆฌ์— Push
  2. ์—…๋ฐ์ดํŠธ๋œ ์ด๋ฏธ์ง€ ํƒœ๊ทธ๊ฐ€ Git ์ €์žฅ์†Œ์˜ Kubernetes ๋งค๋‹ˆํŽ˜์ŠคํŠธ์— ๋ฐ˜์˜๋จ
  3. Argo CD๊ฐ€ ๋ณ€๊ฒฝ ์‚ฌํ•ญ์„ ๊ฐ์ง€ํ•˜๊ณ  ์ž๋™ ๋ฐฐํฌ ์‹คํ–‰

๐Ÿ”น 2. Argo CD์—์„œ ์ž๋™ ๋ฐฐํฌ ํ™•์ธ

Argo CD๊ฐ€ GitOps ๋ฐฉ์‹์œผ๋กœ ๋ฐฐํฌ๋ฅผ ์ •์ƒ์ ์œผ๋กœ ์ˆ˜ํ–‰ํ•˜๋Š”์ง€ ํ™•์ธํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค.

 

โœ… Argo CD CLI๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ๋ฐฐํฌ ์ƒํƒœ ํ™•์ธ

argocd app get example-app

 

โœ… ์ถœ๋ ฅ ์˜ˆ์‹œ

Name:               example-app
Project:            default
Sync Status:        Synced
Health Status:      Healthy
Revision:           8f7c2d1

๐Ÿ”น 3. Argo CD ์ž๋™ํ™” ๋ฐฐํฌ ์‹œ ๊ณ ๋ คํ•  ์ 

โœ… 1๏ธโƒฃ ๋ณด์•ˆ ๋ฐ ์ธ์ฆ ๊ด€๋ฆฌ

  • Argo CD์™€ CI/CD ์‹œ์Šคํ…œ ๊ฐ„์˜ ์ธ์ฆ์„ ์•ˆ์ „ํ•˜๊ฒŒ ๊ด€๋ฆฌํ•ด์•ผ ํ•จ
  • GitHub Actions์—์„œ secrets์„ ํ™œ์šฉํ•˜์—ฌ ์ธ์ฆ ์ •๋ณด๋ฅผ ๋ณดํ˜ธ

โœ… 2๏ธโƒฃ ๋ฐฐํฌ ์Šน์ธ(Manual Approval) ๋‹จ๊ณ„ ์ถ”๊ฐ€

  • ์šด์˜ ํ™˜๊ฒฝ์—์„œ๋Š” ์ž๋™ ๋ฐฐํฌ ์ „์— ๊ฒ€ํ†  ๋ฐ ์Šน์ธ ๋‹จ๊ณ„๋ฅผ ์ถ”๊ฐ€ํ•˜๋Š” ๊ฒƒ์ด ์ข‹์Œ
  • Argo CD์—์„œ Webhook์„ ํ™œ์šฉํ•œ Slack ์•Œ๋ฆผ ๋ฐ ์Šน์ธ ํ”„๋กœ์„ธ์Šค ๊ตฌ์ถ• ๊ฐ€๋Šฅ

โœ… 3๏ธโƒฃ ๋ฆฌ์†Œ์Šค ์ตœ์ ํ™” ๋ฐ ๋ชจ๋‹ˆํ„ฐ๋ง

  • Prometheus & Grafana๋ฅผ ํ™œ์šฉํ•˜์—ฌ Argo CD ๋ฐฐํฌ ์ƒํƒœ๋ฅผ ๋ชจ๋‹ˆํ„ฐ๋ง
  • ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜ ๋ฐฐํฌ ํ›„ Kubernetes ๋ฆฌ์†Œ์Šค ์‚ฌ์šฉ๋Ÿ‰ ์ตœ์ ํ™”

๐Ÿ”น Argo CD ์ž๋™ํ™” ๋ฐฐํฌ CLI ๋ช…๋ น์–ด ์ •๋ฆฌ

 

๋ช…๋ น์–ด ์„ค๋ช…
argocd app list ๋“ฑ๋ก๋œ ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜ ๋ชฉ๋ก ์กฐํšŒ
argocd app sync <APP> ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜ ๋™๊ธฐํ™” ์‹คํ–‰
argocd app get <APP> ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜ ๋ฐฐํฌ ์ƒํƒœ ํ™•์ธ
argocd app rollback <APP> <VERSION> ํŠน์ • ๋ฒ„์ „์œผ๋กœ ๋กค๋ฐฑ
argocd app delete <APP> ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜ ์‚ญ์ œ

 

โœ… ์ž๋™ ๋™๊ธฐํ™” ์ƒํƒœ ํ™•์ธ

argocd app get example-app

 

โœ… ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜ ๋™๊ธฐํ™” ์‹คํ–‰

argocd app sync example-app

 

โœ… GitOps ๋ฐฉ์‹์œผ๋กœ Kubernetes ๋ฐฐํฌ ์ƒํƒœ ํ™•์ธ

kubectl get deployments -n example-namespace

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

๐ŸŸข GitOps ๊ธฐ๋ฐ˜์˜ CI/CD ํŒŒ์ดํ”„๋ผ์ธ์„ ๊ตฌํ˜„ํ•˜๋ฉด ์šด์˜ ๋น„์šฉ์„ ์ ˆ๊ฐํ•˜๊ณ  ๋ฐฐํฌ ์†๋„๋ฅผ ํ–ฅ์ƒ ๊ฐ€๋Šฅ
๐ŸŸข Argo CD์˜ ์ž๋™ ๋™๊ธฐํ™”(Automated Sync) ๊ธฐ๋Šฅ์„ ํ™œ์šฉํ•˜์—ฌ Kubernetes ์ƒํƒœ๋ฅผ Git๊ณผ ํ•ญ์ƒ ์ผ์น˜ํ•˜๋„๋ก ์œ ์ง€ ๊ฐ€๋Šฅ
๐ŸŸข GitHub Actions์™€ Argo CD๋ฅผ ์—ฐ๋™ํ•˜์—ฌ ์ฝ”๋“œ ๋ณ€๊ฒฝ ์‹œ ์ž๋™์œผ๋กœ ๋ฐฐํฌ๊ฐ€ ์ด๋ฃจ์–ด์ง€๋„๋ก ์„ค์ • ๊ฐ€๋Šฅ
๐ŸŸข CI/CD ํŒŒ์ดํ”„๋ผ์ธ์„ ์ตœ์ ํ™”ํ•˜๋ฉด ๋ฐฐํฌ ์Šน์ธ, ๋ณด์•ˆ ๊ด€๋ฆฌ, ๋ชจ๋‹ˆํ„ฐ๋ง๊นŒ์ง€ ํฌํ•จํ•œ ์—”๋“œ ํˆฌ ์—”๋“œ(End-to-End) GitOps ๊ตฌ์ถ• ๊ฐ€๋Šฅ

728x90