네임스페이스 격리 프로세스 (Namespace Isolation)
Ⅰ. 개요
1. 정의
**네임스페이스(Namespace)**는 리눅스 커널이 제공하는 자원 격리 기술로, 하나의 시스템에서 실행되는 프로세스들이 서로 다른 시스템에 있는 것처럼 보이도록 리소스 뷰를 분리한다. 컨테이너 기술(Docker, Kubernetes 등)의 핵심 기반이다.
네임스페이스 격리 개념
┌─────────────────────────────────────────────────────┐
│ 호스트 시스템 │
│ ┌───────────────────┐ ┌───────────────────┐ │
│ │ 네임스페이스 A │ │ 네임스페이스 B │ │
│ │ │ │ │ │
│ │ PID 1 (init) │ │ PID 1 (bash) │ │
│ │ hostname: ns_a │ │ hostname: ns_b │ │
│ │ /mnt (독립) │ │ /mnt (독립) │ │
│ │ eth0 (veth) │ │ eth0 (veth) │ │
│ │ UID 0 (맵핑됨) │ │ UID 0 (맵핑됨) │ │
│ └───────────────────┘ └───────────────────┘ │
│ │
│ ★ 각 네임스페이스는 서로를 인식하지 못함 │
│ ★ 호스트 관점에서는 모두 같은 시스템의 프로세스 │
└─────────────────────────────────────────────────────┘
비유: 네임스페이스는 "같은 건물 안에 있는 각기 다른 방"과 같다. 각 방에는 자기만의 조명, 온도 조절기, 창문이 있어서 방 안에서는 자기 방이 전부인 것처럼 느끼지만, 건물 밖에서 보면 모두 같은 건물에 있다.
Ⅱ. 네임스페이스 종류
1. 7가지 네임스페이스 유형
리눅스 네임스페이스 분류
┌─────────────┬────────────────┬───────────────────────┐
│ 네임스페이스 │ CLONE_NEW* │ 격리 자원 │
├─────────────┼────────────────┼───────────────────────┤
│ Mount │ CLONE_NEWNS │ 마운트 포인트, 파일시스템│
│ UTS │ CLONE_NEWUTS │ 호스트네임, 도메인명 │
│ IPC │ CLONE_NEWIPC │ System V IPC, POSIX MQ │
│ PID │ CLONE_NEWPID │ 프로세스 ID 공간 │
│ Network │ CLONE_NEWNET │ 네트워크 인터페이스, │
│ │ │ 방화벽, 라우팅 테이블 │
│ User │ CLONE_NEWUSER │ UID, GID 매핑 │
│ Cgroup │ CLONE_NEWCGROUP│ /sys/fs/cgroup 뷰 │
└─────────────┴────────────────┴───────────────────────┘
2. 각 네임스페이스 상세
네임스페이스별 격리 범위 상세
┌──────────────────────────────────────────────────┐
│ │
│ MOUNT ────────────────────────────────────── │
│ ┌─────────────┐ ┌─────────────┐ │
│ │ /proc │ │ /proc │ │
│ │ /sys │ │ /sys │ │
│ │ /mnt/data │ │ /mnt/other │ ← 다른 마운트 │
│ └─────────────┘ └─────────────┘ │
│ │
│ UTS ─────────────────────────────────────── │
│ ┌─────────────┐ ┌─────────────┐ │
│ │ host: alpha │ │ host: beta │ ← 다른 호스트명│
│ └─────────────┘ └─────────────┘ │
│ │
│ PID ──────────────────────────────────────── │
│ ┌─────────────┐ ┌─────────────┐ │
│ │ PID 1: init │ │ PID 1: bash │ ← 독립 PID │
│ │ PID 2: sshd │ │ PID 2: app │ 공간 │
│ └─────────────┘ └─────────────┘ │
│ │
│ NETWORK ──────────────────────────────────── │
│ ┌─────────────┐ ┌─────────────┐ │
│ │ eth0: 10.1 │ │ eth0: 10.2 │ ← 독립 IP │
│ │ lo: 127.0.1 │ │ lo: 127.0.2 │ 공간 │
│ └─────────────┘ └─────────────┘ │
│ │
└──────────────────────────────────────────────────┘
Ⅲ. 네임스페이스 생성 방법
1. unshare() 시스템 콜
int unshare(int flags);
// 현재 프로세스를 새 네임스페이스로 이동
// 사용 예시
unshare(CLONE_NEWNET); // 새 네트워크 네임스페이스
unshare(CLONE_NEWNS); // 새 마운트 네임스페이스
unshare(CLONE_NEWUTS | CLONE_NEWIPC); // 여러 개 동시
unshare 동작 원리
┌─────────────────────────────────────────────────┐
│ │
│ unshare(CLONE_NEWNET) 호출 전: │
│ ┌────────────────────────────┐ │
│ │ 호스트 네트워크 네임스페이스 │ │
│ │ eth0, lo, iptables │ │
│ └────────────────────────────┘ │
│ │
│ unshare(CLONE_NEWNET) 호출 후: │
│ ┌────────────────────┐ ┌──────────────────┐ │
│ │ 호스트 네트워크 │ │ 새 네트워크 │ │
│ │ eth0, lo, iptables │ │ lo만 존재 │ │
│ └────────────────────┘ └──────────────────┘ │
│ ▲ ▲ │
│ 다른 프로세스 현재 프로세스 │
│ │
└─────────────────────────────────────────────────┘
2. clone()과 CLONE_NEW* 플래그
int pid = clone(child_func, child_stack,
CLONE_NEWUTS | CLONE_NEWPID | CLONE_NEWNS,
NULL);
// 자식 프로세스를 새 네임스페이스에서 생성
3. nsenter 명령어
# 기존 네임스페이스에 진입
nsenter -t <PID> -n -m -p
# 특정 네임스페이스에서 명령어 실행
nsenter -t <PID> -n ip addr
Ⅳ. 컨테이너 기술과의 관계
1. Docker의 네임스페이스 사용
Docker 컨테이너와 네임스페이스 매핑
┌──────────────────────────────────────────────────┐
│ │
│ Docker Container │
│ ┌────────────────────────────────────┐ │
│ │ CLONE_NEWPID → 독립 PID 공간 │ │
│ │ CLONE_NEWUTS → 독립 호스트네임 │ │
│ │ CLONE_NEWNET → 독립 네트워크 │ │
│ │ CLONE_NEWIPC → 독립 IPC │ │
│ │ CLONE_NEWUSER → UID/GID 매핑 │ │
│ │ CLONE_NEWNS → 독립 파일시스템 │ │
│ │ CLONE_NEWCGROUP→ 독립 cgroup 뷰 │ │
│ └────────────────────────────────────┘ │
│ + │
│ ┌────────────────────────────────────┐ │
│ │ cgroups → 자원 제한 (CPU, 메모리) │ │
│ │ seccomp → 시스템 콜 필터링 │ │
│ │ capabilities → 세분화된 권한 │ │
│ └────────────────────────────────────┘ │
│ = 완전한 컨테이너 격리 │
└──────────────────────────────────────────────────┘
2. 네임스페이스만으로는 불충분한 것
컨테이너 = 네임스페이스 + cgroups + 보안 기능
┌──────────────────┬────────────────────────────────┐
│ 기능 │ 역할 │
├──────────────────┼────────────────────────────────┤
│ 네임스페이스 │ 무엇을 "보이는가" (격리) │
│ cgroups │ 얼마나 "사용할 수 있는가" (제한)│
│ seccomp │ 무엇을 "할 수 있는가" (보안) │
│ capabilities │ 누가 "무엇을 할 수 있는가" │
│ AppArmor/SELinux │ 시스템 접근 제어 (MAC) │
└──────────────────┴────────────────────────────────┘
Ⅴ. 지식 그래프 및 요약
1. 지식 그래프
[네임스페이스 격리]
├── [종류 (7가지)]
│ ├── Mount ─────── CLONE_NEWNS ── 파일시스템 마운트
│ ├── UTS ───────── CLONE_NEWUTS ─ 호스트명, 도메인
│ ├── IPC ───────── CLONE_NEWIPC ─ 메시지 큐, 세마포어
│ ├── PID ───────── CLONE_NEWPID ─ 프로세스 ID 공간
│ ├── Network ───── CLONE_NEWNET ─ 네트워크 스택
│ ├── User ──────── CLONE_NEWUSER ─ UID/GID 매핑
│ └── Cgroup ────── CLONE_NEWCGROUP ─ cgroup 뷰
├── [생성 API]
│ ├── unshare() ──── 현재 프로세스를 새 네임스페이스로
│ ├── clone() ────── 자식을 새 네임스페이스에서 생성
│ └── setns() ────── 기존 네임스페이스에 진입
├── [관찰 도구]
│ ├── lsns ──────── 시스템 네임스페이스 목록
│ ├── nsenter ────── 네임스페이스 진입
│ └── /proc/[pid]/ns/ ── 네임스페이스 파일
└── [컨테이너 기술]
├── Docker ──────── 네임스페이스 + cgroups + seccomp
├── Kubernetes ──── 컨테이너 오케스트레이션
└── LXC ─────────── 리눅스 컨테이너 (경량 VM)
2. 준말
- IPC: Inter-Process Communication (프로세스 간 통신)
- UID: User ID (사용자 식별자)
- GID: Group ID (그룹 식별자)
- MAC: Mandatory Access Control (강제 접근 제어)
3. 어린이를 위한 3줄 설명
네임스페이스는 컴퓨터 안에 작은 컴퓨터 여러 개를 만들어주는 마법의 벽이에요. 각 컴퓨터는 자기만의 이름, 파일, 네트워크를 가지서 서로 간섭하지 않아요. 이게 바로 Docker 같은 컨테이너 기술의 핵심 원리예요.