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