?
사용자

GitOps 기반 CI/CD 파이프라인 구축 가이드: Docker, Kubernetes, GitHub Actions 활용

GitOps의 개념을 이해하고, Docker, Kubernetes, GitHub Actions를 활용하여 실제 운영 가능한 CI/CD 파이프라인을 구축하는 방법을 안내합니다. 코드 변경부터 배포, 롤백까지 자동화하는 실용적인 가이드입니다.

#gitops#cicd#docker#kubernetes#github actions
recipe.md

GitOps란 무엇인가?

GitOps는 Git 저장소를 '단일 진실 공급원(Single Source of Truth)'으로 삼아 인프라 및 애플리케이션의 선언적 구성을 관리하고, 이를 자동으로 프로비저닝 및 동기화하는 운영 방식입니다. 즉, Git에 커밋된 내용이 곧 시스템의 원하는 상태가 됩니다.

주요 원칙:

  • 선언적 구성: 시스템의 모든 구성 요소(애플리케이션, 인프라, 정책 등)는 선언적으로 정의되어야 합니다.
  • Git로의 커밋: 시스템의 원하는 상태는 Git 저장소에 커밋됩니다.
  • 자동화된 적용: Git에 대한 변경 사항은 자동으로 감지되어 실제 시스템에 적용됩니다.
  • 실제 상태와의 동기화: GitOps 에이전트는 실제 시스템의 상태를 Git의 선언적 상태와 지속적으로 비교하고 동기화합니다.

GitOps의 장점:

  • 향상된 가시성 및 감사: 모든 변경 사항이 Git 기록에 남아 추적이 용이합니다.
  • 신뢰성 및 일관성: 자동화된 프로세스를 통해 배포 오류를 줄입니다.
  • 빠른 복구: 문제가 발생했을 때 이전의 안정적인 Git 상태로 롤백하기 쉽습니다.
  • 보안 강화: Git의 접근 제어 및 감사 기능을 활용합니다.

CI/CD 파이프라인 구축 단계

이 가이드에서는 Docker 컨테이너화된 애플리케이션을 Kubernetes 클러스터에 GitOps 방식으로 배포하는 CI/CD 파이프라인을 GitHub Actions를 사용하여 구축합니다. IaC 도구로 Terraform을 활용합니다.

1. 사전 준비

  • GitHub 저장소: 애플리케이션 코드와 Kubernetes Manifest(또는 Helm Chart)를 별도의 브랜치 또는 저장소에서 관리합니다. (예: app-code, k8s-config)
  • Docker Hub/ECR/GCR 계정: 컨테이너 이미지를 푸시할 레지스트리.
  • Kubernetes 클러스터: Amazon EKS, Google GKE, Azure AKS 또는 로컬 클러스터(Minikube, Kind) 등.
  • Terraform: 인프라 프로비저닝 (선택 사항).
  • GitHub Actions 워크플로우 파일: .github/workflows/ 디렉토리에 YAML 파일 생성.

2. 애플리케이션 빌드 및 푸시 (CI)

GitHub Actions는 애플리케이션 코드 저장소에 변경 사항이 푸시될 때 트리거됩니다. Docker 이미지를 빌드하고 컨테이너 레지스트리에 푸시합니다.

# .github/workflows/ci.yml
name: CI Pipeline

on:
  push:
    branches: [ main ] # 또는 develop, feature/* 등

jobs:
  build:
    runs-on: ubuntu-latest
    steps:
    - uses: actions/checkout@v3
    - name: Login to Docker Hub
      uses: docker/login-action@v2
      with:
        username: ${{ secrets.DOCKERHUB_USERNAME }}
        password: ${{ secrets.DOCKERHUB_TOKEN }}
    - name: Build and push Docker image
      uses: docker/build-push-action@v4
      with:
        context: .
        push: true
        tags: your-dockerhub-username/your-app-name:latest

3. Kubernetes Manifest 업데이트 및 GitOps 트리거 (CD)

애플리케이션 이미지가 성공적으로 빌드 및 푸시되면, Kubernetes Manifest(또는 Helm Chart)를 관리하는 저장소의 특정 브랜치에 변경 사항을 커밋합니다. 이 변경 사항은 Kubernetes 클러스터에 배포를 트리거합니다.

  • 방법 1: Git Push 자동화

    CI 파이프라인에서 Manifest 저장소로 변경 사항을 푸시하는 워크플로우를 추가합니다. (예: 이미지 태그 업데이트)

  • 방법 2: GitOps 도구 사용 (Argo CD, Flux CD)

    k8s-config 저장소를 모니터링하는 Argo CD 또는 Flux CD와 같은 GitOps 도구를 Kubernetes 클러스터에 설치합니다. 이 도구는 Git 저장소의 변경 사항을 감지하고 자동으로 클러스터에 적용합니다.

예시: GitHub Actions에서 Manifest 업데이트

# .github/workflows/cd.yml (CI 파이프라인에 통합될 수도 있음)
name: CD Pipeline

on:
  push:
    branches: [ main ] # CI 성공 시 트리거

jobs:
  deploy:
    runs-on: ubuntu-latest
    steps:
    - name: Checkout app code repository
      uses: actions/checkout@v3
      with:
        repository: your-github-username/app-code
        path: app-code

    - name: Checkout Kubernetes manifests repository
      uses: actions/checkout@v3
      with:
        repository: your-github-username/k8s-config
        ref: main # 또는 target branch
        path: k8s-config

    - name: Update Kubernetes manifest (e.g., deployment.yaml)
      run: |
        sed -i 's|image: .*|image: your-dockerhub-username/your-app-name:latest|g' k8s-config/deployment.yaml
        # 필요하다면 Helm Chart 값도 업데이트

    - name: Commit and push changes to k8s-config repo
      uses: EndBug/add-and-commit@v7
      with:
        author_name: GitHub Actions Bot
        message: 'Update image to latest for your-app-name'
        committer_email: actions-bot@github.com
        github_token: ${{ secrets.GITHUB_TOKEN }}
        add_options: '-A'
        branch: main # 또는 target branch
      working-directory: ./k8s-config

4. GitOps 도구 설정 (Argo CD 예시)

  • Kubernetes 클러스터에 Argo CD를 설치합니다.
  • Argo CD CLI 또는 UI를 사용하여 k8s-config 저장소를 애플리케이션으로 추가합니다.
  • k8s-config 저장소의 main 브랜치와 클러스터의 네임스페이스를 동기화하도록 설정합니다.

5. 배포, 롤백, 헬스체크, 로깅, 시크릿 관리

  • 배포: GitOps 도구가 Git 변경 사항을 감지하면 자동으로 Kubernetes에 적용합니다. (예: kubectl apply -f 또는 Helm 릴리스 업데이트)
  • 롤백: 이전 버전의 애플리케이션으로 돌아가려면, Git에서 이전 커밋으로 돌아가거나 해당 커밋을 다시 푸시합니다. GitOps 도구가 이를 감지하고 적
0
스크랩
3
좋아요
0
댓글