Skip to content

BLUE GREEN 무중단 배포

Jay_ edited this page Sep 2, 2022 · 11 revisions

1. 도입 이유

API를 프론트-백에서 맞춰가는 와중에, FileZilla를 이용하여 프로젝트 빌드 후 수동배포를 하다보니, 사소한 에러의 발생에도 서버를 올렸다 내렸다하는 비효율적인 작업량이 많아지게 되었다. 제한된 시간 속에서 프로젝트가 이루어지고 있는 상황상 효율적인 방법이 있지 않을까 해서 자동배포를 고려하게 되었다.

2. 문제 상황

자동 배포를 고려하는 부분에서 추가적인 문제 상황에 대한 가정을 하게 되었다. 개선된 빌드를 재배포 하기 위해서는 추가적으로 웹 어플리케이션이 가동중에 서버를 내려야 하는 상황이 발생한다. 만약 서비스 운영 중에 서버를 내렸다 올리게되면, 짧은 시간이더라도 유저들이 접속했을 때 서비스를 사용하지 못하는 문제가 발생하게 되고, 당연히 사용자들의 요청을 처리할 수 없다.

3. 해결 방안

따라서 CI/CD를 추가하여, 서비스 배포 이후에도 서비스 중단없이 유저의 사용성을 보장하는 방식으로 인프라를 구축하게 되었다. 프로젝트를 개발하는 우리 역시, 중단 배포를 한 뒤 새로 배포된 배포파일이 문제 없이 100프로 가동된다는 점을 확신할 수 없기 때문에, 무중단 배포를 하게 되면 서버에 대한 부담을 덜 수 있다고 판단했다.

4. 의견 조율

CI/CD

Option 1) Jenkins
Option 2) Github Action
Option 3) Travis

Jenkins의 경우 다양한 커스터마이징이 가능하나 서버를 별도로 운영해야하는 문제점이 있었다. 또한 다른 CI/CD를 구성하는 것보다 학습량이 많이 필요하여 프로젝트 기한 상 좀 더 쉬운 옵션을 찾아가기로 했다.
Github Action은 Jenkins에 비해 쉬운 설정과, 깃허브와 같이 사용하기 쉽다는 점이 가장 큰 장점으로 꼽혔다. 깃허브를 협업툴로 사용하고 있었기 때문에, 고려되던 Travis CI에 비해서 깃액션의 장점이 매우 커, 최종적으로 깃허브 액션을 사용하게 되었다.

DevOps

Option 1) Rolling Deployment Strategy
Option 2) Blue-Green Deployment Strategy
Option 3) Canary Deployment Strategy

롤링 배포의 경우, 가장 기본적인 방식으로 사용 중인 인스턴스 내에서 새 버전을 점진적으로 교체하는 것이다. 인스턴스마다 차례로 배포를 진행해 롤백이 가능하지만, 새 버전을 배포할 때 인스턴스 수가 증가하기 때문에 서비스 처리 용량을 고려해야 하고, 배포 진행 시 구 버전과 신 버전이 공존하는 호환성 문제로 인해서 다른 방법을 생각하게 되었다. 카나리 배포의 경우, A/B테스트나 특정 비율에 따른 버전을 사용할 수 있게 제공할 수 있으나 현재 우리 프로젝트에서 운용하기에는 규모 방법이 크다고 판단하여 블루-그린 배포 방법을 선택하게 되었다.
블루-그린 배포는 블루를 구버전, 그린을 신버전으로 지칭하며 구버전과 동일하게 신버전의 인스턴스를 구성 후, 로드밸런서를 통해 신버전으로 트래픽을 전환하는 배포방식이다. 블루에서 그린으로 프로덕션 트래픽이 이전되면 블루는 롤백에 대비해 대기로 두거나, 프로덕션에서 가져온 후 업데이트 하여 현 배포버전의 다음 빌드를 준비할 수 있게 된다.

5. 의견 결정

프로젝트의 규모와 시간자원을 고려하여, CI는 깃액션으로, 로드 밸런서 및 프록시 서버로 Nginx를 사용하여 블루-그린 배포를 진행하게 되었다. Nginx는 reversed proxy를 서버 블록에 적용하여, 해당 서버에 접속하는 클라이언트에게 서버 IP를 모두 숨길 수 있게 하였다. 제공하는 프록시 서버의 IP만 공개하면서 해킹에 대한 대비를 할 수 있게 된다는 장점이 있다.

server {
	
     listen 80;

	 ...
    
     location ^~ /api {
        proxy_pass http://localhost:3000;
        proxy_http_version 1.1;
        proxy_set_header Host $host;
        proxy_set_header X-Real-IP $remote_addr;
     }
    
     ...
    
}

6. 레퍼런스

무중단 배포 아키텍처
배포 전략의 종류
Blue-GreenDeployment(블루 그린 배포)란?
Nginx - Reverse Proxy 설정 및 요소 이해하기

Clone this wiki locally