과거부터 현재까지 컴퓨팅 자원을 활용하는 방법은 크게 3가지가 있다.
베어메탈, 하이퍼바이저, 컨테이너가 그 3가지다.
베어메탈에서 하이퍼바이저로 그리고 컨테이너로 발전해왔다.
오늘은 이 3가지 방식에 대해 알아보겠다.
베어메탈
베어메탈은 가상화 계층 없이 물리적 하드웨어 위에 직접 운영체제 및 애플리케이션을 설치하여 사용하는 컴퓨팅 환경이다.
베어메탈의 장점은 물리적 자원을 가상화 계층 없이 사용하므로 성능에서 이점을 가질 수 있다.
그러나 베어메탈이 가지는 단점이 기업 입장에서 더 치명적이다.
베어메탈방식은 서버를 확장하려면 매번 하드웨어적인 의미의 서버를 매번 구입해야한다.
비용적인 측면에서 부담스러우며 급하게 서버를 확장해야할 때는 직접 컴퓨터를 구매하며(배송 시간, 쇼핑 시간) 유연성이 떨어지고, 컴퓨터에서 중복 실행이 불가능한 프로그램도 존재하므로 이런 부분에서도 유연성이 떨어진다.
단일 컴퓨터에서 여러 프로그램이 동작하는 경우 1개의 프로그램에 장애가 발생하면 다른 모든 프로그램에도 문제가 생길 수 있다.
이는 실제로 서비스를 운영하고 있는 기업 입장에서 치명적일 수 있다.
이런 다양한 단점을 베어메탈 방식에서 발견할 수 있다.
그리고 다수의 저성능 서버를 사는 것보다 1대의 고성능 서버를 사는 것이 경제적이다.
위 문제를 해결하고 1대의 고성능 서버를 효율적으로 사용하기 위해 가상화 환경이 등장했다.
가상화 환경
가상화 환경을 사용하면 물리적 컴퓨터의 리소스를 분배해 하나의 컴퓨터에서 여러 논리적 컴퓨터를 실행할 수 있다.
논리적으로 컴퓨터를 실행하면 논리적 컴퓨터의 리소스가 모두 격리되면서 하나의 논리적 컴퓨터에서 장애가 발생해도 다른 논리적 컴퓨터들에게 전파 되지 않는다.
또한 매번 컴퓨터를 구매해야하는 등 비용과 시간적인 부분에서 이득을 취할 수 있고 고성능의 비싼 컴퓨터를 효율적으로 활용할 수 있다.
먼저 전통적인 가상화 방식인 하이퍼바이저에 대해 알아보자.
하이퍼바이저
하이퍼바이저를 통해 가상 OS(가상 컴퓨터)를 만들고 실행하고 종료할 수 있다.
이 가상 OS는 컴퓨터의 자원(메모리, CPU)가 격리되어 있다.
가상환경도 컴퓨터의 자원을 소비하는 프로그램처럼 생각하면 된다.
물리적인 서버에 설치되는 OS는 호스트 OS라고 부른다.
호스트 OS에서 하이퍼바이저를 설치해 가상 환경을 만들 수 있다.
하이퍼바이저를 통해 실행되는 가상 환경의 OS를 게스트 OS라고 부른다.
호스트 OS는 물리적인 하드웨어와 연결되고,
게스트 OS는 호스트 OS의 리소스를 나눈 논리적인 공간이다.
게스트 OS는 VM(Virtual Machine)라고 불린다.
게스트 OS와 호스트 OS가 다르면 커널도 달라 시스템 콜도 다르다.
그러면 호스트 OS 위에서 다른 게스트 OS가 동작을 못하나?? 그렇지 않다.
하이퍼바이저가 각기 다른 OS에서 전달 받은 시스템 콜을 각자 OS에 맞게 변환해서 잘 전달해준다.
하이퍼바이저가 일종의 통역사 역할을 하기 때문에 호스트 OS와 다른 종류의 OS를 게스트 OS로 올리는 것이 가능한 것이다.
하이버바이저의 예시로는 Virtual Box, VMware, UTM 등이 있다.
컨테이너
컨테이너는 클라우드 컴퓨팅 환경이 대세가 되면서 가볍고 빠른 장점을 바탕으로 자신의 입지를 확고히 했다.
컨테이너는 리눅스 커널이 제공하는 네임스페이스, Cgroup라는 커널의 자체 기술을 사용해 하이퍼바이저보다 훨씬 빠르다.
호스트 OS의 커널을 공유하므로 오버헤드가 적은 것이다.
즉 하이퍼바이저를 사용하지 않고도 격리된 공간을 만들 수 있다는 것이다.
- 네임스페이스는 프로세스와 하드드라이브, 네트워크, 사용자 호스트 네임처럼 리소스를 나누는 기준의 역할을 한다. 쉽게 말하면 프로세스가 볼 수 있는 범위(가시성)을 제한한다.
- Cgroup은 프로세스가 사용하는 메모리와 cpu, 하드디스크, 네트워크 밴드위스처럼 리소스의 사용량을 배분하는 기술이다. 쉽게 말하면 프로세스가 쓸 수 있는 사용량을 제한한다.
vm은 각각의 게스트 OS가 독립적인 커널을 가지기 때문에 구성하고 실행까지의 시간이 오래 걸리고 하나의 게스트 OS가 독립적인 커널을 가지기 때문에 구성하고 실행하기까지의 시간이 오래 걸리고 하나의 게스트 os가 차지하는 오버헤드가 크다는 단점이 있다.
현대 사회에서는 실시간 데이터가 매우 중요하므로 빠르고 가벼운 컨테이너가 인기를 끌었다.
네임스페이스와 Cgroup기술을 사용해 만들어진 각각의 격리된 공간을 컨테이너라고 부른다.
하이퍼바이저는 매번 OS를 다운로드해서 개별적인 커널 사용을 사용하며, 하이퍼바이저는 게스트 os와 호스트 os의 통역가이자 관문이다.
우리가 살펴볼 도커는 커널의 가상화 기술을 활용할 수 있게 도와주는 보조 도구이다.
도커
도커는 컨테이너 플랫폼의 한 종류다.
컨테이너플랫폼은 컨테이너 런타임과 컨테이너 엔진으로 구성된다.
- 컨테이너 엔진은 사용자의 요청을 받아 컨테이너를 관리한다.
- 컨테이너 런타임은 커널과 직접 통신하면서 실제로 격리된 공간을 만드는 역할을 수행한다.
도커는 기본적으로 runc라는 컨테이너 런타임을 사용한다.
컨테이너 런타임은 OCI(Open Container Initiative)라는 곳에서 규정한 컨테이너 런타임 인터페이스(CRI) 표준을 구현했기 때문에 사용하는 것이다.
다른 CRI 표준을 구현한 다른 기술을 사용해도 된다. (Podman, Containerd 등)
도커는 클라이언트 서버 모델이다.
클라이언트는 사용자의 명령(도커 명령어)을 도커 데몬에게 전달하며 도커 데몬은 컨테이너를 관리한다.
도커 데몬은 호스트 OS에 지속적으로 실행되면서 클라이언트 명령에 따라 컨테이너를 관리한다.
참고자료
댓글