본문 바로가기

클라우드/쿠버네티스(Kubernetes)

VM(가상머신) 과 Container(컨테이너)의 차이

# VM vs Container

# VM

공통적으로 하나의 서버가 있고 한서버에는 어떤 운영 체제가 있건 HostOS (맥 OS, 리눅스, 마이크로소프트 윈도우) 가 올라간다. VM의 경우 호스트OS에 의해 VM을 가상화 시켜주는 하이퍼바이저(virtual box, Xen, KVM, VMware)들이 있다. 하이퍼 바이저를 사용하여 원하는 운영체제로 GuestOS를 올려 여러 VM을 만들 수 있다. GuestOS도 HostOS와 같이 하나의 OS를 독립적으로 가지고 있는것처럼 사용가능하다. 여러 어플리케이션들을 설치하고 각각의 서비스를 만들 수 있다.

 

 

# 컨테이너

VM과 HostOS 까지 설치는 동일하다. 이 OS에 의해 컨테이너를 가상화 시켜주는 여러가지 소프트웨어들(docker, rkt, LXC)이 있고, 도커를 가장 많이 사용한다. 도커가 컨테이너를 만들어준다.

 

리눅스마다 버전이 있다. 이 버전에 따라서 기본적으로 설치되는 라이브러리들이 다르다. 리눅스 6버전에서 개발을 하다보면 리눅스 6버전에 설치되어있는 OpenJDK(version 1.6)라는 라이브러리를 자연스럽게 사용하게 된다. 그렇게 개발이 완료되고 이것을 리눅스 7버전(OpenJDK(version 1.8))에서 띄우게 되면, 버전 차이에 따른 문제가 생긴다. 도커를 설치하고 컨테이너 이미지를 만들 수 있는데 이미지에는 한 서비스와 그 서비스가 돌아가는데 필요한 라이브러리들이 같이 있다. 그래서 리눅스 7버전에 다른 라이브러리들이 있더라도 도커만 설치되어 있으면 이 컨테이너 이미지를 가져와 사용 했을때,  A 서비스는 자신의 이미지 안에있는 오픈스택 라이브러리를 사용하기 때문에 안정적으로 시스템을 구동할 수 있다.

 

또한, 도커는 여러 컨테이너들간의 호스트 자원을 분리해서 사용하게 해준다. 이것은 리눅스 고유기술인 name space와 cgroup 를 사용하여 격리하는것이다.

 

namespace mnt, pid, net, ipc, uts, user 커널에 관련 된 영역을 분리
cgroups memory, CPU, I/O, network 자원에 대한 영역을 분리

 

한마디로 도커(컨테이너 가상화)는 OS에서 제공하는 자원격리 기술을 이용하여 컨테이너라는 단위로 서비스를 분리할수있게 만들어주고, 개발환경에 대한 걱정없이 배포가 가능하다.

 

 

# VM과 컨테이너의 차이

시스템 구조적으로 컨테이너는 한 OS를 공유하는 구조이고 VM은 각각의 OS를 띄워야하는 구조이기 때문에 컨테이너가 빠르다. 하지만 VM은 사용자가 윈도우를 사용하고 있더라도 새로운 GuestOS를 설치할 때 리눅스 OS를 설치해서 사용할 수 있지만, 컨테이너는 리눅스 OS에서 윈도우용 컨테이너를 사용할 수 없다. 또한 보안적으로 VM은 보안적으로 문제가 생겨도 각각의 VM이 분리되어 있기 때문에 서로 피해가 가지 않지만 컨테이너는 보안적으로 문제가 생길 수 있다.

 

일반적으로 한 서비스를 만들 때 한가지 언어를 사용하여 여러 모듈들이 한 서비스로 같이 돌아간다. A와 B모듈은 괜찮은데 C모듈에 부하가 많이 가는 상황이면  VM을 하나 더 생성해서 띄워야 한다. 반면 컨테이너는 한 서비스를 만들 때 모듈별로 쪼개서 각각의 컨테이너에 담고 그 모듈에 최적화 된 개발 언어를 사용한다. 쿠버네티스는 여러 컨테이너들을 한 파드라는 개념으로 묶을 수 있고 한 컨테이너만도 파드에 담을 수 있는데, 한 파드가 하나의 배포 단위이다. 내가 필요한 파드만 확장할 수 있다. 컨테이너는 시스템을 모듈별로 쪼개서 개발을 했을 때 큰 효과를 발휘할 수 있다.

 

 

 

 

출처:

https://www.inflearn.com/course/%EC%BF%A0%EB%B2%84%EB%84%A4%ED%8B%B0%EC%8A%A4-%EA%B8%B0%EC%B4%88 인프런 강의를 보고 정리 하였습니다.