Bare Metal, 가상화, 컨테이너

승톨·2021년 8월 14일
7
post-thumbnail

Bare Metal이란

  • ‘베어메탈(Bare Metal)’이란 용어는 원래 하드웨어 상에 어떤 소프트웨어도 설치되어 있지 않은 상태를 뜻한다.
  • 그래서 베어메탈에 운영체제를 설치하면, 우리가 일반적으로 알고 있는 서버 컴퓨터, 컴퓨터 노드가 된다.
  • 베어메탈 서버는 가상화를 위한 하이퍼바이저 OS 없이 물리 서버를 그대로 제공하는 것을 말한다 = 하드웨어에 대한 직접 제어 및 OS 설정까지 가능.

참고 : 베어메탈 프로비저닝(provisining) : 베어메탈 하드웨어에 운영체제를 설치하고 네트워크를 설정해서 엄연한 컴퓨터로 작동하도록 하는 일련의 과정

가상 머신, 가상화

  • 가상화란 가상의 베어메탈을 만드는 일련의 기술들을 의미한다. 가상의 컴퓨터 하드웨어를 만드는 기술이라고 할 수 있겠다. 에뮬레이션(Emulation)과 매우 비슷한 개념.
  • 차이가 있다면, 애뮬레이션은 보통 이기종의 하드웨어에서 작동하는 소프트웨어를 실행하는게 목적이지만, 가상화는 현재 사용 중인 하드웨어에서 구동 할 수 있는 소프트웨어를 실행하기 위해서 사용한다.

https://docs.google.com/drawings/d/1bWLsHmR_egedNBx5UbDdWDPMLRQ2suR9QhLsUOxf5CA/pub?w=703&h=253

출처 : lifetheme509820661.wordpress.com

  • 가상화는 베어메탈에 하나 이상의 가상 머신(VM, Virtual Machine)을 만든다. 이 가상머신에 운영체제를 올리고 애플리케이션을 실행한다.
  • x86 컴퓨터에서 가상머신을 만들었다면 이 가상머신은 x86을 에뮬레이션 한다. 따라서 x86에서 작동하는 어떠한 운영체제라도 설치 할 수 있다. 예컨데, 윈도우와 오픈솔라리스, 리눅스를 함께 운용하는게 가능하다.

하이퍼바이저?

  • 하이퍼바이저는 VM들이 각자 자신의 가상 운영체제, 즉 게스트 운영체제를 실행하고 관리할 수 있게끔 돕는 역할을 한다.
  • 또한 호스트 머신들이 자원들을 VM들에게 분배할 수 있도록 도와주는 일을 맡는다.

https://miro.medium.com/max/1575/1*ZwUnMQmVdn9Lrw0DLCJyFg.png

출처 : lifetheme509820661.wordpress.com

가상화 타입1

  • 네이티브 혹은 베어메탈 하이퍼바이저를 이용하는 가상화.
  • 하이퍼바이저가 하드웨어를 직접 제어하고 그 위에 게스트 운영체제(Guest OS)를 올리는 방식.(=베어 메탈 하이퍼바이저)
  • Oracle VM Server for X86, Citrix Xenserver, Hyper-V, VMware ESX/ESXi 등이 타입1 형태의 하이퍼바이이다.
    - 하이퍼바이저가 호스트 머신의 서버에 OS로서 처음 설치되는 경우.
  • 베어메탈 하이퍼바이저는 자신만의 디바이스 드라이버를 가지고 입출력, 프로세싱, OS 관련 컴포넌트들과 직접 교류하여 처리함.
  • 장점 : 더 나은 퍼포먼스, 확장성, 그리고 안정성을 가지게 된다.
  • 한계 : 하이퍼바이저에는 제한된 숫자의 디바이스 드라이브가 설치 될 수 있으므로, 그만큼 하드웨어 호환성이 제한될 수 있다.

가상화 타입2

  • 전통적인 운영체제위에 하이퍼바이저를 실행하고, 이 하이퍼바이저 위에서 게스트 운영체제를 실행하는 방식. (대부분 쓰는 방식)
  • 하이퍼바이저를 실행하는 운영체제를 호스트 운영체제라고 부름.
  • 기존에 사용하던 호스트 운영체제 위에, 애플리케이션을 실행 하듯이 게스트 운영체제를 올릴 수 있음.
  • VMware Workstation, VMware Player, VirtualBox, QEMU등이 타입2 하이퍼바이저.

가상화의 장점

  • 가상화는 (하나의 베어메탈을 여러 개의 컴퓨터로 보이게 해서) 여러 개의 논리적 운영체제를 작동하게 하는게 목적.(자원 사용의 효율성을 높이기 위해)
    1. 여러 서버를 모아서 자원의 사용률을 개선,
    2. 풀(pool) 개념을 사용 함으로서 자원에 대한 빠른 전개와 회수가 가능,
    3. 애플리케이션들을 완전히 격리 함으로써 멀티테넌시 환경을 구성

