본문 바로가기
개발 지식/CI, CD

CI/CD와 무중단 배포

by gamdong2 2024. 12. 19.

📖 학습 목표

  • CI/CD
  • 무중단 배포

1. CI/CD

1) 용어 정리

  • 라우팅(Routing): 사용자의 요청 URL을 지정된 서버의 기능이나 리소스에 연결하는 과정
  • 컴파일(Compile): 프로그래머가 작성한 소스코드를 기계어로 변환하는 과정
  • 빌드(Build): 소스코드를 실행 가능한 형태로 변환 + 실행에 필요한 환경을 구성하는 과정
    • 빌드 ⊃ 컴파일
    • ex: 컨테이너화된 빌드 (코드 실행에 필요한 환경 자체를 컨테이너로 패키징)
      • 도구: Docker
  • 배포(Deploy): 빌드의 결과물을 사용자가 접근할 수 있는 환경에 배치하는 것
    • ex: ① 컨테이너화된 빌드의 결과물(컨테이너 이미지)을 배포 가능한 환경으로 업로드
      • 도구: Docker Hub, ECR(AWS Elastic Container Registry), GitHub Container Registry 등
# 컨테이너 이미지 생성
docker build -t my-python-app .

# 이미지 업로드
docker push my-dockerhub-username/my-python-app:latest

# 결과: Docker Hub에 컨테이너 이미지가 저장되며, 이 이미지는 다른 사용자나 서버에서 다운로드 가능
  • ex: ②-1 서버에 컨테이너 배포
    • 도구: Docker CLI, EKS(AWS Elastic Kubernetes Service), Kubernetes, AWS ECS 등
# 컨테이너 이미지를 서버에서 다운로드
docker pull my-dockerhub-username/my-python-app:latest

# 컨테이너 실행

docker run -d -p 5000:5000 my-dockerhub-username/my-python-app:latest
# 결과: 애플리케이션의 서버의 http://<서버 IP>:5000에서 실행 가능
  • ex: ②-2 클라우드 기반 컨테이너 배포
# AWS ECR에 이미지 업로드
aws ecr create-repository --repository-name my-python-app
docker tag my-python-app <AWS_ACCOUNT_ID>.dkr.ecr.<REGION>.amazonaws.com/my-python-app:latest
docker push <AWS_ACCOUNT_ID>.dkr.ecr.<REGION>.amazonaws.com/my-python-app:latest

# AWS ECS에서 서비스 생성 → 서비스 배포
  • ex: ②-3 Kubernetes(K8s)를 사용한 배포
# Kubernetes 클러스터에 컨테이너 이미지 배포
# 클러스터 환경에서 deployment.yaml 작성
apiVersion: apps/v1
kind: Deployment
metadata:
  name: my-python-app
spec:
  replicas: 3
  selector:
    matchLabels:
      app: my-python-app
  template:
    metadata:
      labels:
        app: my-python-app
    spec:
      containers:
      - name: my-python-app
        image: my-dockerhub-username/my-python-app:latest
        ports:
        - containerPort: 5000

# 배포 명령어
kubectl apply -f deployment.yaml

# 서비스 노출
# Kubernetes에서 service.yaml 작성하여 외부 트래픽을 애플리케이션에 연결
apiVersion: v1
kind: Service
metadata:
  name: my-python-app-service
spec:
  selector:
    app: my-python-app
  ports:
    - protocol: TCP
      port: 80
      targetPort: 5000
  type: LoadBalancer

# kubectl apply -f service.yaml로 서비스 생성
# 결과: 클라우드 제공자의 로드 밸런서를 통해 사용자들이 접근 가능

 

2) CI 란?

  • CI (Continuous Integration): 지속적 통합이라는 뜻으로, 개발을 진행하면서도 품질을 관리할 수 있도록 여려 명이 하나의 코드에 대해서 수정을 진행해도 지속적으로 통합하면서 관리할 수 있음

3) CD 란?

  • CD (Continuous Deployment): 지속적 배포라는 뜻으로, 빌드의 결과물을 프로덕션으로 릴리스하는 작업을 자동화 하는 것
    • 지속적 제공 vs 지속적 배포: 마지막 Production 단계로 릴리스하는 Deploy 작업의 자동화 여부
      • 지속적 제공: Deploy 작업을 수동으로 진행
      • 지속적 배포: Deploy 작업을 자동으로 진행

 

4) CI/CD 흐름

 

2. 무중단 배포

1) 무중단 배포란?

  • 다운 타임 없이 서버를 운영할 수 있게 해주는 배포 방식

2) 기존 배포 vs 무중단 배포

 

3) 무중단 배포 구현 방법

  • AWS Blue-Green
  • Docker
  • L4, L7 스위치
  • Nginx

4) 리버스 프록시

  • 인터넷과 서버 사이에 위치한 중계 서버
  • 클라이언트가 요청한 내용을 캐싱
  • 서버 정보를 클라이언트로부터 숨길 수 있어 보안에 용이

 

5) 로드 밸런싱

  • 서버에 가해지는 부하(Client 요청)를 분산해주는 역할
  • 하나의 서버가 멈추더라도 서비스 중단 없이 다른 서버가 서비스를 계속 유지할 수 있는 무중단 배포가 가능

6) 무중단 배포 방식

  • Rolling 배포
    • 무중단 배포의 가장 기본적인 방식
    • 서버를 차례대로 업데이트 시킴
장점 단점
- 인스턴스를 추가하지 않아도 되어 관리가 간편 - 사용중인 인스턴스에 트래픽이 몰릴 수 있음
- 구버전과 신버전의 공존으로 인한 호환성 문제
  • Canary 배포
    • 신버전을 소수의 사용자들에게만 배포
    • 문제가 없는 것이 확인되면 점진적으로 다른 서버에 신버전 배포
장점 단점
- 문제 상황을 빠르게 감지 가능
- A/B 테스트로 활용 가능
- 모니터링 관리 비용
- 구버전과 신버전의 공존으로 인한 호환성 문제
  • Blue/Green 배포
    • Blue를 구버전, Green을 신버전으로 지칭
    • 구버전과 동일하게 신버전의 인스턴스를 구성
    • 신버전 배포 시 로드 밸런서를 통해 신버전으로만 트래픽을 전환
장점 단점
- 배포 속도가 빠름
- 신속하게 롤백 가능
- 남아 있는 기존 버전의 환경을 다음 배포에 재사용
- 시스템 자원이 2배로 필요

 

 

 

 

 

Ref: https://www.youtube.com/watch?v=sIPU_VkrguI

'개발 지식 > CI, CD' 카테고리의 다른 글

04. [실습] GitHub Actions 기본 문법 정리  (0) 2024.12.17
03. GitHub Actions CI/CD 흐름  (0) 2024.12.17
02. GitHub Actions  (0) 2024.12.17
01. CI/CD를 왜 배우는 걸까?  (0) 2024.12.17