핵심 인사이트 (3줄 요약)
- 본질: CSI (Container Storage Interface)는 K8s 본체 소스코드에 하드코딩되어 있던 스토리지 연동 로직을 외부로 분리한 독립적인 표준 인터페이스 규약이다.
- 가치: 벤더 종속성을 끊어내어 스토리지 제조사는 독자적으로 드라이버를 배포할 수 있고, 사용자는 클러스터 재시작 없이 새로운 스토리지를 즉시 연결할 수 있다.
- 판단 포인트: K8s 클러스터의 안정성과 확장성을 위해 기존 In-Tree 볼륨을 CSI로 마이그레이션해야 하며, 스냅샷이나 복제 같은 고급 기능 필요 시 CSI 지원 여부를 우선 확인해야 한다.
Ⅰ. 개요 및 필요성
초창기 쿠버네티스(K8s)는 AWS EBS나 GCP Persistent Disk 같은 주요 스토리지 연동 코드를 K8s 코어 바이너리(In-Tree)에 포함하여 배포했다. 이 방식은 스토리지 드라이버에 버그가 생기면 K8s 마스터 노드 전체가 다운될 수 있는 심각한 결함을 가졌다. 또한, 새로운 스토리지 연동 코드를 추가하려면 K8s 메이저 버전 릴리즈 일정(수개월)을 기다려야만 했다. 이러한 K8s 뱃속의 비대화와 배포 병목 현상을 해결하기 위해, 스토리지 제어 로직을 K8s 본체에서 완전히 분리하는 CSI 규격이 등장하게 되었다.
- 📢 섹션 요약 비유: 스마트폰 메인보드에 이어폰을 아예 납땜해서 팔다가(In-Tree), 고장이 잦아지자 누구나 꽂을 수 있는 공용 이어폰 잭(CSI)을 만들어 메인보드 밖으로 빼버린 것과 같다.
Ⅱ. 아키텍처 및 핵심 원리
CSI 아키텍처는 클러스터 외부의 스토리지 API와 통신하는 CSI Controller와, 실제 파드가 실행되는 물리 노드에서 볼륨을 마운트하는 CSI Node로 역할을 분담한다. K8s는 스토리지 생성, 삭제, 연결 등의 명령을 CSI 표준 RPC(Remote Procedure Call) 규격에 맞춰 호출할 뿐, 실제 하드웨어 제어는 CSI 드라이버가 전담한다.
┌─────────────────────────────────────────────────────────────┐
│ CSI (Container Storage Interface) 구조 │
├─────────────────────────────────────────────────────────────┤
│ [K8s Control Plane] [External Storage] │
│ │ ▲ │
│ ▼ (1) CreateVolume RPC │ (2) API │
│ ┌──────────────────────┐ │ Call │
│ │ CSI Controller │──────────────────────┘ │
│ │ (StatefulSet/Deploy) │ │
│ └──────────────────────┘ │
│ │ │
│ ▼ (3) NodePublishVolume RPC (Mount) │
│ ┌──────────────────────┐ (4) /dev/sdb │
│ │ CSI Node │ ◀──────── 물리 디스크 부착 │
│ │ (DaemonSet) │ │
│ └──────────────────────┘ │
└─────────────────────────────────────────────────────────────┘
이 다이어그램은 K8s가 통제실(Controller)과 현장(Node)을 분리하여 외부 스토리지를 프로비저닝하고 마운트하는 흐름을 보여준다. CSI Controller는 클라우드 API를 호출해 가상 디스크를 만들고, CSI Node 데몬은 해당 노드에 리눅스 마운트 명령을 내려 파드가 디스크를 사용할 수 있게 한다.
- 📢 섹션 요약 비유: 통제실(Controller)이 무전기로 "디스크 하나 만들어!"라고 지시하면, 현장 작업반장(Node)이 서버에 직접 디스크를 나사로 조립(마운트)하는 2인 1조 시스템이다.
Ⅲ. 비교 및 연결
In-Tree 방식과 Out-of-Tree(CSI) 방식은 시스템의 결합도와 확장성에서 극명한 차이를 보인다. In-Tree는 초기 구현이 쉬웠으나 코드 베이스가 무거워졌고, CSI는 설정이 약간 복잡해진 대신 완벽한 결합 분리(Decoupling)를 이루어냈다.
| 비교 항목 | In-Tree 스토리지 플러그인 | Out-of-Tree (CSI) 플러그인 |
|---|---|---|
| 코드 위치 | K8s 코어 소스코드 내부 | K8s 외부 (독립된 컨테이너) |
| 배포 주기 | K8s 릴리즈 주기에 종속됨 | 스토리지 벤더가 독립적으로 릴리즈 |
| 안정성 | 드라이버 버그 시 K8s 컴포넌트 전체 위험 | 버그 발생 시 해당 CSI 파드만 재시작 |
| 확장 기능 | 기본 볼륨 마운트 위주 | 스냅샷, 클로닝, 리사이징 등 동적 확장 가능 |
CSI는 CNI(Container Network Interface)와 함께 K8s를 가볍게 유지하면서도 생태계를 무한히 넓혀주는 핵심 인터페이스 쌍으로 연결된다.
- 📢 섹션 요약 비유: In-Tree가 TV 안에 비디오 플레이어가 내장된 일체형 콤보라면, CSI는 HDMI 포트만 남겨두고 DVD든 블루레이든 마음대로 연결하게 만든 최신 TV다.
Ⅳ. 실무 적용 및 기술사 판단
실무 환경에서는 K8s 버전을 업그레이드할 때 기존 In-Tree 볼륨을 CSI로 원활하게 마이그레이션(CSIMigration 기능 활성화)하는 것이 중요한 설계 포인트다. 특히 운영 환경에서 볼륨의 동적 확장(Volume Expansion)이나 백업을 위한 스냅샷 기능이 필요하다면, 도입하려는 스토리지의 CSI 드라이버가 해당 기능을 공식 지원하는지 반드시 사전에 검증해야 한다.
체크리스트
- 스토리지 벤더가 제공하는 CSI 드라이버의 K8s 버전 호환성이 확인되었는가?
- 기존 In-Tree 방식의 PV(Persistent Volume)를 CSI 방식으로 마이그레이션할 계획이 수립되었는가?
- 스토리지 권한 관리를 위해 CSI Controller 파드에 최소한의 IAM 권한만 부여했는가?
- 📢 섹션 요약 비유: 집에 새로운 전자제품을 들일 때 플러그 모양(호환성)과 두꺼비집 용량(권한)을 미리 확인해야 불이 나지 않는 것과 같다.
Ⅴ. 기대효과 및 결론
CSI의 도입으로 K8s는 스토리지 관리의 무거운 짐을 벗어던지고 핵심 오케스트레이션 기능에 집중할 수 있게 되었다. 벤더들은 혁신적인 스토리지 기능을 빠르게 K8s 생태계에 공급할 수 있게 되어, 데이터옵스(DataOps)와 스테이트풀(Stateful) 애플리케이션의 클라우드 네이티브 전환이 가속화되었다. 결론적으로 CSI는 단순한 플러그인을 넘어, K8s를 거대한 범용 플랫폼으로 유지시켜 주는 생명선이다.
- 📢 섹션 요약 비유: 전 세계 규격이 통일된 USB 포트 덕분에 컴퓨터 산업이 폭발적으로 성장했듯, CSI는 클라우드 세계의 완벽한 USB 포트다.
📌 관련 개념 맵
| 개념 | 연결 포인트 |
|---|---|
| PV / PVC (Persistent Volume Claim) | 개발자가 CSI 드라이버에게 스토리지 할당을 요청하는 표준 인터페이스 |
| StorageClass | 어떤 CSI 드라이버를 통해 어떤 성능의 디스크를 만들지 정의하는 템플릿 |
| CNI (Container Network Interface) | CSI와 궤를 같이하는 K8s의 네트워크 플러그인 표준 규격 |
| DaemonSet | 모든 노드에 CSI Node 플러그인을 띄우기 위해 사용하는 K8s 워크로드 |
📈 관련 키워드 및 발전 흐름도
K8s 코어 비대화 및 병목 발생 (In-Tree)
│
▼
Out-of-Tree 아키텍처 전환 요구
│
▼
CSI (Container Storage Interface) 표준 제정
│
▼
CSI Controller (프로비저닝) · CSI Node (마운트) 분업화
│
▼
Volume Snapshot · Volume Cloning · 동적 확장 지원 (미래 확장)
이 흐름도는 스토리지 코드가 K8s 내부에서 분리되어 표준화되고, 점차 고급 기능으로 확장되는 과정을 보여준다.
👶 어린이를 위한 3줄 비유 설명
- 예전에는 레고 장난감을 살 때 사람 인형과 자동차가 아예 본드로 붙어서 나왔어요.
- 하지만 CSI라는 규칙이 생기고 나서부터는 자동차와 사람을 뗐다 붙였다 할 수 있는 구멍(블록)이 생겼어요.
- 이제는 자동차가 부서져도 사람 인형은 그대로 두고 다른 자동차로 쏙 바꿔 타면 된답니다!