비버놀로지

[Kubernetes] VM(Virtual Machine) vs Container 본문

SERVER

[Kubernetes] VM(Virtual Machine) vs Container

KUNDUZ 2021. 10. 14. 20:19
728x90

VM(Virtual Machine)과 Container의 차이와 Container에 대해 조금 더 알아보자.

 

* docker의 특징

  • Linux 6에서 개발된 A라는 서비스를 Linux 7버전에서 띄우게 되면 OnpenJDK 등 버전 차이에 따른 문제가 생기기 마련인데, docker를 설치하고 Container Image를 만들어서 해결할 수 있다.
  • Container Image에는 한 서비스와 그 서비스가 돌아가는데 필요한 라이브러리들이 같이 있다. 그래서 Linux 7버전에 다른 라이브러리들이 있더라도 docker를 이용하면 Container Image를 가져와서 사용했을 때 A Service가 자신의 이미지 안에 있는 라이브러리를 사용하기 때문에 안정적으로 시스템을 구동할 수 있다.
  • 그리고 docker는 Linux 고유기술인 namespace와 cgroups을 사용해서 격리를 하여, 여러 Container간의 Host 자원을 분리해서 쓰도록 해준다.   - namespace :: kernel에 관련된 영역을 분리 (mnt, pid, net, ipc, uts, user)   - cgroups :: 자원에 관련된 영역을 분리 (memory, CPU, I/O, network)
  • 정리하자면, docker와 같이 container virtualization solution들은 OS에서 제공하는 자원 격리 기술을 사용해서, container라는 단위로 service를 분리할 수 있게 만들어 주고, 이것을 사용하면 container virtualization이 깔려있는 OS에서는 개발환경에 대한 걱정 없이 배포가 가능하게 된다.

 

 

1. 시스템 구조에서 오는 차이점

 

Virtual Machine Container
Host Server
Host OS (Linux, Mac, Window)
Hypervisor (Xen, KVM, VMware) Container virtualization software (docker, rkt, LXC)
Guest OS Guest OS Container Container
A Service B Service A Service B Service
Java Node.js OpenJDK version 1.6 mongoDB version 3.6
Apache Tomcat mariaDB C Service ...
mongoDB ... node.js version 10 ...
  • 시스템 구조적으로 Container는 한 OS를 공유하는 개념, VM은 각각의 OS를 띄워야하는 구조기 때문에 Container가 훨씬 빠르다.
  • VM은 Window를 사용하고 있더라도 새로운 Guest OS를 설치할 때 Linux OS를 설치하여 사용할 수 있다.
  • Container는 Linux OS에서 Window용 Container를 사용할 수 없다.
  • 보안적으로 VM은 Guest OS가 뚫려도 다른 Guest OS나 Host OS와는 완벽히 분리가 되어있기 때문에 각각의 VM끼리 피해가 가지 않는다.
  • Container는 한Container가 뚫려서 OS영역에 접근하게 되면 다른 Container들도 위험해질 수 있다. 하지만 이런 부분들은 계속해서 보완이 될 예정

 

2. 시스템 개발 사상적인 부분의 차이점

Virtual Machine Container
Host Server
Host OS (Linux, Mac, Window)
Hypervisor (Xen, KVM, VMware) Container virtualization software (docker, rkt, LXC)
Guest OS Guest OS Pod Pod
A Service B Service  Container  |  Container  |
Module A Module A |  Module A  | |  Module C  |
Module B Module B  Container  | Pod
Module C Module C |  Module B  | |        ...       |
  • 일반적으로 한 서비스를 만들 때 한가지 언어를 사용해서 여러 모듈들이 한 서비스로 같이 돌아간다. 근데 만약 C모듈에 부하가 많이 가는 상황이라면 VM을 하나 더 생성해서 띄우게 되는데, 자원사용과 성능 입장에서 Guest OS를 하나 더 띄우고 Module A와 B는 사실상 확장을 하지 않아도 되는데 한 패키지기 때문에 그대로 따라 올라가면서 낭비가 심해진다는 것을 알 수 있다.
  • 반면 Container는 한 서비스를 만들 때 Module별로 쪼개서 각각의 Container에 담는 것을 권하고 있고, Module에 맞는 최적화된 언어를 사용하면 더 좋다.
  • 쿠버네티스는 여러 컨테이너들을 한 Pod라는 개념에 묶을 수 있다. 한 Pod는 하나의 배포 단위. 내가 필요한 Pod만 확장 할 수 있는데, 쿠버네티스가 쉽게 해준다.
  • 이렇게 Container는 시스템을 Module별로 쪼개서 개발을 했을 때 큰 효과를 발휘할 수 있다.

 

 

728x90

'SERVER' 카테고리의 다른 글

[Docker] 서버에 docker 설치하기  (0) 2021.10.14
[Kubernetes] Why Kubernetes?  (0) 2021.10.14
[Kubernetes] History of Virtualization  (0) 2021.10.14
Comments