가상화를 넘어서, 컨테이너는 전례 없는 속도로 발전하고 있습니다. 첫쩨로, 이 블로그 포스트에서는 가상화의 기본을 다루고 컨테이너의 세계로 안내 드리겠습니다. 둘째로, 가상 머신과 컨테이너의 차이를 설명하겠습니다. 마지막으로, 컨테이너와 스토리지 간의 관계에 대해 이야기해 보겠습니다.
가상화 기초
가상화는 물리적 컴퓨팅 하드웨어로부터 추상화된 시뮬레이션된 컴퓨팅 환경을 만드는 과정입니다. 이를 통해 하드웨어와 소프트웨어 구성 요소로부터 여러 가상 컴퓨팅 인스턴스를 만들 수 있습니다. 주로 이러한 인스턴스들은 전통적인 의미의 컴퓨터가 될 수도 있고, 응용 프로그램, 서버 또는 네트워크 구성 등이 될 수도 있습니다.
하이퍼바이저는 가상 머신을 생성하고 실행하는 유형의 컴퓨터 소프트웨어입니다. 이는 물리적 하드웨어와 가상화된 환경 사이에 위치한 가벼운 소프트웨어 계층입니다. 하이퍼바이저는 인프라의 원시 자료에서 리소스를 추출하고 다양한 컴퓨팅 인스턴스로 방향을 지시하는 중간자 역할을 합니다.
가상 머신과 컨테이너
가상화는 컴퓨터가 가상 머신(VMs, Virtual Machines)이라고 불리는 컴퓨터를 생성할 수 있게 합니다. 이들은 하이퍼바이저 소프트웨어 위에서 실행되며, 하나의 하드웨어에서 여러 개의 운영 체제(OS, Operating Systems)가 동작할 수 있도록 하고 서로 격리된 상태에서 작동합니다. 하이퍼바이저는 하드웨어를 가상화하고, 각 VM은 자체 운영 체제를 실행합니다. 인기 있는 VM 제공 업체로는 VMware, Microsoft Hyper-V, Virtual Box, Xen 등이 있습니다.
컨테이너도 소프트웨어로 정의된 컴퓨팅의 인스턴스입니다. 하지만 공유 호스트 운영 체제 위에서 실행됩니다. 컨테이너는 소프트웨어를 이동 가능하고 실행 가능한 단위로 패키징하여 서버, 노트북, 클라우드와 같은 어디서든 실행할 수 있는 모든 종속성을 가지고 있습니다. 인기 있는 컨테이너 도구로는 LXC (Linux Containers), Docker, Kubernetes 등이 있습니다.
모놀리식 (monolithic)과 마이크로서비스(microservices) 아키텍처
모놀리식 아키텍처는 소프트웨어 프로그램의 전통적인 모델입니다. 다른 애플리케이션과 독립적이며 자체 포함된 통일된 단위로 구축됩니다. 모놀리식 아키텍처로 개발할 때 주요 이점은 애플리케이션이 단일 코드 기반에 기초하여 매우 간단하다는 것으로, 개발 속도가 빠릅니다.
마이크로서비스 아키텍처는 이 컨테이너 열풍에서 나온 애플리케이션 개발을 위한 아키텍처입니다. 컨테이너를 사용하여 애플리케이션을 가장 작은 구성 요소 또는 “서비스”로 분해할 수 있습니다. 이러한 서비스는 단일 목적을 제공하며 독립적으로 개발 및 배포할 수 있습니다. 마이크로서비스는 복잡성을 줄이지 않지만, 작업을 서로 독립적으로 실행되는 작은 프로세스로 분할하여 전체에 기여하는 방식으로 복잡성을 노출하고 관리하기 쉽게 만듭니다.
예를 들어, 고객이 제품을 구매할 수 있는 애플리케이션이 있다고 가정해 보겠습니다. 검색 창, 장바구니, 구매 버튼 등이 있을 수 있습니다. 이러한 각각의 “서비스”는 각각의 컨테이너에 존재할 수 있습니다. 따라서 검색 창이 고부하로 인해 실패하더라도 전체 시스템이 중단되지 않습니다.
가상 머신 vs. 컨테이너
가상 머신과는 달리 OS 코드를 모두 운반할 필요가 없으므로 컨테이너는 더 가볍습니다(megabytes vs. VMs’ gigabytes). 또한 컨테이너는 가상 머신보다 더 빠르게 시작됩니다. 컨테이너를 사용하면 가상 머신보다 한 대의 서버에서 두세 배 더 많은 애플리케이션을 실행할 수 있습니다. 이러한 이유로만 봐도 컨테이너가 미래라고 주장할 수 있습니다.
가상 머신과 컨테이너의 사용 사례
가상 머신과 컨테이너는 각각 장단점을 가지고 있으며, 최종 결정은 귀하의 특정 요구 사항에 따라 다를 것입니다.
가상 머신은 서버에서 여러 애플리케이션을 실행해야 하거나 다양한 운영 체제를 관리해야 할 때 모든 운영 체제의 리소스와 기능이 필요한 애플리케이션을 실행하는 데 더 나은 선택입니다. 마이크로서비스로 리팩토링할 계획이 없거나 필요하지 않은 기존의 모놀리식 애플리케이션을 있는 경우에도 가상 머신이 여전히 해당 사용 사례를 잘 처리할 것입니다.
컨테이너는 서버의 수를 최소화하고 실행되는 애플리케이션이나 서비스의 수를 최대화하는 것이 최우선이며 최대 이식성이 필요할 때 더 나은 선택입니다. 새로운 앱을 개발하고 확장성과 이식성을 위해 마이크로서비스 아키텍처를 사용하려는 경우 컨테이너가 적합합니다. 컨테이너는 클라우드 네이티브 애플리케이션 개발과 관련하여 마이크로서비스 아키텍처에 기반한 경우에 빛을 발합니다.
클러스터에서 컨테이너를 구현하는 경우 외부 스토리지가 필요합니다.
컨테이너의 장점은 부하에 따라 빠르게 증가 또는 감소할 수 있다는 것입니다. Pod에는 컨테이너와 스토리지가 포함됩니다. 클러스터에서 부하가 감소하면 Pod가 부하 감소, 프로세스 충돌 또는 기타 이유로 삭제될 수 있습니다. 이 때 애플리케이션의 상태를 기록하여 새로운 인스턴스(새로운 Pod)가 시작될 때 현재 상태를 가져오도록 해야 합니다. 지속적인 스토리지는 장치가 꺼져도 데이터를 보존합니다. 따라서 애플리케이션은 Pod 외부에 상태 정보를 저장해야 합니다.
컨테이너가 지속적인 스토리지를 필요로하지 않을 것으로 기대되었지만, 컨테이너화된 애플리케이션의 증가하는 구현은 일종의 연속성이 필요하다는 것을 입증해왔습니다. 예를 들어, 애플리케이션의 일부를 호스팅하는 컨테이너가 종료되면 기존 데이터를 사용하여 해당 컨테이너(로컬 또는 원격)를 다시 인스턴스화하는 것이 다른 위치에서 다시 생성하거나 복사하는 것보다 더 쉽습니다.
Pod를 생성할 때 외부 스토리지를 지속적인 스토리지로 지정하여 외부 볼륨을 컨테이너에 마운트할 수 있습니다. Pod에서 실행되는 컨테이너는 다른 로컬 스토리지와 마찬가지로 외부 스토리지에 투명하게 접근합니다.
CSI는컨테이너와스토리지제품간의연결
CSI (Container Storage Interface)는 Kubernetes, Mesos, Docker 또는 Cloud Foundry와 같은 컨테이너 오케스트레이션 시스템에서 컨테이너화된 작업 부하에 임의의 블록 및 파일 스토리지 시스템을 노출하는 표준입니다. 컨테이너 오케스트레이션은 컨테이너화된 작업 부하와 서비스를 실행하는 데 필요한 운영 작업의 많은 부분을 자동화하는 것을 말합니다. 이는 컨테이너의 라이프사이클 관리를 위해 소프트웨어 팀이 처리해야 하는 다양한 작업을 포함합니다. 이에는 프로비저닝, 배포, 스케일링, 네트워킹, 로드 밸런싱 등이 포함됩니다. 스토리지 공급 업체는 여러 컨테이너 오케스트레이션 시스템에서 작동하도록 플러그인 CSI를 제공합니다.
결론
간단히 말하자면, 가상 머신은 기업이 제한된 하드웨어 및 소프트웨어에서 더 많은 기계를 확장하여 인프라 자원을 최대한 활용할 수 있도록 돕습니다. 반면에 컨테이너는 마이크로서비스와 데브옵스 실천을 가능하게 함으로써 기업이 개발 자원을 최대한 활용할 수 있도록 돕습니다. 클러스터 아키텍처에서는 애플리케이션 의 상태와 리소스를 공유하기 위해 외부 스토리지가 필요합니다. 그리고 CSI는 컨테이너와 스토리지 사이에서 중개자 역할을 합니다.