블랙프라이데이 기간 동안 13%의 요청 오류가 발생했지만, 서버 다운은 전혀 없었습니다. 컨테이너화 배포 덕분에 서버 비용을 60% 절감할 수 있었습니다.
지난해 블랙프라이데이에 우리의 주소 해석 인터페이스가 완전히 마비되었습니다. 13%의 요청이 429 오류를 보였고, 고객 서비스 부서는 300건이 넘는 상점들의 불만을 받았습니다. 3개의 백엔드 서버가 24시간 동안 연속으로 작동하며 피크 부하를 견뎌냈습니다. 당시 우리의 서비스는 두 대의 고정된 구성의 클라우드 서버에서 실행되고 있었으며, 확장 및 축소는 모두 수동으로 설정을 변경하는 방식으로 이루어졌습니다. 새로운 인스턴스가 준비되어도 트래픽 피크는 이미 지나간 후였습니다.
먼저 컨테이너화 배포가 무엇인지 설명해 드리겠습니다.
간단히 말해, 코드, 의존 라이브러리, 설정 파일을 모두 하나의 표준화된 “컨테이너”에 포함시켜 몇 MB에서 수백 MB까지의 파일로 만드는 것입니다. 이 컨테이너를 어떤 서버에서 실행하든 실행 환경이 100% 동일하게 유지됩니다. 우리가 처음에 패키징한 주소 해석 서비스 이미지의 크기는187MB시작 과정을 완료하는 데 10초 이상 걸리지 않습니다.
실제로 우리가 얻은 3가지 핵심 수익

- 자동 확장 및 축소 기능이 정말 큰 도움이 되었습니다: 올해 블랙프라이데이에 트래픽이 3배로 증가했는데, 시스템이 자동으로 27개의 컨테이너 인스턴스를 실행했고, 피크가 지난 후에는 자동으로 3개로 축소되었습니다. 전 과정에서 인간의 개입이 전혀 없었으며, 오류율은 0.1% 미만으로 바로 감소했습니다.
- 환경이 일치하지 않아 발생하던 버그가 완전히 사라졌습니다: 이전에는 로컬에서는 문제가 없었지만 서버에 올리면 바로 오류가 발생하던 이상한 문제들이었는데, 이런 문제들이 전체 버그의 40%를 차지했습니다. 컨테이너로 이전한 후에는 이런 종류의 문제가 단 한 건도 더 이상 발생하지 않았습니다.
- 서버 비용이 절반으로 줄었습니다: 이전에는 피크 시간을 버텨내기 위해 고사양 서버 8대를 상시 임대했는데, 평소 사용률은 15%에 불과했습니다. 이제는 실제 사용량에 따라 비용을 지불하므로 연간으로 보면 서버 비용이 60% 절감되었습니다.
이점만 보지 말고, 우리는 이 몇 가지 문제들을 실제로 겪어봤어요.
컨테이너에 처음 올렸을 때는 편하게 하려고 로그와 임시 파일들을 모두 컨테이너 안에 저장했는데, 결과적으로 인스턴스가 자동으로 종료되면서 3일간의 요청 로그가 모두 사라져버렸습니다. 데이터를 복구하는 데 무려 이틀이나 걸렸습니다. 또 다른 경우에는 이미지에 불필요한 의존성들이 너무 많이 포함되어 있어서 시작 시간이 10초에서 2분으로 급격히 증가했고, 갑작스러운 트래픽이 발생했을 때 확장할 시간이 전혀 없어서 거의 다시 장애가 날 뻔했습니다.
가장 쉽게 간과되는 문제는 권한 문제입니다. 처음에는 컨테이너에 root 권한을 부여했는데, 이후 마이닝 프로그램이 이를 악용하여 CPU 리소스의 30%를 차지하게 되었습니다. 한 주가 지나서야 모니터링을 통해 이를 발견할 수 있었습니다.
먼저, 당신이 정말로 그것을 사용해야 하는지 잘 생각해보세요.

만약 여러분이 소규모 팀이고, 트래픽 변동이 거의 없는 내부 도구를 개발하고 있으며, 서비스도 단 1-2개뿐이라면 굳이 복잡하게 할 필요가 없습니다. 그냥 서버를 임대해서 사용하는 것이 가장 간편할 것입니다.
하지만 만약 서비스 트래픽의 변동이 크거나, 자주 업데이트를 해야 하거나, 팀 내에서 다른 사람들이 개발하는 환경들이 서로 충돌하는 경우가 많거나, 아니면 사용하지 않는 서버 리소스에 돈을 낭비하고 있다면, 컨테이너화 배포를 한 번 시도해 보는 데 일주일의 시간을 투자하는 것은 분명 가치가 있습니다.
처음 시작하는 분들을 위한 3가지 구체적인 조언
- K8S 클러스터를 바로 사용하기보다는 먼저 Docker Compose를 사용해 단일 머신에서 배포를 해보세요. 패키징, 실행, 로그 마운팅의 과정을 잘 이해하는 것이 중요합니다. 저희도 지난 3개월 동안 그렇게 해왔으며, 충분히 효과적이었습니다.
- 첫 번째 이미지를 패키징할 때는 “최소 원칙”을 따라 실행에 필요한 의존성만 포함시켰습니다. Alpine 기반 이미지를 사용하면 이미지의 크기를 절반 이상 줄일 수 있습니다.
- 생성된 모든 데이터와 로그는 반드시 컨테이너 외부의 저장 볼륨에 마운트해야 하며, 절대로 컨테이너 내부에 저장되어서는 안 됩니다. 이 내용은 팀의 운영 지침서 맨 앞부분에 명시되어 있습니다.
흔한 질문들에 대한 답변
질문: 우리 팀에는 컨테이너에 대해 아는 사람이 없는데, 학습 비용이 너무 높지 않을까요?
기본 사용법에 대해서는 공식 입문 문서를 2일 정도 읽으면 첫 번째 서비스를 실행할 수 있습니다. 좀 더 복잡한 클러스터 설정은 실제로 필요할 때 배우셔도 전혀 문제없습니다.
질문: 기존 서비스를 컨테이너로 마이그레이션하는 것이 꽤 번거로울까요?
우리의 3개 백엔드 서비스는 일주일 만에 모두 마이그레이션을 완료했으며, 대부분의 시간은 의존성을 정리하는 데 사용되었습니다. 실제로 Dockerfile을 작성하는 데 걸린 시간은 1일도 채 되지 않았습니다.
도움이 되었나요?