namespace, cgroup
tags: container
컨테이너 기술에 이용된다는 cgroup 과 namespace를 알아보자
(참고 : https://bluese05.tistory.com/11)
namespace
하나의 system에서 수행되지만, 각각 별개의 독립된 공간처럼 격리된 환경을 제공하는 lightweight 가상화 기술
vm에서 쓰이는 hypervisor는 hw resource를 가상화
namespace는 동일한 os, kernel 에서 작동
namespace 종류
- mnt(fs mount) : file system 의 mount 지점을 분할하여 격리
- pid : 독립적인 프로세스 공간 할당. pid 분할 관리
- net : network 리소스와 관련된 정보를 분할(network interface, iptables 등)
- ipc : 프로세스간 독립적인 통신통로 할당
- uts : 독립적인 hostname 할당
- user: uid, gid 분할 격리
linux namespace 구현 시 사용되는 systemcall
clone(), nshare(), setns()
namespace가 생성되면 /proc/
namespace 생성 예
pid namespace 를 생성하는 예
bash 의 프로세스를 분리해봅시다.
$ sudo unshare --fork --pid --mount-proc bash
이렇게 하고 프로세스 상태를 보면
root@DESKTOP-0SRLPKM:/home/eun# ps aux
USER PID %CPU %MEM VSZ RSS TTY STAT START TIME COMMAND
root 1 0.7 0.0 15708 2240 tty2 S 21:34 0:00 bash
root 11 0.0 0.0 17380 1920 tty2 R 21:34 0:00 ps aux
pid 1 이 bash 로 되어 있고 프로세스도 두개만 떠있음.
방금 bash 의 프로세스 namespace를 분리해서 들어 온 것.
이제 이 namespace 내부에서 실행되는 프로세스들은 기존 pid 할당순서와 별개로 pid를 부여 받는다.
pid 1이라고 init process는 아니지만, init 과 비슷하게 수행되는 부분이 있다.
위 그림에서 8(3)번이 죽으면 9(4) 의 부모 프로세스가 6(1) 이 된다.
cgroup (control groups)
자원에 대한 제어를 가능하게 해주는 기능
제어하는 리소스
- 메모리
- cpu
- i/o
- 네트워크
- device 노드
cgroup 을 이용해 container 에서는 vm 에서와 동일하게 리소스 할당량을 제한 할 수 있음
crgoup 과 namespace 를 이용한 기술
namespace로 pid, 네트워크 같은 추상적인 개념을 나누고
cgroup 으로 실제 물리적인 자원을 할당하는 느낌
lxc, libContainer, runC 등은
cgroup과 namespaces를 표준으로 정의한 OCI(Open Container Initative) 스펙을 구현한 컨테이너 기술의 구현체.
docker 는 1.8 이전버전까지 lxc 를 구현해서 사용했음
현재는 libContainer -> runC 로 자체 구현체를 가지게 됨
(runC 는 libContainer의 repackaging 이라 함.)