멀티테넌시 : 서로 다른 고객이 서버 리소스를 나누어 사용하는 공유 호스팅

관리

  • 보통 여러 개의 베어메탈을 풀(pool)로 묶어서 관리 한다.
    • 예시 : 8 core CPU, 128GB 메모리를 가진 베어메탈 8개 ⇒ 하나로 묶어서 64 core CPU, 1TB의 용량을 가진는 컴퓨팅 자원 풀을 만듬. 그리고 이 자원을 유저가 요청 할 때 할당.
  • 컴퓨팅 자원을 효율적으로 사용 할 수 있고, 풀에 기반해 자원의 할당과 회수도 용이해짐.

가상화의 단점

  • 완전한 운영체제가 올라가기 때문에, 대량의 메모리가 필요함.
    • 왜냐 ? : 프로세스의 경우 빠른 컨텍스트 전환과 sleep 상태로 인해 여러 개의 VM들이 CPU를 경쟁해도 크게 문제가 되지 않는데 반해, 메모리는 CPU 만큼 빠르게 전환 할 수가 없다.
    • 따라서 메모리는 상대적으로 대량의 메모리를 가지고 있어야 한다. 운영체제 자체가 메모리를 많이 잡아 먹는다. (예를 들어 우분투 리눅스 OS를 유지하는 것만으로 500M 정도의 메모리가 소모됨.)
  • 용량 이외에 CPU 성능 확보도 중요.
    * CPU는 빠른 컨텍스트 전환이 가능 하기 때문에 애플리케이션간 CPU 경쟁이 분산이 되지만 애플리케이션의 요청이 중첩되는 걸 피할 수는 없다.
    • 애플리케이션의 CPU 요청이 중첩되면 애플리케이션의 응답시간이 늦어지는 문제가 생길 수 있다.
  • 가상화는 이미 만들어진 시스템위에 또 다른 시스템을 구축하는 것이기 때문에, 운영체제와 네트워크, 스토리지, 보안, 운영, 모니터링에 대한 통합된 지식이 필요하다. 따라서 효율적인 가상화(혹은 클라우드) 환경을 운용하기 위해서는 DevOps와 같은 조직 구성이 필요하다.

참고

  • VM도 가상화된 애플리케이션 느낌이니까 호스트 운영체제에서 컨텍스트 스위칭 대상이 된다.

관련 스택오버플로우 글

네트워크 가상화

https://docs.google.com/drawings/d/1zwywYWaMo-_7Luj8UEwhwL1pKmVwPpb6J7NhEQCZzmQ/pub?w=962&h=528

  • 호스트 운영체제에 여러 개의 게스트 운영체제들이 서로 통신을 하려면 네트워크로 묶여야 함.
  • 물리적인 환경에서는 물리적인 네트워크 스위치로 서로 연결이 되지만, 호스트 운영체제 내부에 물리적인 네트워크를 둘 수 없으니, 게스트 OS들을 연결하기 위한 가상의 네트워크를 구성함.
  • 리눅스 브릿지, OpenVSwitch 같은 소프트웨어 스위치와 Network Namespace, Iptables, 가상 네트워크 인터페이스, OpenFlow들이 네트워크 가상화의 핵심 기술이다.
  • 이 기술들을 이용해서 L2 네트워크, L2 Overlay Network, L3 Network 등 서비스 목적에 따른 다양한 네트워크를 구성하게 된다.

스토리지 가상화

  • 가상화 환경에서 VM은 물리적 이동에 대한 제약이 없다. 이 제약이 잘 쓰이려면 데이터를 담고 있는 스토리지가 VM과 분리돼야 한다.
  • 따라서 하드디스크를 (호스트 운영체제가 아니라) 전용 스토리지 노드에 둔다. 이렇게 하면 가상머신은 서버 노드 사이를 자유롭게 이동 할 수 있다.

근데 왜 가상머신이 자유롭게 이동할 수 있어야 하는가?

  • 가상화의 가장 큰 목적은 자원을 효율적으로 사용하려는데 있기 때문에, VM운영 중 CPU나 메모리가 부족하게 됐다면, 다른 자원이 남는 서버 노드에서 VM을 실행해야 한다. 이렇게 하려면 VM을 잘 교체할 수 있어야 한다.
  • 이때 하드디스크까지 함께 옮기면 제약이 많이 생기고, 디스크에 저장된 정보를 복구하기도 힘들어진다.
  • 그래서 디스크 정보 관리에 특화된 서버 장비로 스토리지 환경을 구성한다.스토리지를 물리적으로 분리를 하게 되면, 네트워크를 통해서 디스크를 읽고 쓸 수 있어야 한다.

컨테이너

