📖 학습 목표
- CI/CD
- 무중단 배포
1. CI/CD
1) 용어 정리
- 라우팅(Routing): 사용자의 요청 URL을 지정된 서버의 기능이나 리소스에 연결하는 과정
- 컴파일(Compile): 프로그래머가 작성한 소스코드를 기계어로 변환하는 과정
- 빌드(Build): 소스코드를 실행 가능한 형태로 변환 + 실행에 필요한 환경을 구성하는 과정
- 빌드 ⊃ 컴파일
- ex: 컨테이너화된 빌드 (코드 실행에 필요한 환경 자체를 컨테이너로 패키징)
- 도구: Docker
- 배포(Deploy): 빌드의 결과물을 사용자가 접근할 수 있는 환경에 배치하는 것
- ex: ① 컨테이너화된 빌드의 결과물(컨테이너 이미지)을 배포 가능한 환경으로 업로드
- 도구: Docker Hub, ECR(AWS Elastic Container Registry), GitHub Container Registry 등
- ex: ① 컨테이너화된 빌드의 결과물(컨테이너 이미지)을 배포 가능한 환경으로 업로드
# 컨테이너 이미지 생성
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 작업을 자동으로 진행
- 지속적 제공 vs 지속적 배포: 마지막 Production 단계로 릴리스하는 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배로 필요 |
'개발 지식 > 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 |