Micro Service Architecture 에서 인프라 적으로 중요한 개념으로 꼽으면 아래와 같이 2가지로 정리할 수 있다.
- Application Programming Interface (API)
- 가상화 (virtualization)
API는 이미 많은 개발자 및 인프라 측면에서 필요성을 느끼고, 서비스를 위한 기업에서는 많이 채택되는 기술이다. 가상화 기술 또한 이미 국내 기업에서도 많이 사용되고 있는 기술이지만, 그에 따른 개발자나 인프라 관리하는 운영자 측면에서 아직 낯설고 이용을 하더라도 그에 따른 문제점을 재기하는 사람들 또한 많다.
이번 글에서는 가상화 서비스 중 요즘 이슈가 되고 있는 컨테이너 기반의 가상화에 대해 소개해 보도록 하겠다.
서버 가상화란
요즘은 클라우드 컴퓨팅 기술의 활용이 보편화되고 있는 추세다. 클라우드 컴퓨팅 기술은 자원을 공유하고 효율적으로 이용할 수 있는 장점으로 인해 요즘 많은 시스템 서비스 구성이 이용되고 있다. 그 핵심 기반 기술로 가상화 (virtualization) 기술을 꼽을 수 있는데, 서버 분야에서 많이 사용되는 서버 가상화 기술에는 Hypervisor기반의 Xen, VMWare, KVM, VirtualBox 등이 있다. Hypervisor기반의 서버 가상화 기술은 물리적 서버 위에 운영체제(이하 호스트 OS)를 설치하고, 자원을 분할하여 가상머신을 생성한 뒤에 게스트OS라는 운영체제를 설치하고 그 위에서 응용 프로그램을 설치한다. 하나의 물리적 시스템에 독자적으로 여러 서버 환경을 운영할 수 있다는 장점은 있으나, 또하나의 OS 자원을 구동하므로 자원의 낭비가 큰 단점을 가지고 있다.
서버 가상화의 종류
가상 서버를 생성하는 데는 세가지 방식이 있다. 전가상화(full virtualization), 반가상화(para-virtualization), OS레벨 가상화(OS-level virtualization). 물리 서버는 호스트(host)라고 하며, 가상 서버는 (guest)라 한다.
전가상화는 하이퍼바이저(hypervisor)라고 하는 특수한 소프트웨어를 사용한다. 하이퍼바이저는 물리 서버의 CPU와 디스크 자원과 직접 통신을 하며, 가상 서버의 운영체제를 위한 기반 역할을 한다. 하이퍼바이저는 각각의 가상 서버들을 독립적으로 운영되도록 각 자원사용이 분리되어 있다.. 게스트 서버는 설치된 각 게스트 OS에서 운영되기 때문에 동시에 리눅스, 윈도우등 다양한 OS를 설치, 운영할 수 있다. 하이퍼바이저는 물리 서버의 자원을 모니터링하여, 물리 서버의 자원을 적절히 할당함으로 운영 자원 활용의 효율성을 극대화 한다.
반가상화는 게스트 서버 간의 독립성 없이 상호작용한다. 반가상화 하이퍼바이저는 게스트 운영체제를 관리하기 위해 필요한 자원(처리능력)이 상대적으로 적게 든다. 이는 각각의 OS가 동일한 물리 서버에서 운영되는 다른 운영체제에서 필요로 하는 자원을 이미 인지하고 있으며, 이들 시스템은 마치 하나처럼 동작하게 된다.
OS레벨 가상화는가상화 기능이 호스트 OS에 포함되어 있는 경우이다. 따라서 게스트 서버는 반드시 동일한 OS와 동일하게 구동해야 되는 한계를 가지고 있다.
가상화의 한계
물리적 연산이 많은 즉 CPU 작업이 많은 경우 가상화는 좋지 못한 효율성을 가지고 있다. 더군다나, 여러 가상서버를 동시에 구동하는 경우 성능문제가 더 심각해 진다.
또한 많은 가성머신을 하나의 서버에 구동시키는 경우 중복된 자원 사용으로 인한 성능 저하가 심각한 문제를 가지고 있으며, 배포시 OS 이미지를 모두 가지고 있기 때문게 기본적인 가상머신 이미지가 1G~ 300G 까지 그 용량이 매우 커지는 문제점을 가지고 있다.
새로운 가상화 대채기술 : container 기술
이러한 OS기반의 가상화 문제점을 해결하고자 필수자원에 대해서는 독립적으로 사용하고 그렇지 않은 경우는 공유를 통해 자원의 효율적이 사용을 위해 container 기술이 개발되었다. 그 기반은 linux container 기술로 보통 LXC 라고 부르며 linux kernel을 독립적인 환경에서 사용하기 위한 API를 제공하며, 이 API를 잘 활용해서 만든 것이 Docker이다.
|
|
|
Virual Machines 환경 Hypervisor 위에 각각의 Guest OS가 구동되는것을 볼 수 있다.Application에서 Host OS 자원을 활용하기 위해서는 Guest OS를 거쳐야 된다. |
|
Container 기술 환경 기존 Virtual Machine 환경에 비해 Docker Engine을 통해 각 Application은 OS의 자원을 직접 활용할 수 있다. 구조적으로 Guest OS가 없기때문에 용량도 매우 가볍다. |
LXC는 다음과 같은 특징을 가지고 있다.
- Kernel namespaces (ipc, uts, mount, pid, network and user)
- Apparmor and SELinux profiles
- Seccomp policies
- Chroots (using pivot_root)
- Kernel capabilities
- CGroups (control groups)
개발자 관점에서 컨테이너 기술
컨테이너 기술이 더 많은 혜택을 볼 수 있는 사람들이 있다. Docker 및 Docker 환경은 개발자와 IT 전문가 모두에게 큰 이점을 제공한다.
개발자가 Docker 컨테이너를 빠르게 받아들인 이유는 무엇보다도 Linux 컨테이너를 쉽게 사용할 수 있기 때문이다.
간단한 명령을 사용하여 배포하기 쉬운 고정 이미지를 생성, 이 이미지들을 Docker 파일을 이용해 자동으로 구축
이 이미지들은 푸시 앤 풀 명령을 사용하여 레지스트리에 쉽게 공유
컴퓨터가 아닌 격리된 응용 프로그램 구성 요소를 활용
Docker 컨테이너와 다양한 기본 이미지들을 잘 다룰 수 있는 수많은 도구를 사용
운영자 입장에서 컨테이너 기술
IT 및 운영 전문가 역시 컨테이너 및 가상 컴퓨터를 조합하여 이점을 얻을 수 있다.
컨테이너에서 실행되는 서비스는 VM 호스트 실행 환경에서 격리
컨테이너 내 코드는 동일하게 인증
개발, 테스트, 프로덕션 환경을 가리지 않고 신속하게 시작, 중지, 이동
기업은 시장 경쟁력을 유지하고 고객 만족도 및 도달 범위를 증가시키기 위해 전문 정보 기술 조직이 처리 성능 및 리소스 최적화 작업을 수행할 수 있다.
VM과 컨테이너 비교
응용 프로그램 요구 사항에 따라 보다 적합한 기능도 있고 그렇지 않은 기능도 있다. 또한 모든 소프트웨어와 마찬가지로 약간 작업을 하면 지원되는 기능을 향상시킬 수 있으며 특히 보안 분야의 기능 지원에서 효과를 볼 수 있다.
기능 | Virtual Machine | Container |
보안성 | 높은 수준으로 지원 | 약간 낮은 수준으로 지원 |
디스크 용량 | 전체 OS + Application | Application Only |
시작 소요 시간 | OS 부팅 및 프로그램 로딩 | 매우 짧음 |
이식성 | 이식성은 좋으나 크기 문제로 이식 속도가 빠르지 않음. | 매우 좋음. |
이미지 자동화 | OS와 Application에 따라 크게 다름 | 레지스트리를 통한 편리한 자동화 |
Docker
해물 운송에 필요한 항만시설은 직접 보지 못했다고 하더라도, 뉴스나 다양한 형태로 접해 보았을 것이다. 규격화된 다수의 컨테이너틑 보관하고 각 컨테이너를 필요한 곳으로 빠르게 배송하고 관리하기 위한 시설이 항만시설이며 거기서 일하는 사람을 빗대어 Docker 라고 명명했다.
2013년에 처음 등장했으며, SW도 항만시설의 컨테이너 처럼 최소 기반만 마련하고 각각 독립된 보관소를 제공하고 빠르게 배포 관리하기 위한 목적으로 opensource 형태로 개발되었다.
현재 linux의 LXC 를 쓰기 때문에 리눅스, 그중에서 ubuntu 기반에서만 docker를 쓸 수 있디만, 기타 container 구동을 위한 OS(coreOS)등이 등장하고 있다.
Docker 와 MSA
Micro Service Architecture 핵심인 좋은 Service Module을 만들기 위한 조건은 Loose Coupling과 High Cohesion이다. Loose Coupling의 완벽한 시스템적인 OS 및 H/W 적으로도 각 서비스들이 완벽히 분리되어야 하며, 동일 성격의 서비스도 각 서비스간의 완벽한 독립성을 유지하여야 한다. 이러한 서비스를 가 분리된 H/W 배포 관리를 위하여 기존 VM 환경에서 관리된다면, 성능 저하 및 배포 사이즈 문제로 인해 구현이 매우 어려운 문제점을 가지고 있다.
따라서 이러한 문제점을 해결하기 위해 가장 작은 단위의 서비스 환경을 구현하고 컨테이너 형태로 배포 관리한다면 기존 VM 보다 훨씬 편리하고 성능적으로도 문제가 없는 환경으로 구축 할 수 있다.
SW 적으로도 framework 에 대한 의존성을 낮추고 최소 모듈 형태로 서비스가 개발되기 위하여 가장 작은 단위인 Application 개발을 위해 독립 실행 framework 이 필요로 하며 이러한 경우 Spring Boot 나 coreFRAME과 같은 상용 framework 을 이용하여 구축할 수 있다.
참고
https://linuxcontainers.org/lxc/introduction/
http://www-07.ibm.com/solutions/kr/itsolutions/pdf/Virtualization.pdf
'프론트엔드' 카테고리의 다른 글
핀테크 오픈플랫폼 구축 방안 (0) | 2016.06.09 |
---|---|
무한스크롤, 페이징 혹은 "더보기" 버튼? 어떤 걸 써야할까 (0) | 2016.05.30 |
HTML5 로 데스크탑 어플리케이션 만들기 3 (0) | 2016.01.15 |
모놀리틱 시스템에서 MSA로 전환 (0) | 2015.12.12 |
HTML5 로 데스크탑 어플리케이션 만들기 2 (0) | 2015.12.04 |