물리적인 하드웨어(HW) 장치를 논리적인 객체로 추상화 하는 것
가상화를 관리하는 소프트웨어(주로 Hypervisor)를 사용하여 하나의 물리적 머신에서 가상 머신(VM)을 만드는 프로세스
어떤 서비스를 운영하기 위해서는 Application들이 OS단위에 올라가 있고, 그 OS들은 CPU, 메모리, 디스크 같은 하드웨어(x86아키텍쳐) 위에 있는 환경으로 구성됨
=> 하나의 컴퓨터에서는 하나의 App만 운영할 수 있음
어떤 서비스를 운영하기 위한 Application들이 바로 OS위에 올라가는게 아니라 가상머신 위에 올라간다. 그 가상머신에는 이제 여러가지 컴퓨터들을 띄울 수 있는 환경이 됨.
=> 하나의 컴퓨터에서 여러가지 환경을 가진 App을 운영할 수 있음
각 OS마다 '커널'이 존재한다. 이 커널은 리소스를 관리하고, 명령어 해석하는 역할을 한다.
그런데 OS마다 명령어를 해석하는 규칙이 다르다.
=> 하이퍼바이저
가 각 OS마다 말하는 명령을 하드웨어가 이해할 수 있게 하나의 명령어로 번역해준다!!
1) 가상화를 이용하면 서버를 통합(Server Consolidation) 하고 서버의 자원을 최대한으로 활용함으로써 서버 급증 문제(Server Proliferation Problem)를 해결할 수 있다.
다양한 어플리케이션을 서비스를하려면 그 만큼 많은 하드웨어 자원이 필요한데, 하드웨어의 성능이 증가되다보니 하나의 서버에서 하나의 어플리케이션만 동작하는 것이 비효율적이다!
2) 가상 머신(VM)은 동일한 물리적 하드웨어에서 구동할 수 있지만 논리적으로는 서로 분리돼 있다. 즉, 한 VM에 오류가 발생하거나 작동이 멈추거나 악성코드 공격을 받아도 같은 시스템내 다른 VM 혹은 다른 시스템으로도 확장되지 않는다.
3) VM은 또한 이동성이 매우 강하다. 하드웨어와 독립적이기 때문에 로컬 또는 원격 가상화 서버 사이를 이동할 수 있다. 물리적 하드웨어에 묶여 있는 전통적인 응용 프로그램에 비해 훨씬 이전이 수월하다.
호스트 컴퓨터에서 다수의 운영 체제(operating system)를 동시에 실행하기 위한 논리적 플랫폼.
가상화 머신 모니터(virtual machine monitor)
또는 가상화 머신 매니저(virtual machine manager)
약어로 VMM
이라고도 한다.
Hypervisor는 물리적인 호스트 시스템이 여러 대의 가상 머신을 게스트로 운영할 수 있게 해, 메모리, 네트워크 대역폭, CPU 등과 같은 컴퓨팅 자원을 더 효과적으로 사용할 수 있도록 도와준다.
Hypervisor는 필요에 따라 각 VM에 이러한 컴퓨팅 리소스를 할당한다.
프로세서(CPU)
, 메모리(Memory)
, 스토리지(Storage)
, 네트워크(Network)
등하이퍼바이저의 종류는 크게 제 1형(Native VMM)
, 제 2형(Hosted VMM)
으로 나눈다.
제 1형 하이퍼바이저는 네이티브(native)
또는 베어메탈(bare metal)
하이퍼바이저라고 하는데, 호스트의 하드웨어에서 직접 구동돼 하드웨어를 제어하고 게스트 VM을 관리한다.
베어메탈(Bare Metal)
란 용어? : 하드웨어 상에 어떤 소프트웨어도 설치되어 있지 않은 상태예시
: Vmware ESX/ESXi , Cirtrix Xen , Microsoft Hyper-V, ...제 2형 하이퍼바이저는 호스트(hosted)
하이퍼바이저라고 불린다. 시스템 상의 다른 응용프로그램과 마찬가지로 전통적인 OS에서 구동된다. 이 경우 게스트 OS는 호스트 상의 프로세스로 구동되는 반면, 하이퍼바이저는 게스트 OS를 호스트 OS에서 분리한다.
예시
: VMware Workstation/Server/Player, Microsoft Virtual PC, Oracle Virtual Box, ...운영체제 수준의 가상화 기술로 커널을 공유하면서 프로세스를 격리된 환경에서 실행하는 기술
하드웨어를 가상화하는 가상 머신과 달리 커널을 공유하는 방식이기 때문에 실행 속도가 빠르고, 성능 상의 손실이 거의 없다.
어플리케이션의 실행에 필요한 라이브러리(Library, Libs), 바이너리(Binary, Bins), 기타 구성 파일 등을 패키지로 묶어서 배포한다. 따라서 구동 환경이 바뀌어도 실행에 필요한 파일이 함께 따라다니기 때문에 오류를 최소화할 수 있음
Libs
: 프로그램 구동 시에 필요하거나 공통으로 사용할 수 있는 특정 기능의 서브프로그램 또는 소스 코드 집합을 의미. 라이브러리에는 주로 함수(서브루틴), 클래스에 대한 정의, 구성 데이터 등 미리 작성된 코드를 포함
Bins
: 컴퓨터 저장과 처리 목적을 위해 이진수 형식으로 인코딩된 데이터 파일을 의미하는 것으로 코드의 컴파일(Compile) 또는 압축된 결과물
컴파일
: 사람의 언어를 컴퓨터가 이해할 수 있는 언어로 바꿔주는 과정
별도의 하드웨어 에뮬레이션 없이 리눅스 커널을 공유해 컨테이너를 실행하며 게스트 OS 관리가 필요 없다.
하드웨어 에뮬레이션이 없기 때문에 아주 빠르게 실행된다. 프로세스 격리를 위해 약간의 오버헤드가 있지만 크지 않다. 또한 하나의 머신에서 프로세스만큼 많이 실행하는 것이 가능하다.
모든 컨테이너는 호스트의 환경이 아닌 독자적인 실행환경을 가지고 있다. 이 환경은 파일들로 구성되며 이미지 형식으로 공유될 수 있다. 리눅스 커널을 사용하고 같은 컨테이너 런타임을 사용할 경우 컨테이너의 실행 환경을 공유하고 손쉽게 재현할 수 있다.
컨테이너는 Linux, Windows, Mac 등의 운영체제를 가리지 않고, 가상 머신, 물리적 서버, 개발자 컴퓨터, 데이터 센터, 온프레미스 환경, 퍼블릭 클라우드 등 사실상 어느 환경에서나 구동되므로 개발 및 배포가 크게 쉬워진다.
구글에서는 2014년에 이미 모든 서비스를 컨테이너에서 운영하고 있었으며 매주 20억 개 이상의 컨테이너를 실행했다. 이에 대해서는 구글의 컨테이너 페이지에도 설명되어 있다.
Gmail에서 YouTube, Google 검색에 이르기까지 Google의 모든 제품은 컨테이너에서 실행됩니다.
개발팀은 컨테이너화를 통해 더욱 신속하게 움직이고, 효율적으로 소프트웨어를 배포하며
전례 없는 수준의 확장성을 확보할 수 있습니다.
Google은 매주 20억 개가 넘는 컨테이너를 생성합니다.
현재는 구글을 비롯해 넷플릭스(Netflix), 에어비앤비(Airbnb), 핀터레스트(Pinterest), 레딧(Reddit), 포켓몬 고(Pocketmon Go), 스포티파이(Spotify), 틴더(Tinder), 라이엇 게임즈(Riot Games) 등이 컨테이너로 서비스를 운영하고 있는 것으로 알려져 있고, 국내 기업으로는 삼성전자, 삼성SDS, 당근마켓, VCNC, 우아한형제들, 엔씨소프트, 토스 등의 사례가 있다.
컨테이너가 서버 가상화 기술을 대체하며 인기를 끌고 있는 가장 큰 이유는 바로 가볍기 때문이다.
기존의 서버에 하이퍼바이저를 설치하고, 그 위에 가상 OS(게스트 OS)와 앱을 패키징한 VM을 만들어 실행하는 방식인 하드웨어 레벨
의 가상화와는 달리 컨테이너는 게스트 OS와 하이퍼바이저가 없는 OS 레벨
가상화 구조이기 때문에 시스템에 대한 요구사항이 적다.
컨테이너에는 OS가 포함되지 않아 크기가 수십 MB에 불과하며 운영 체제 부팅이 필요하지 않아 서비스 시작 시간 또한 매우 빠름. 또한 가볍기 때문에 컨테이너에 대한 복제와 배포가 용이하다.
반면, VM에는 게스트 OS가 포함되므로 크기가 수 GB를 넘고, 각각의 게스트 OS마다 운영 체제 구동에 필요한 하드웨어의 가상 복제본(CPU, RAM 등)을 모두 구동해야 하기 때문에 시스템 자원 또한 많이 소모한다.
따라서 컨테이너는 더 많은 응용프로그램을 더 쉽게 하나의 물리적 서버에서 구동시키는 것이 가능하기 때문에 마이크로 서비스 구축에 최적!
컨테이너는 생성 및 실행되면 마치 운영 체제 위에서 하나의 어플리케이션이 동작하는 것과 동일한 수준의 컴퓨팅 자원만을 필요로 함. 때문에 기존의 가상머신 방식 대비 시스템의 성능 부하가 훨씬 적은 편이다.
그리고 컨테이너에서 실행중인 서비스에 더 많은 가용성이 필요하거나 반대로 필요 없을 때, CPU 사용량 또는 사용자가 설정한 임계치에 따라 자동으로 확장 및 축소가 가능하다.
컨테이너
는 특정 클라우드 어플리케이션이 실행되기 위한 모든 라이브러리와 바이너리 파일 등이 패키지화되어 있기 때문에 기존의 시스템에서 실행하는 식으로 구동 방식이 간단하다.
반면, 가상머신
방식은 특정 어플리케이션을 실행하기 위해 먼저 새로운 VM을 띄우고 자원을 할당한 다음, 필요한 게스트 OS를 부팅한 후 어플리케이션을 실행시켜야 한다.
컨테이너 기술은 위와 같은 여러 장점이 있으나 안정성에 있어서는 우려되는 부분이 존재한다.
가상머신 방식은 VM들이 각각 독립된 형태로 완전히 분리되어 있기 때문에 안정적인 운영이 가능하지만, 컨테이너 방식은 비록 통제된 영역이라 할지라도 호스트 OS 커널을 공유하는 구조이기 때문에 한쪽에서 장애가 발생하면 다른 컨테이너들 또한 영향을 받을 수 있다.
(출처 : https://www.samsungsds.com/kr/insights/msa.html)
https://pearlluck.tistory.com/121
https://mangkyu.tistory.com/86
https://www.ciokorea.com/insider/36713
https://zigispace.net/726
https://kim-dragon.tistory.com/5
https://library.gabia.com/contents/infrahosting/9300/
https://cloud.google.com/learn/what-are-containers?hl=ko
https://m.blog.naver.com/shakey7/221600166205
정리 진짜 잘되있네요 감사합니다.