본문 바로가기
K8s/컨테이너 격리

컨테이너 격리 - process

by 식사법 2024. 8. 31.

컨테이너 격리 - process

Filesystem 격리의 문제

앞서 실습했던 chroot, pivot_root+mount namespace 의 경우 filesystem만이 격리되어 있었습니다. 그렇기 때문에 다른 Host의 프로세스가 보이거나 , 호스트의 포트를 쓴다거나, root권한이 있는 문제가 있습니다.

그래서 프로세스 자체에 격리된 환경을 제공하는 namespace라는 메커니즘이 등장합니다. 리눅스의 커널을 사용하여 동작하며 모든 프로세스는 타입별로 네임스페이스에 속하고, 자식 프로세스는 부모의 네임스페이스를 상속한다는 특징이 있습니다. 나아가 프로세스는 네임스페이스 타입별로 일부는 호스트(root) 네임스페이스를 사용하고 일부는 컨테이너의 네임스페이스를 사용할 수 있습니다. 즉, mount 네임스페이스는 컨테이너의 것으로 격리하고, network 네임스페이스는 호스트 것을 사용할 수 있습니다.

Namespace

그래서 Filesystem 뿐만아니라 process 도 격리가 가능하게 하는 기능이 도입됩니다.

네임스페이스 관련 프로세스들의 특징은

  1. 모든 프로세스들은 네임스페이스 타입별로 특정 네임스페이스에 속합니다
  2. Child 는 Parent 의 네임스페이스를 상속받습니다
  3. 프로세스는 네임스페이스 타입별로 일부는 호스트(root) 네임스페이스를 사용하고 일부는 컨테이너의 네임스페이스를 사용할 수 있습니다.
    • mount 네임스페이스는 컨테이너의 것으로 격리하고, network 네임스페이스는 호스트 것을 사용

  • Mount(파일시스템), Network(네트워크), PID(프로세스 id), User(계정), ipc(프로세스간 통신), Uts(Unix time sharing, 호스트네임), cgroup

Namespace를 통한 격리 구현

  • 프로세스 별 네임스페이스 확인
#전체 프로세스 별 네임스페이스 확인
ls -al /proc/$$/ns

#특정 네임스페이스의 id값 확인
#readlink /proc/$$/ns/{네임스페이스 명}
readlink /proc/$$/ns/mnt
readlink /proc/$$/ns/net

****# 네임스페이스 확인 방법 2 : lsns - List system namespaces
lsns -p 1
lsns -p $$

## lsns -t {네임스페이스 명} -p {pid} 
## NPROCS : 해당 네임스페이스에 속해있는 프로세스 갯수
## PID : 해당 네임스페이스의 (최초) 주인 프로세스
lsns -t mnt -p 1
lsns -t mnt -p $$

1) mount namespace 확인

  • 최초의 namespace , 이전 계시글에서 실습해본 녀석
#터미널 1
unshare -m
lsns -p $$
#터미널2
lsns -p $$

새로운 namespace이기 때문에 PID, NS 등 값이 다른것을 확인할 수 있다.

2) UTS namespace 확인

*UTS = Unix Time Sharing

격리 시 프로세스 그룹별로 독립적인 호스트 이름(hostname)과 도메인 이름(NIS domain name)을 다르게할 시 사용

unshare -u
lsns -t uts -p $$
#터미널2
lsns -t uts -p $$

3) IPC namespace 확인

격리 시 메시지 큐, 세마포어, 공유 메모리 같은 IPC 자원을 프로세스 그룹별로 격리

unshare -i
lsns -t ipc -p $$
#터미널2
lsns -t ipc -p $$

4) PID namespace 확인

  • 서로 다른 네임스페이스에 속한 프로세스들이 서로의 존재를 알지 못하도록 만듭니다. ( process는 부모-자식 구조로 되어 있기 때문에 부모네임스페이스 에서는 자식 네임스페이스를 확인 할 수 있다 )
  • 각 네임스페이스는 자체적인 PID 트리를 가지며, 같은 PID를 가지더라도 다른 네임스페이스에서 실행되는 프로세스는 서로 다른 프로세스로 간주됩니다.

#현재 Pid 확인
echo $$

#네임스페이스 격리
unshare -fp --mount-proc /bin/sh

#현재 Pid 확인
echo $$

격리되어 pid값이 달라졌음을 확인 할 수 있다.

'K8s > 컨테이너 격리' 카테고리의 다른 글

리눅스 프로세스 격리 - filesystem  (0) 2024.08.31
도커 기본 설명  (0) 2024.08.31