Kubernetes Tools/ArgoCD

[Ep.33] [Argo CD ์šด์˜ ์ตœ์ ํ™” #3] Argo CD์™€ CI/CD ํŒŒ์ดํ”„๋ผ์ธ ์ตœ์ ํ™”

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

๐Ÿ”น Argo CD์™€ CI/CD์˜ ์—ฐ๊ณ„ ๊ฐœ์š”

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

 

โœ… Argo CD์™€ CI/CD ํŒŒ์ดํ”„๋ผ์ธ์„ ๊ฒฐํ•ฉํ•ด์•ผ ํ•˜๋Š” ์ด์œ 

โœ” CI(Continuous Integration) → ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜ ๋นŒ๋“œ ๋ฐ ์ปจํ…Œ์ด๋„ˆ ์ด๋ฏธ์ง€ ์ƒ์„ฑ ์ž๋™ํ™”
โœ” CD(Continuous Deployment) → Argo CD๊ฐ€ Git ๋ณ€๊ฒฝ ์‚ฌํ•ญ์„ ๊ฐ์ง€ํ•˜์—ฌ ์ž๋™ ๋ฐฐํฌ
โœ” ์ž๋™ํ™”๋œ ๋กค๋ฐฑ(Rollback) → ๋ฐฐํฌ ์‹คํŒจ ์‹œ Argo CD๊ฐ€ ์ด์ „ ๋ฒ„์ „์œผ๋กœ ๋ณต๊ตฌ ๊ฐ€๋Šฅ
โœ” ๋ฉ€ํ‹ฐ ์Šคํ…Œ์ด์ง€ ๋ฐฐํฌ ์ง€์› → Dev → Staging → Production ํ™˜๊ฒฝ์œผ๋กœ ์ ์ง„์  ๋ฐฐํฌ ๊ฐ€๋Šฅ

 

โœ… Argo CD์™€ CI/CD ์—ฐ๋™ ๋ฐฉ์‹

์—ฐ๋™ ๋ฐฉ์‹ ์„ค๋ช…
Git Webhook GitHub/GitLab Webhook์„ ํ™œ์šฉํ•˜์—ฌ ๋ณ€๊ฒฝ ์‚ฌํ•ญ์„ Argo CD์— ์•Œ๋ฆผ
Argo CD API CI/CD ํŒŒ์ดํ”„๋ผ์ธ์—์„œ Argo CD API๋ฅผ ํ˜ธ์ถœํ•˜์—ฌ ๋ฐฐํฌ ํŠธ๋ฆฌ๊ฑฐ
GitOps ๋ฐฉ์‹ CI์—์„œ Kubernetes ๋งค๋‹ˆํŽ˜์ŠคํŠธ ๋ณ€๊ฒฝ ํ›„ Git Push, Argo CD๊ฐ€ ๊ฐ์ง€ํ•˜์—ฌ ๋ฐฐํฌ

๐Ÿ”น 1. Argo CD์™€ GitHub Actions์„ ํ™œ์šฉํ•œ CI/CD ์ž๋™ํ™”

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

โœ… 1๏ธโƒฃ GitHub Actions์„ ํ™œ์šฉํ•œ CI/CD ํŒŒ์ดํ”„๋ผ์ธ ์˜ˆ์ œ

name: Deploy with Argo CD

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

jobs:
  build:
    runs-on: ubuntu-latest
    steps:
      - name: Checkout repository
        uses: actions/checkout@v2  # GitHub ์ €์žฅ์†Œ ์ฝ”๋“œ ๋‹ค์šด๋กœ๋“œ

      - name: Build Docker image
        run: |
          docker build -t ghcr.io/example/app:${{ github.sha }} .  # GitHub Container Registry์— ์ด๋ฏธ์ง€ ๋นŒ๋“œ
          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  # ๋งค๋‹ˆํŽ˜์ŠคํŠธ ์—…๋ฐ์ดํŠธ ํ›„ Git์— Push

  deploy:
    needs: build
    runs-on: ubuntu-latest
    steps:
      - name: Trigger Argo CD Sync
        run: |
          argocd app sync example-app  # Argo CD์—์„œ ๋ฐฐํฌ ๋™๊ธฐํ™” ์‹คํ–‰

 

โœ… ์„ค๋ช…:
โœ” build ๋‹จ๊ณ„ → Docker ์ด๋ฏธ์ง€๋ฅผ ๋นŒ๋“œํ•˜๊ณ  GitHub Container Registry(GHCR)์— Push
โœ” Update Kubernetes manifests ๋‹จ๊ณ„ → ์ƒˆ ์ด๋ฏธ์ง€๋ฅผ Kubernetes ๋งค๋‹ˆํŽ˜์ŠคํŠธ์— ๋ฐ˜์˜ ํ›„ Git์— Push
โœ” deploy ๋‹จ๊ณ„ → argocd app sync๋ฅผ ์‹คํ–‰ํ•˜์—ฌ Argo CD๊ฐ€ ๋ณ€๊ฒฝ ์‚ฌํ•ญ์„ ๋™๊ธฐํ™”

 

โœ… Argo CD Sync ๋ช…๋ น์–ด

argocd app sync example-app

 

โœ… Argo CD์—์„œ ํ˜„์žฌ ๋ฐฐํฌ ์ƒํƒœ ํ™•์ธ

argocd app get example-app

๐Ÿ”น 2. GitOps ๋ฐฉ์‹์„ ํ™œ์šฉํ•œ ๋ฐฐํฌ ์ž๋™ํ™”

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

โœ… GitOps ๋ฐฉ์‹์œผ๋กœ ๋ฐฐํฌํ•˜๋Š” Argo CD Application ์˜ˆ์ œ

apiVersion: argoproj.io/v1alpha1
kind: Application
metadata:
  name: example-app
  namespace: argocd
spec:
  project: default
  source:
    repoURL: https://github.com/example/repo.git
    targetRevision: main
    path: k8s  # Kubernetes ๋งค๋‹ˆํŽ˜์ŠคํŠธ๊ฐ€ ์ €์žฅ๋œ ๋””๋ ‰ํ„ฐ๋ฆฌ

  destination:
    server: https://kubernetes.default.svc
    namespace: example-app

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

 

โœ… ์„ค๋ช…:
โœ” source.repoURL → Kubernetes ๋งค๋‹ˆํŽ˜์ŠคํŠธ๊ฐ€ ์ €์žฅ๋œ Git ๋ฆฌํฌ์ง€ํ† ๋ฆฌ ์ง€์ •
โœ” syncPolicy.automated → Git ๋ณ€๊ฒฝ ์‚ฌํ•ญ์„ ์ž๋™์œผ๋กœ ๋ฐฐํฌ

 

โœ… Git Push ์‹œ Argo CD๊ฐ€ ์ž๋™์œผ๋กœ ๋ฐฐํฌ
1๏ธโƒฃ ๊ฐœ๋ฐœ์ž๊ฐ€ Kubernetes ๋งค๋‹ˆํŽ˜์ŠคํŠธ ๋ณ€๊ฒฝ ํ›„ Git์— Push
2๏ธโƒฃ Argo CD๊ฐ€ ๋ณ€๊ฒฝ ์‚ฌํ•ญ์„ ๊ฐ์ง€ํ•˜์—ฌ ์ž๋™์œผ๋กœ ๋ฐฐํฌ


๐Ÿ”น 3. Argo CD์™€ Argo Workflows๋ฅผ ํ™œ์šฉํ•œ CI/CD ํŒŒ์ดํ”„๋ผ์ธ ๊ตฌ์ถ•

Argo CD์™€ Argo Workflows๋ฅผ ํ•จ๊ป˜ ํ™œ์šฉํ•˜๋ฉด ์ปจํ…Œ์ด๋„ˆ ๊ธฐ๋ฐ˜์˜ ์›Œํฌํ”Œ๋กœ์šฐ๋ฅผ ์‹คํ–‰ํ•˜๊ณ  ์ž๋™์œผ๋กœ ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์„ ๋ฐฐํฌํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

โœ… Argo Workflows๋ฅผ ํ™œ์šฉํ•œ ๋ฐฐํฌ ํŒŒ์ดํ”„๋ผ์ธ ์˜ˆ์ œ

apiVersion: argoproj.io/v1alpha1
kind: Workflow
metadata:
  generateName: deploy-workflow-
spec:
  entrypoint: deploy
  templates:
    - name: deploy
      steps:
        - - name: build-image
            template: build

        - - name: update-manifest
            template: update

        - - name: sync-argo
            template: sync

    - name: build
      container:
        image: docker:latest
        command: ["sh", "-c"]
        args: ["docker build -t ghcr.io/example/app:latest . && docker push ghcr.io/example/app:latest"]

    - name: update
      container:
        image: alpine/git
        command: ["sh", "-c"]
        args: ["git clone https://github.com/example/repo.git && cd repo && sed -i 's|image:.*|image: ghcr.io/example/app:latest|' k8s/deployment.yaml && git commit -am 'Update image' && git push"]

    - name: sync
      container:
        image: argoproj/argocd-cli
        command: ["sh", "-c"]
        args: ["argocd app sync example-app"]

 

โœ… ์„ค๋ช…:
โœ” build → ์ปจํ…Œ์ด๋„ˆ ์ด๋ฏธ์ง€๋ฅผ ๋นŒ๋“œํ•˜๊ณ  GHCR์— Push
โœ” update → Kubernetes ๋งค๋‹ˆํŽ˜์ŠคํŠธ ์—…๋ฐ์ดํŠธ ํ›„ Git์— Push
โœ” sync → Argo CD์—์„œ ๋ฐฐํฌ ๋™๊ธฐํ™” ์‹คํ–‰

 

โœ… Argo Workflows ์‹คํ–‰ ๋ช…๋ น์–ด

argo submit deploy-workflow.yaml --watch

๐Ÿ”น 4. CI/CD ํŒŒ์ดํ”„๋ผ์ธ ์ตœ์ ํ™” ์‹œ ๊ณ ๋ คํ•  ์ 

โœ… 1๏ธโƒฃ ์ด๋ฏธ์ง€ ํƒœ๊ทธ ๊ด€๋ฆฌ
โœ” CI/CD ํŒŒ์ดํ”„๋ผ์ธ์—์„œ latest ํƒœ๊ทธ ๋Œ€์‹  Git SHA ๋˜๋Š” ๋ฒ„์ „ ํƒœ๊ทธ๋ฅผ ํ™œ์šฉํ•˜์—ฌ ๋กค๋ฐฑ ๊ฐ€๋Šฅํ•˜๊ฒŒ ๊ด€๋ฆฌ

 

โœ… 2๏ธโƒฃ ๋‹จ๊ณ„๋ณ„ ๋ฐฐํฌ(Blue-Green, Canary) ์ ์šฉ
โœ” Argo Rollouts๋ฅผ ํ™œ์šฉํ•˜์—ฌ ๋‹จ๊ณ„๋ณ„ ๋ฐฐํฌ(Blue-Green, Canary ๋ฐฐํฌ)๋ฅผ ์ ์šฉํ•˜์—ฌ ์•ˆ์ •์„ฑ ๊ฐ•ํ™”

 

โœ… 3๏ธโƒฃ GitOps ๊ธฐ๋ฐ˜์œผ๋กœ ๋ชจ๋“  ๋ณ€๊ฒฝ ์‚ฌํ•ญ์„ Git์— ์ €์žฅ
โœ” CI/CD ํŒŒ์ดํ”„๋ผ์ธ์—์„œ Kubernetes ๋งค๋‹ˆํŽ˜์ŠคํŠธ๋ฅผ Git์— ๋ฐ˜์˜ ํ›„ Argo CD๊ฐ€ ๋ฐฐํฌ


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

๐ŸŸข GitHub Actions๊ณผ Argo CD๋ฅผ ์—ฐ๊ณ„ํ•˜์—ฌ CI/CD ์ž๋™ํ™” ๊ฐ€๋Šฅ
๐ŸŸข Argo Workflows๋ฅผ ํ™œ์šฉํ•˜์—ฌ ๋ณต์žกํ•œ ๋ฐฐํฌ ํŒŒ์ดํ”„๋ผ์ธ์„ ์ž๋™ํ™” ๊ฐ€๋Šฅ
๐ŸŸข GitOps ๋ฐฉ์‹์œผ๋กœ ๋ฐฐํฌ ์ž๋™ํ™”ํ•˜๋ฉด ๋ณ€๊ฒฝ ์‚ฌํ•ญ ์ถ”์  ๋ฐ ๋กค๋ฐฑ ์šฉ์ด
๐ŸŸข Argo CD์™€ CI/CD ์—ฐ๊ณ„๋ฅผ ํ†ตํ•ด ๋ฐฐํฌ ํšจ์œจ์„ฑ์„ ๊ทน๋Œ€ํ™” ๊ฐ€๋Šฅ

728x90