네임스페이스 격리 프로세스 (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 같은 컨테이너 기술의 핵심 원리예요.