khann's IT와 경제 블로그

반응형

지난 포스팅에서 마이크로서비스 아키텍처에 대해 다뤘다.

https://khann.tistory.com/8

 

마이크로서비스#1 마이크로서비스 아키텍처 이해

마이크로서비스(MSA, Micro Service Architecture) 우리는 보통 새로운 애플리케이션을 만들 때, 하나의 개발환경을 세팅하고(OS는 RedHat, JDK1.8에 Mysql5.7 등등) 작은 애플리케이션부터 만들기 시작한다. 이후..

khann.tistory.com

이번 포스팅에는 마이크로서비스 아키텍처를 쉽게 구현하기 위해 필요한 가상화 컨테이너기술에 대해서 다루겠다.

 

컨테이너란 무엇인가?


가상머신과 비슷한 OS가상화의 한 유형이다.

Hypervisor와 다른 점은 Hypervisor는 OS 및 커널이 통째로 가상화되는 반면에 컨테이너는 리소스격리를 통해 filesystem가상화만을 이루고있다.(호스트 PC와 커널을 공유한다)

가상화머신의 2종류(Hypervisor기술과 Container기술)

 

그러면 컨테이너기술은 어떻게 Guest OS없이 Host OS의 자원을 공유할까?

컨테이너의 핵심기술은 다음의 세 가지이다.

 

 

컨테이너 핵심 구성요소


 

이름공간 namespace

프로그램이 실행되면 OS안에 프로세스들은 fork를 하며 서로 상호작용을 하게된다. 이때 서로 다른 유형그룹별로 격리시켜 다른 그룹에 속하는 프로세스끼리는 영향을 받지 않도록 하는 컨테이너라고 부르는 작업공간을 만드는 커널의 기능이다.

 

Unshare라는 시스템호출(System call)로 아래의 6가지 네임스페이스를 생성할 수 있다.

1. mnt : 리눅스 커널에서 생성된 첫 번째 네임스페이스호스트 파일시스템에 구애받지 않고 독립적으로 파일시스템 마운트 지점을 제어한다.
2. pid : 독립적인 프로세스 공간을 할당 (중첩된다)
3. net : 루프백인터페이스를 바탕으로 네트워크 스택을 가상화하여 관리하기때문에 namespace간에 network 충돌을 방지한다
4. ipc : 프로세스간의 독립적인 통신통로 할당(통신에 대한 접근 관리)
5. uts : 독립적인 hostname 할당(gethostnamesethostname프로세스가 사용된다)
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

 

bash 프로세스가 pid1로 할당된 모습

새로 할당된 공간 해제하기

1
exit
cs

 

 

2. uts 격리시키기

 

기존 hostname확인

1
hostname
cs

 

hostname은 testname이다

 

unshare 시스템콜에 '-u /bin/bash'인자를 추가하여 root권한으로 실행시키고, 

hostname을 생성한다.

1
2
sudo unshare -/bin/bash
hostname new-hostname
cs

 

생성된 hsotname을 확인

1
hostname
cs

 

새로 생성된 new-testname

 

컨트롤 그룹(cgroups)

자원(resources)에 대한 제어를 그룹별로 가능하게 해주는 리눅스 커널의 기능이다. 

컨트롤 그룹(cgroups)으로 컨테이너가 사용하는 호스트의 리소스를 공유하고 제한한다.

미리 정의된 스키마로 CPU와 메모리를 공유할 수 있다.

메모리
CPU
I/O
네트워크
Device 노드

 

통합파일시스템(Union filesystem)

컨테이너는 이미지로 실행된다. 컨테이너 이미지는 파일시스템을 스냅샷으로 만들기때문에 Hypervisor의 VM이미지보다 사이즈가 훨씬 작은 편이다.

통합파일시스템(Union filesystem)은 이미지를 효율적으로 저장, 다운로드, 실행할 수 있도록 해주는데, 

커널의 Copy-on-write(COW)를 사용해서 변경사항을 추적하고 관리한다.

 

*Copy-on-write(COW)?
커널의 시스템콜 중 vfork()처럼 부모 프로세스의 데이터 부분에 대한 참조만 소유하고 있다가 실제 변경이 발생하는 시점에 복사를 하여 사용하는 방식

컨테이너의 이미지 Layer 예시

 

마치며,,

컨테이너는 위의 커널의 시스템콜 중 가상화에 이용할 수있는 3가지 핵심 기능을 이용해서 게스트 os없이 독립적으로 서비스가 실행되는 컨테이너를 구성할 수 있다.

컨테이너 기술로 가장 대표적인것은 도커인데,  2013년 도커가 세상에 나오고나서 세상을 놀라게 했고 지금 다루고있는 마이크로 서비스의 구현에 최적화된 서비스이다. 그런데 도커는 이미지가 많아지면 관리하기 힘든 단점이 있다.

그래서 나의 환경에 존재하는 도커의 컨테이너 이미지를 리소스 관리, 배포의 자동화 등 마스터에서 쉽게 관리할 수있는 쿠버네티스가 요즘 클라우드에서 뜨겁다.

 

다음 포스트에서는 컨테이너로 프라이빗 환경을 구성할 수 있는 솔루션중 쿠버네티스에 대해 다뤄볼 예정이다.

 

 

피드백은 언제나 환영입니다.

 

반응형

이 글을 공유합시다

facebook twitter googleplus kakaostory naver