Physical Address
South Korea
Physical Address
South Korea


IDC에서 IT인프라 엔지니어로 20년 넘게 일하면서 최근에 가장 많이 들은 질문 중 하나가 바로 이겁니다.
“요즘 다들 도커(Docker)니 쿠버네티스(Kubernetes)니 하던데, 우리 서비스도 컨테이너로 바꿔야 할까요?”
특히 배포가 1년에 몇 번 없고, 트래픽 변동도 거의 없으며, 구조가 단순한 이른바 ‘얌전한 서비스’를 운영하는 동료들이 이런 고민을 많이 토로합니다. 겉으로는 “우리도 최신 기술 도입해야지!”라고 외치지만, 속으로는 ‘지금 VM(가상 머신)으로도 아무 문제 없이 평화로운데, 굳이 왜 사서 고생을 해야 하지?’라는 강한 의구심이 드는 것이죠. 이번에 프로젝트를 진행하면서도 컨테이너 환경으로 구성해야 하지 않는가? 하는 질문을 많이 받았습니다.
PI 단계에서는 구체적인 아키텍처와 서비스를 고려하지 않고 최신 기술을 적용하려는 경향이 많습니다. 자사 프로젝트에서도 처음 PI 단계에서는 컨테이너 환경의 마이크로 서비스로 계획을 했었으나 구체화 단계에서 VM OS 환경으로 구축을 진행했습니다.
배포가 많지 않고 운영 복잡성이 없는 서비스라면 VM OS 구성이 훨씬 더 현명하고 안정적인 선택입니다.
오늘 글에서는 제가 실제 현업에서 두 환경을 모두 밑바닥부터 운영하며 뚝배기(?)가 깨져본 생생한 경험담을 바탕으로, VM과 컨테이너의 장단점을 아주 적나라하게 비교해 드리겠습니다. 유행에 휩쓸려 후회하지 않고, 내 서비스에 딱 맞는 정답을 찾는 기준이 될 것입니다.
몇 년 전, 회사에서 비교적 규모가 작고 안정적인 사내 관리용 인트라넷 시스템의 인프라를 이전할 기회가 있었습니다. 당시 업계는 그야말로 ‘컨테이너 광풍’이 불고 있었습니다. 테크 컨퍼런스에 가면 온통 쿠버네티스 이야기뿐이었고, VM을 쓰는 사람은 마치 구시대의 유물처럼 취급받던 시절이었죠.
저 역시 “이 트렌디한 기술을 내 이력서에 넣고 말겠다”는 사심(?)과 “컨테이너로 바꾸면 자원 효율성도 좋아지고 관리도 편해지겠지”라는 막연한 환상을 품고 이 프로젝트를 도커 컨테이너 기반으로 전환하기 시작했습니다.
그때는 몰랐습니다. 그 결정이 지옥의 시작이었음을요.
기존 VM 환경에서는 CentOS 위에 Nginx와 Tomcat을 올리고, 배포할 때 젠킨스로 빌드된 war 파일만 지정된 경로에 던져주면 끝이었습니다. 배포가 한 달에 한 번 있을까 말까 한 서비스였기에 아주 평화로웠죠.
그런데 컨테이너로 바꾸려니 신경 써야 할 게 한두 개가 아니었습니다.
배포가 잦지 않은 서비스인데, 배포 환경을 만들기 위해 몇 배의 시간을 쏟아야 했습니다. 배보다 배꼽이 더 커진 상황이었죠.
컨테이너 환경으로 바꾼 지 2주째 되던 날, 서비스가 먹통이 되었습니다. VM 시절에는 문제가 생기면 익숙하게 SSH로 접속해서 top 명령어를 치고, systemctl status를 보거나 /var/log 밑에 있는 로그를 뒤지면 10분 만에 원인이 나왔습니다.
하지만 컨테이너 환경은 달랐습니다. 컨테이너 내부로 들어가 보려 해도 가볍게 만든답시고 alpine 이미지를 써서 curl도 없고, netstat도 없고, vi 에디터조차 실행되지 않았습니다. 로그를 보려 하니 컨테이너는 이미 죽어버려서 내부 로그를 볼 수도 없었죠.
결국 컨테이너 오케스트레이션 툴의 네트워크 라우팅 꼬임과 컨테이너 메모리 제한(OOM Killer) 때문이라는 것을 알아내는 데 꼬박 이틀이 걸렸습니다. 그때 뼈저리게 깨달았습니다. “아, 다루기 쉬운 장난감 하나 고치려다, 엔진 구조도 모르는 슈퍼카를 사버렸구나.”
제가 삽질한 경험담을 털어놓았지만, 그렇다고 컨테이너가 나쁜 기술이라는 뜻은 결코 아닙니다. 컨테이너는 현대 소프트웨어 아키텍처에서 신의 축복과도 같은 존재임은 틀림없습니다. 다만 ‘어떤 서비스인가’에 따라 그 가치가 달라질 뿐입니다.
가상 머신(VM)과 컨테이너의 본질적인 차이를 이해하면, 왜 사람들이 그토록 컨테이너를 외치는지 알 수 있습니다.
Guest OS를 통째로 올립니다. 윈도우 호스트 위에 가상 리눅스를 띄우는 식이죠. 따라서 아무리 작은 애플리케이션을 돌려도 OS 자체를 구동하기 위한 수 GB의 메모리와 CPU 오버헤드가 발생합니다.VM을 켜는 것은 컴퓨터를 새로 부팅하는 것과 같습니다. 부팅 시퀀스를 거쳐야 하므로 최소 수십 초에서 수 분이 걸립니다. 반면 컨테이너는 이미 켜져 있는 OS 위에서 프로세스를 하나 실행하는 것에 불과하므로 0.1초, 길어야 수 초 안에 켜집니다.
트래픽이 급증할 때 서버를 순식간에 10대, 100대로 늘려야 하는(Auto Scaling) 대규모 서비스에서는 이 기동 속도의 차이가 곧 서비스의 생존과 직결됩니다.
개발을 하다 보면 가장 짜증 나는 순간이 있습니다. 개발자 로컬 PC에서는 아주 잘 돌아가는데, 스테이징 서버나 운영 서버에만 올리면 엉뚱한 에러가 나는 경우입니다. 99%는 OS 버전 차이, 깔려있는 자바나 파이썬 패키지 버전 불일치, 환경 변수 누락 때문입니다.
컨테이너는 애플리케이션뿐만 아니라 실행에 필요한 라이브러리, 환경 설정까지 통째로 패키징하여 ‘이미지’로 만듭니다. 이 이미지는 전 세계 어떤 서버에 올리든 정확히 똑같이 작동합니다. 환경 일관성 측면에서는 타의 추종을 불허합니다.
다시 질문으로 돌아와 보겠습니다. “배포가 많지 않고 운영 복잡성이 없는 서비스라면 VM OS 구성이 좋지 않나요?”
제 대답은 “네, 백번 천번 맞습니다. 무조건 VM으로 가세요.” 입니다. 그 구체적인 이유를 세 가지로 정리해 드립니다.
컨테이너를 도입한다는 것은 단순히 docker run 명령어를 배우는 것으로 끝나지 않습니다. 컨테이너 환경을 제대로 유지보수하려면 다음과 같은 ‘숨겨진 기술 스택’을 모두 감당해야 합니다.
배포를 1년에 몇 번 하지 않는 서비스라면, 이 거대한 인프라를 유지하고 관리하기 위해 공부하고 삽질하는 시간이 너무나 아깝습니다. 그 시간에 서비스 기능을 하나 더 개발하는 게 이득입니다.
운영자 입장에서 가장 마음이 편할 때는 ‘내가 제어할 수 있는 범위 안에 모든 것이 있을 때’입니다.
VM 환경은 직관적입니다.
top이나 htop으로 CPU/메모리를 많이 먹는 프로세스를 확인한다.tail -f app.log)을 실시간으로 확인한다.systemctl restart Nginx)한다.하지만 컨테이너 환경, 특히 쿠버네티스 같은 오케스트레이션 환경에서는 장애가 나면 어디서부터 손을 대야 할지 막막합니다. 포드가 죽었는지, 노드가 죽었는지, 인그레스 설정이 꼬였는지 파악하기 위해 수많은 추상화 레이어를 거쳐야 합니다. 모니터링 시스템(Prometheus, Grafana 등)을 따로 구축해놓지 않았다면 장님 코끼리 만지는 격이 됩니다.
VM 기술은 이미 수십 년간 다듬어질 대로 다듬어진 기술입니다. 전 세계 수많은 기업이 VM 환경에서 금융 시스템, 이커머스, 공공 기관 서비스를 안정적으로 돌려왔습니다. 보안 패치, OS 업데이트, 백업 및 복구 프로세스가 아주 명확하게 정립되어 있습니다.
예측 불가능한 변수가 적다는 것, 그것이 바로 배포가 적고 안정적인 서비스를 지향하는 조직에게 가장 중요한 미덕입니다.
아직도 마음 한구석에 “그래도 남들 다 컨테이너 쓴다는데…” 하는 찝찝함이 남아있으신가요? 그렇다면 제가 만든 간단한 체크리스트를 통해 냉정하게 자가 진단을 해보시기 바랍니다.
우리가 기술을 배우고 도입하는 궁극적인 이유는 무엇일까요? 트렌디해 보이기 위해서도 아니고, 이력서를 화려하게 채우기 위해서도 아닙니다. 가장 적은 비용과 노력으로 서비스를 안정적으로 고객에게 전달하는 것, 즉 ‘비즈니스 문제를 해결하는 것’이 본질입니다.
배포가 많지 않고 운영 복잡성이 없는 서비스에 컨테이너와 쿠버네티스를 도입하는 것은, 동네 골목길에서 장을 보러 가는데 덤프트럭을 몰고 나가는 것과 같습니다. 힘은 엄청나게 좋고 짐은 많이 실을 수 있겠지만, 좁은 골목길을 빠져나가느라 진땀을 빼야 하고 주차할 곳도 없어서 결국 스트레스만 받게 될 것입니다. 골목길 장보기에는 가벼운 경차나 자전거(VM)가 최고의 선택입니다.
최신 기술 유행에 주눅 들지 마세요. 내 서비스의 특성을 정확히 파악하고, 그에 가장 단순하고 효율적인 도구를 선택하는 엔지니어가 진짜 실력 있는 엔지니어입니다. 현재 VM 환경에서 서비스가 아무 문제 없이 평화롭게 잘 돌아가고 있다면, 여러분은 이미 최고의 인프라를 운영하고 계신 겁니다.
서비스의 특성을 고려한 인프라 아키텍처 설계와 구성… 이것이 실력입니다.
ExaCC NetBackup RMAN 연동 및 4가지 대안