지난 포스팅에서 마이크로서비스 아키텍처에 대해 다뤘다.
이번 포스팅에는 마이크로서비스 아키텍처를 쉽게 구현하기 위해 필요한 가상화 컨테이너기술에 대해서 다루겠다.
가상머신과 비슷한 OS가상화의 한 유형이다.
Hypervisor와 다른 점은 Hypervisor는 OS 및 커널이 통째로 가상화되는 반면에 컨테이너는 리소스격리를 통해 filesystem의 가상화만을 이루고있다.(호스트 PC와 커널을 공유한다)
그러면 컨테이너기술은 어떻게 Guest OS없이 Host OS의 자원을 공유할까?
컨테이너의 핵심기술은 다음의 세 가지이다.
프로그램이 실행되면 OS안에 프로세스들은 fork를 하며 서로 상호작용을 하게된다. 이때 서로 다른 유형그룹별로 격리시켜 다른 그룹에 속하는 프로세스끼리는 영향을 받지 않도록 하는 컨테이너라고 부르는 작업공간을 만드는 커널의 기능이다.
Unshare라는 시스템호출(System call)로 아래의 6가지 네임스페이스를 생성할 수 있다.
1. mnt : 리눅스 커널에서 생성된 첫 번째 네임스페이스. 호스트 파일시스템에 구애받지 않고 독립적으로 파일시스템 마운트 지점을 제어한다.
2. pid : 독립적인 프로세스 공간을 할당 (중첩된다)
3. net : 루프백인터페이스를 바탕으로 네트워크 스택을 가상화하여 관리하기때문에 namespace간에 network 충돌을 방지한다
4. ipc : 프로세스간의 독립적인 통신통로 할당(통신에 대한 접근 관리)
5. uts : 독립적인 hostname 할당(gethostname과 sethostname프로세스가 사용된다)
6. user : 독립적인 사용자 할당 UID/GID를 컨테이너에서 호스트로 매핑할 수 있다.
시스템콜로 namespace만들어보기
1. pid 격리시키기
unshare 시스템콜에 '--fork --pid --mount-proc bash'인자를 추가하여 root권한으로 실행시킨다
1
2
|
sudo unshare --fork --pid --mount-proc bash
|
cs |
독립된 프로세스 할당 확인
1
|
ps aux
|
cs |
새로 할당된 공간 해제하기
2. uts 격리시키기
기존 hostname확인
1
|
hostname
|
cs |
unshare 시스템콜에 '-u /bin/bash'인자를 추가하여 root권한으로 실행시키고,
hostname을 생성한다.
1
2
|
sudo unshare -u /bin/bash
hostname new-hostname
|
cs |
생성된 hsotname을 확인
1
|
hostname
|
cs |
자원(resources)에 대한 제어를 그룹별로 가능하게 해주는 리눅스 커널의 기능이다.
컨트롤 그룹(cgroups)으로 컨테이너가 사용하는 호스트의 리소스를 공유하고 제한한다.
미리 정의된 스키마로 CPU와 메모리를 공유할 수 있다.
•메모리
•CPU
•I/O
•네트워크
•Device 노드
컨테이너는 이미지로 실행된다. 컨테이너 이미지는 파일시스템을 스냅샷으로 만들기때문에 Hypervisor의 VM이미지보다 사이즈가 훨씬 작은 편이다.
통합파일시스템(Union filesystem)은 이미지를 효율적으로 저장, 다운로드, 실행할 수 있도록 해주는데,
커널의 Copy-on-write(COW)를 사용해서 변경사항을 추적하고 관리한다.
*Copy-on-write(COW)란?
커널의 시스템콜 중 vfork()처럼 부모 프로세스의 데이터 부분에 대한 참조만 소유하고 있다가 실제 변경이 발생하는 시점에 복사를 하여 사용하는 방식
컨테이너는 위의 커널의 시스템콜 중 가상화에 이용할 수있는 3가지 핵심 기능을 이용해서 게스트 os없이 독립적으로 서비스가 실행되는 컨테이너를 구성할 수 있다.
컨테이너 기술로 가장 대표적인것은 도커인데, 2013년 도커가 세상에 나오고나서 세상을 놀라게 했고 지금 다루고있는 마이크로 서비스의 구현에 최적화된 서비스이다. 그런데 도커는 이미지가 많아지면 관리하기 힘든 단점이 있다.
그래서 나의 환경에 존재하는 도커의 컨테이너 이미지를 리소스 관리, 배포의 자동화 등 마스터에서 쉽게 관리할 수있는 쿠버네티스가 요즘 클라우드에서 뜨겁다.
다음 포스트에서는 컨테이너로 프라이빗 환경을 구성할 수 있는 솔루션중 쿠버네티스에 대해 다뤄볼 예정이다.
피드백은 언제나 환영입니다.
RISC-V #3 - 가상화를 통한 RISC-V 부팅 실습 (2) | 2019.07.29 |
---|---|
마이크로서비스#3 - 쿠버네티스란 무엇인가? (0) | 2019.07.27 |
RISC-V #2 - RISC-V와 ARM 명령어 셋 비교 (0) | 2019.07.19 |
마이크로서비스#1 - 마이크로서비스 아키텍처 이해 (0) | 2019.07.18 |
RISC-V #1 - 개요 (0) | 2019.07.12 |