사용자에게 끊김 없는 서비스 제공을 위해 Quizly 서비스에서 블루/그린(Blue/Green) 무중단 배포 전략을 적용하기로 하였습니다. 본 글에서 검토한 무중단 배포 전략과 최종적으로 확정한 인프라 아키텍처를 적용과정을 공유합니다.

1. 아키텍처 분석 및 설계

1.1 배포 전략 분석 및 고정 비용

무중단 배포를 구현하는 방식은 인프라 구성에 따라 다양합니다. NCP 환경을 기준으로 세 가지 옵션을 검토하고 배포에 필요한 고정 비용을 계산해보았습니다.

  1. 단일 서버 내 Nginx 리버스 프록시 (Server)

    한 대의 서버에 두 개의 Spring Boot 컨테이너를 띄우고 Nginx가 트래픽을 스위칭하는 방식입니다. 별도의 로드 밸런서(LB) 비용이 발생하지 않아 가장 경제적입니다.

  2. NCP Load Balancer + Target Group (Server, LB)

    NCP의 Load Balancer와 두 개의 Target Group(Blue/Green)을 이용해 트래픽을 분산하는 방식입니다. 인프라 레벨에서 트래픽을 제어하므로 안정성이 높지만, 매월 약 1.9만 원의 고정 비용이 증가합니다.

  3. NCP Kubernetes Service (NKS)

    컨테이너 기반(Docker) 운영에 최적화된 쿠버네티스의 Rolling Update 전략을 사용하는 방식입니다. 쿠버네이트스 관련 지식이 필요하며 고정 비용이 크게 증가합니다.

1.2 아키텍처 확정 및 선정 이유

NCP에서 지원 받은 100만원으로 6개월 이상의 실 서비스 운영을 목표로 비용과 운영 지속성을 최우선으로 고려하여 “단일 서버 내 Nginx 리버스 프록시” 방식을 최종 채택했습니다. 또한 현재 서비스 규모에서 NKS와 같은 고도화된 도구는 오버엔지니어링으로 판단했습니다.

2. 사전 지식과 네이밍 규칙

2.1 Blue/Green 배포

무중단 배포 전략 중 하나인 Blue/Green 배포는 구버전(Blue)과 신버전(Green) 두 세트를 동시에 구동하는 방식입니다.

2.2 Nginx의 역할

Nginx는 웹 서버로 선택한 아키텍처에서 리버스 프록시(Reverse Proxy) 역할을 수행하는 컴포넌트입니다.

2.3 ACG와 NACL(ACL)

네이버 클라우드 플랫폼(NCP)에서 네트워크 보안을 설계 시 매번 헷갈려서… 정리해보았습니다.

구분 ACG (Access Control Group) NACL (Network Access Control List)
적용 단위 서버(VM) 단위 서브넷(Subnet) 단위
작동 방식 Stateful: 요청을 허용하면 응답은 자동 허용 Stateless: Inbound/Outbound 규칙을 각각 명시
제어 범위 개별 인스턴스의 접근 제어 서브넷 전체의 네트워크 흐름 제어
주요 용도 특정 애플리케이션 포트 개방 네트워크 대역별 차단 및 허용

2.4 네이밍 및 환경 관리 규칙

이전 프로젝트에서 인프라 자원의 네이밍이 혼동되어 있어서 용도 파악에 힘들었던 경험이 있어서 설계 시작 전에 네이밍 규칙을 정하였습니다.

3. CI/CD 파이프라인

IMG_DAF438B3506C-1.jpeg

3.1 CI (Continuous Integration): 빌드 및 이미지 생성

CI 단계의 목표는 “컨테이너 이미지를 만드는 것”입니다.

  1. GitHub Actions 감지

    → 개발자가 main 브랜치에 코드를 Push하면 미리 정의된 deploy.yml 트리거됩니다.

  2. 프로젝트 빌드

    → Java 가상 환경에서 Spring Boot 프로젝트를 컴파일 후JAR 파일을 생성합니다.

  3. 보안 설정 주입

    GitHub Secrets에서 가져와 빌드 시점에 application.yml로 주입합니다.

  4. 도커 이미지 생성 및 업로드

    → 생성된 Docker 이미지를 NCR(Naver Container Registry)로 Push하여 배포 준비를 합니다.

3.2 CD (Continuous Deployment): 무중단 배포 및 스위칭

CD 단계의 목표는 "서비스 중단 없이 신규 버전을 실서버에 반영하는 것"입니다. 해당 부분에서 Blue/Green 전략이 실제로 구현됩니다.

  1. 배포 스크립트 실행
  2. 이미지 다운로드 (Pull)
  3. 컨테이너 실행 (Blue/Green)
  4. 헬스 체크 (Health Check)
  5. 포트 스위칭 (Nginx Reload)
  6. 구버전 종료