본문 바로가기
12. 쿠버네티스란

컨테이너의 이해

by 김덕환 2020. 4. 30.
반응형

어플리케이션이 더 작은 수의 커다란 구성 요소로 구성되는 경우, 각 구성 요소에 전용 VM을 부여하고 각 구성 요소에 자체 운영체제 인스턴스를 제공해 환경을 격리할 수 있다. 그러나 이런 구성 요소가 점점 작아져 그 수가 늘어나기 시작하면 하드웨어 리소스를 낭비하지 않고 비용을 줄이기 위해 각자 고유의 VM을 제공하기는 어렵다. 이는 단지 하드웨어 리소스 낭비만의 문제는 아니다. 일반적으로 VM을 개별적으로 구성하고 관리해야 하므로 VM 수가 많아질수록 시스템 관리자의 작업 부하도 증가되기 때문에 인적 자원도 낭비된다. 

 

 

리눅스 컨테이너 기술을 통한 컴포넌트 분리

 

개발자는 VM을 사용해 각 마이크로서비스의 환경을 격리하는 대신 리눅스 컨테이너 기술을 사용한다. 이 기능을 사용하면 같은 호스트 시스템에서 여러 서비스를 실행할 수 있으며 이와 동시에 각 서비스에 각기 다른 환경을 만들어 줄 뿐만 아니라 VM에 비해 오버헤드가 훨씬 적다. 

 

VM에서 실행하는 프로세스는 별도의 운영체제 컨테이너에서 실행된다. 그와 달리 프로세스는 다른 모든 프로세스와 마찬가지로 호스트의 운영체제 내부에서 실행된다. 그러나 컨테이너의 프로세스는 다른 프로세스와 여전히 분리되어 있다. 프로세스의 입장에서는 시스템 및 운영체제에서 실행되는 유일한 프로세스인 것처럼 보인다. 

 

 

VM과 컨테이너 비교

 

컨테이너는 VM보다 가볍기 떄문에 동일한 하드웨어에서 더 많은 소프트웨어 구성 요소를 실행할 수 있지만 VM은 각 하드웨어가 자체 시스템 프로세스 집합을 실행해야 하기 때문에 자체 프로세스에서 소비되는 것 외에도 컴퓨팅 리소스가 필요하다. 반면, 컨테이너 호스트 OS에서 실행하는 단일 격리된 프로세스 이상으로 리소스를 소비하지 않고 어플리케이션에서 사용하는 리소스만 사용하므로 더 이상 프로세스의 오버헤드가 발생하지 않는다. 

 

VM의 오버헤드로 인해 전체 VM을 각 어플리케이션마다 할당하기엔 리소스가 부족하기 때문에 여러 어플리케이션을 그룹화해 각 VM에 할당하는 경우가 많다. 컨테이너를 사용한다면 어플리케이션마다 컨테이너를 하나씩 가질 수 있다. 결과적으로 더 많은 어플리케이션을 동일한 베어메탈머신에 적재할 수 있다. 

 

하나의 호스트에서 세 개의 VM을 실행하면 동일한 베어메탈머신을 실행하고 완전히 분리된 세 개의 운영체제가 실행된다. 이런 VM은 호스트의 OS와 하이버파이저를 기반으로 한다. 이 하이퍼바이저는 물리적 하드웨어 리소스를 각 VM 내부의 운영체제에서 사용하 수 있는 더 작은 가상 리소스 집합으로 나뉜다. VM 내부에서 실행되는 어플리케이션은 VM에서 게스트OS의 커널에 시스템을 호출하고 커널은 하이퍼바이저를 통해 호스트의 물리적 CPU에서 x86 명령어를 실행한다. 

 

 

반면, 컨테이너는 모두 호스트 OS에서 동작하는, 정확히는 동일한 커널에서 시스템을 호출한다. 이 단일 커널은 호스트의 CPU에서 x86 명령어를 수행하는 유일한 커널이다. CPU는 컨테이너를 동작시키기 위해 VM처럼 가상화할 필요가 없다. 

 

 

 

VM의 가장 큰 장점은 각 VM이 자체 리눅스 커널 위에서 실행되기 때문에 완전히 분리시킬 수 있다는 것이다. 반면, 컨테이너는 모두 동일한 커널상에서 시스템을 호출하므로 보안상의 염려가 있다. 하드웨어 리소스가 제한된 경우 격리하려는 프로세스가 적은 경우에만 VM을 사용할 수 있다. 동일한 시스템에서 더 많은 프로세스를 격리해 실행하려면 오버헤드가 낮은 컨테이너를 선택하는 것이 좋다. 각 VM은 고유의 시스템 서비스 집합을 갖고 실행된다는 점을 기억해야 한다. 반면, 컨테이너는 모두 같은 운영체제에서 실행되기 때문에 그렇지 않다. 즉, 컨테이너를 실행하면 VM의 경우처럼 부팅할 필요가 없다. 컨테이너가 기동되면 프로세스는 즉시 시작된다. 

반응형