[1]

  • 사실상 추상적 개념이다. 몇 가지 기능의 집합체가 컨테이너처럼 작동하는 것을 상상할 수 있게끔 만들어진 개념이라고 볼 수 있다.
  • 간단히 얘기하면 격리된 네트워크, CPU, 메모리, 디스크를 가진 공간을 만들고 이 공간에서 프로세스 실행해서 유저에게 서비스하겠다는 것이다.
  • 하드웨어의 가상화를 제공하는 VM과는 달리, 컨테이너는 유저 공간(user spcae)의 추상화를 통해 운영체제 레벨의 가상화를 제공한다.
  • 컨테이너도 VM처럼 프로세싱을 위한 별도의 공간(private space), 루트 권한, 사설 네트워크, IP 주소, 커스텀 라우트 / iptable 규칙, 파일 시스템 마운트 등의 기능을 갖추고 있다.
  • 하지만 컨테이너는 호스트 시스템의 커널을 다른 컨테이너들과 공유한다는 점에서 크게 차이가 난다.

https://miro.medium.com/max/1575/1*rddkqsIT9cADA7ZqwwwysQ.png

[2]

  • 컨테이너는 하나의 컨테이너 이미지로 부터 만들어진다.
    • 하나의 프로그램으로 부터 실행된 프로세스가 모두 동일한 실행 환경을 가지듯이, 이들도 모두 동일한 실행 환경을 가진다.
    • 컨테이너는 프로그램의 실행에 필요한 라이브러리, 다른 프로그램들까지를 포함하므로 완전히 동일한 개발 & 배포 환경을 구성 할 수 있음.
  • (프로그램 이미지와 마찬가지로) 컨테이너 이미지는 변경 할 수가 없다. 누가 실행 하든지 간에 동일한 프로그램 환경을 보장해야 하기 때문이다.
  • 컨테이너가 실행 되면, 원본인 컨테이너 이미지로부터 변경되는 정보를 저장할 수 있어야 한다. 원본으로부터 복사를 하고 변경되는 정보를 쓰는 저장 방식(Copy On Write)이 필요하다.
  • 개별 컨테이너는 CPU, 볼륨, 네트워크 카드를 할당 할 수 있고, 이 컨테이너는 다른 컨테이너와 분리된다.
  • 컨테이너를 여러개 만들어서 유저에게 제공하는 것으로 멀티 테넌시 환경을 만들 수 있다.

컨테이너의 장점

  • VM의 경우 부팅 준비하는 것만 해도 상당한 시간이 걸리지만 컨테이너는 밀리세컨드 단위로 실행된다. 일반 프로세스를 실행하는 것과 차이가 없다. VM보다 빠르다.
  • VM은 운영체제가 실행되기 때문에 실행 자체만으로도 수백MB의 메모리를 소비한다. 그러나 컨테이너는 실행하기 전에는 자원을 소비하지 않는다.
  • VM은 완전한 운영체제를 포함하기 때문에 디스크 공간을 많이 사용한다. 컨테이너는 이미지로 부터 Copy on write 방식으로 만들어지기 때문에, 그 자체로 디스크 공간을 점유하지 않는다.
  • 1000개의 가상머신을 만든다고 가정해 보자. 가상머신을 띄우는데만 1TB의 공간이 필요하다. 반면 컨테이너는 디스크 공간을 거의 쓰지 않는다.

컨테이너의 단점

  • 자원의 격리와 제한이 어렵다. cgroup와 네임스페이스와 같은 기술들이 발전 하고 있지만 VM에 비해서는 아직 부족한 점이 있다.
  • 스토리지 성능이 좋지 않다. VM은 블럭 디바이스 위에 ext3, ext4를 이용해서 스토리지를 사용한다. 컨테이너는 AUFS, Device mapper, Overlay Filesystem등과 같은 유니온 파일 시스템(Union filesystem)을 사용하는데, ext4와 같은 파일 시스템 위에 올라가는 데다가 변경된 내용을 기록하고, 기록된 내용으로 부터 원본 데이터를 복원해야 하기 때문에 느릴 수 밖에 없다.
  • 네트워크 구성이 어렵다. VM은 물리적인 컴퓨터 시스템과 차이가 없어서 네트워크 구성이 특별히 어렵지 않다. 그냥 VM마다 IP 주소 붙여서 연결하면 된다. 하지만 컨테이너는 그렇게 하기 힘들다. 개별 프로세스마다 IP를 주기에는 어렵고, IP 주소를 붙이는 것 자체가 낭비다. 호스트 운영체제 레벨에서 네트워크를 한번 더 추상화 해야 해서 가상머신 보다 네트워크 구성에 신경을 써야 할게 많다.
profile
소프트웨어 엔지니어링을 연마하고자 합니다.

2개의 댓글

comment-user-thumbnail
2022년 2월 11일

잘 봤습니다. 감사합니다

답글 달기
comment-user-thumbnail
2023년 10월 4일

작성자분의 글이 큰 도움이 되었습니다.
가상화에 대한 이해가 조금은 생긴 것 같아요
좋은 글 감사합니다!

답글 달기