비즈니스에 필요한 머신들은 항상 하나의 세팅, 하나의 목적에 따라 운영되어 왔습니다. 서로 다른 환경이 필요하면 두 대의 머신을 사용할 수밖에 없었습니다. 하지만 각 머신의 물리적 자원이 충분히 활용되기를 원하고 투자 비용을 줄이기 위한 방편으로 가상화 기법이 나타나게 되었습니다.
가상화란 기본적으로 물리적 자원(컴퓨팅, 네트워크, 스토리지)을 추상화하여 사용하는 모든 것을 일컫는데 본 기사에서는 컴퓨팅 자원 가상화(Software Defined Computing)에 관해 설명합니다.
하나의 물리 자원을 모두 사용하는 형태입니다.
하나의 운영체제(Operating System, OS)가 설치되어 있고, 모든 애플리케이션은 동일한 환경 위에서 동작합니다. 마치 땅을 구매하고 단독주택을 짓고 거주하는 것과 동일합니다. 가족 구성원들은 동일한 집 구조나 환경 속에서 살 수 있는데, 독립성이나 자유도가 좀 부족한 상태입니다.
하나의 물리 자원 위에 하나의 환경(OS)만 있는 것을 효율화하고자 가상화층을 만들고 그 위에 OS를 새로 설치하는 기법입니다.
가상화층 위에 완전히 독립된 새로운 OS를 설치하여 활용하는 기법입니다. Hypervisor라고 불리는 가상화층은 가상화 OS에서 정의된 논리 자원을 실제 물리 자원과 연결해주어 가상화 OS가 물리 자원을 가지고 있는 것처럼 자유롭게 활용하도록 연결하는 매개체입니다.
VM 기술은 새롭게 OS를 설치하는 것이기에 Host OS에 영향을 받지 않습니다. 다만, OS 설치와 구동에 필요한 기본적인 용량을 많이 차지하게 됩니다. 신규 VM을 만들고자 하면 OS를 설치하거나 이미 설치되어있는 OS 이미지로부터 시작하게 되며, OS 설치 후 OS를 구동하고 애플리케이션을 구동해야 하기에 Guest OS 구동 자체에 들어가는 리소스가 많이 소모됩니다.
이것도 역시 집에 비유하자면, 다세대주택(아파트)과 비슷하다고 할 수 있습니다. 동일한 대지에 건물을 짓고 각 집은 단독주택과 동일한 모든 환경을 갖추고 있으며 완전히 독립된 형태입니다. 완전히 독립된 환경이기에 모든 거주자는 각자 집에서 필요한 것들을 다 구매해서 구비해야 하며 사용 시간과 용도가 적은 것일지라도 각각 가지고 있어야 합니다. 사람이 집안에서 특정 행동을 취할 때를 제외하고는 대부분의 공간 및 가구들은 사용하지 않는 채로 공간을 차지하고 있습니다. 누군가 새롭게 이사를 오려면 빈집을 채워서 사람이 살 수 있게 만드는데 많은 돈과 공간이 필요하게 됩니다.
Virtual Machine에서 애플리케이션이 구동할 때 사용하는 일부 파일이나 자원을 제외하고 OS 설치에 필요한 대부분의 리소스가 낭비되고 있는 것과 동일합니다.
컨테이너화는 OS를 완전히 새로 설치하는 것이 아니라, OS의 기본적인 커널(Kernel)을 그대로 사용하여 애플리케이션을 구동하는 방식입니다. VM 방식의 가상화가 OS 가상화라고 한다면, Containerization은 애플리케이션 가상화라고 할 수 있습니다.
Host OS의 커널 등을 그대로 사용하고 애플리케이션 환경에 필요한 최소한의 라이브러리(Library)와 바이너리(Binary)만을 추가로 가지고 실행합니다. VM 기반에서는 Guest OS 자체가 독립된 공간이라고 한다면, 도커(Docker)는 컨테이너라고 불리는 프로세스를 격리시키는 방법으로 독립된 공간을 제공합니다. Host OS의 커널 등 기본적인 환경은 모두 그대로 사용합니다. 컨테이너는 애플리케이션이 필요한 수정 사항만 필요하기에 작은 용량만을 차지하게 되며 CPU나 메모리도 필요한 만큼만 사용할 수 있기에 한 서버에서 여러 개의 컨테이너를 띄우는 것도 가능합니다. 컨테이너는 OS를 따로 가지고 있지 않기에 “부팅”의 개념이 따로 없습니다. 프로세스가 즉시 실행될 수 있는 것과 마찬가지로 새로운 컨테이너 역시 즉시 만들어집니다.
집에 비유하자면, 마치 하숙집과 같은 형태라고 볼 수 있을 것입니다. 집의 대부분 구조는 공유를 하면서 방 하나만 자신이 원하는 환경으로 만들고 거주를 하는 것과 비슷합니다. 새로운 사람이 들어온다고 하더라도 방 하나만 만들어주면 기본적인 생활이 가능하고 방 안에서는 완전히 독립적인 생활을 할 수 있게 되는 것입니다.
마이크로서비스 아키텍처 스타일은 특정 응용프로그램을 작은 서비스의 조합으로 구축하는 방법입니다. 이전에는 모놀리스(Monolith) 스타일을 주로 사용하였는데 애플리케이션을 하나의 큰 덩어리로 구축하는 방법입니다. 초기 애플리케이션의 배포와 관리에는 모놀리스 스타일이 적합하고 쉽게 만들 수 있는 구조입니다. 다만, 애플리케이션의 크기가 점점 커지고 일부분을 수정하고 싶은 경우에는 전체를 다시 배포해야 하는 문제점이 나타남에 따라 마이크로서비스 아키텍처 스타일이 필요하게 되었습니다.
마이크로서비스 아키텍처 스타일에서는 애플리케이션을 잘게 쪼개서 최소한의 단위로 만들고 이를 유지/보수합니다. 단위가 작으므로 빠른 수정/배포가 가능하지만, 구동해야 하는 서비스의 개수가 많아졌습니다. 단일 서버나 VM에서는 구동과 관리가 쉽지 않았으나, 컨테이너 기술을 사용하여 각각의 작은 단위의 애플리케이션을 작은 컨테이너에 띄우고 필요한 경우 확장할 수 있도록 만들 수 있습니다. 각 기능은 서버의 자원을 최소한으로만 사용하며 환경적인 간섭이 없는 완벽히 독립된 컨테이너 상에서 동작합니다.
인터넷 초창기에 서비스하려고 하면 서버 호스팅이라는 서비스를 이용하였습니다. 이는 물리적인 서버를 사거나 임대하여 웹 서비스 등을 하는 방식입니다. 최근에 서버 호스팅은 특수한 경우에만 사용하게 되고, 일반적으로는 VM 또는 컨테이너를 할당받아서 사용합니다.
전체 가상화가 되어있는 클라우드 서비스를 SDDC(Software Defined Data Center)라고 하는데, Samsung SDS Cloud, Amazon Web Services, Google Cloud Platform, Microsoft Azure 등이 이에 해당합니다. 이 글에 소개된 Software Defined Computing 이외에 SDN(Software Defined Network), SDS(Software Defined Storage) 등도 함께 적용되어 있습니다.
▶ 해당 콘텐츠는 저작권법에 의하여 보호받는 저작물로 기고자에 저작권이 있습니다.
▶ 해당 콘텐츠는 사전 동의없이 2차 가공 및 영리적인 이용을 금하고 있습니다.
삼성SDS 클라우드연구팀
삼성SDS 클라우드연구팀 팀장으로서, DataLake solution을 개발하였고 현재는 클라우드 선행 기술을 연구하고 있습니다. 과거에는 Naver 등에서 B2C를 위한 서비스 개발과 성능 개선을 위한 아키텍처링을 하였습니다.