99. CSI (Container Storage Interface) - 스토리지 범용 확장 연동 표준

⚠️ 이 문서는 쿠버네티스(K8s)가 초창기에 AWS(EBS)나 GCP 같은 소수의 유명한 클라우드 스토리지 연동 코드(볼륨 마운트 로직)만 자기 뱃속(K8s 소스코드 자체)에 욱여넣고 있다가 몸집이 너무 비대해져서 폭발할 위기에 처하자, **"이제 스토리지 회사가 100개든 1,000개든 우리 본체 코드는 건드리지 말고, 스토리지 회사들이 직접 표준 플러그인(드라이버)을 깎아 와서 쿠버네티스 옆구리(CSI 표준 규격)에 USB처럼 꽂아라!"라고 선언하며 스토리지 생태계를 무한 확장(Extensibility)시켜 버린 독립 아키텍처 'CSI(컨테이너 스토리지 인터페이스)'**를 다룹니다.

핵심 인사이트 (3줄 요약)

  1. 본질: 쿠버네티스 본체 소스코드(In-Tree)에서 잡다한 벤더별 스토리지 연동 코드를 통째로 뜯어내어 외부(Out-of-Tree)로 분리시킨 혁명적인 **소프트웨어 인터페이스 규약(표준 플러그인 잭)**이다.
  2. 가치: 스토리지 회사(Dell, NetApp, 네이버 클라우드)는 쿠버네티스가 새 버전(v1.30)으로 업데이트될 때까지 6개월을 기다릴 필요 없이, 자기들만의 CSI 드라이버만 파이프라인으로 따로 배포하면 전 세계 수만 개의 K8s 클러스터에 1초 만에 자사 스토리지를 연동(Mount)시켜 팔아먹을 수 있게 되었다.
  3. 기술 체계: 클러스터 바깥의 외부 스토리지 API를 찌르는 CSI Controller와, 실제 파드가 떠 있는 노드(서버) 바닥에서 리눅스 명령어를 쳐서 디스크를 찰칵! 하고 물리적으로 붙여주는 CSI Node 데몬셋의 환상적인 분업 구조로 작동한다.

Ⅰ. In-Tree의 저주: 뚱뚱해진 쿠버네티스의 붕괴

남의 회사 코드를 내 뱃속에 품는 것은 유지보수의 지옥이다.

  1. 초창기 K8s 볼륨 연동 (In-Tree 방식):
    • 옛날 K8s v1.10 시절, 파드에 AWS EBS(가상 하드디스크)를 붙이려면 어떻게 했을까?
    • 쿠버네티스 코어 개발자들이 아예 AWS API를 호출하는 1만 줄짜리 자바/고(Go) 언어 소스코드를 K8s 본체(바이너리) 속에 하드코딩해서 심어두었다.
  2. 벤더 종속과 배포의 끔찍한 병목:
    • 넷앱(NetApp)이라는 스토리지 회사가 "우리 하드디스크도 K8s에서 쓰게 연동 코드 좀 넣어줘!"라고 코드를 짜서 제출했다.
    • K8s 본체에 코드를 병합(Merge)하려면 구글 코어 개발자들의 깐깐한 심사를 거쳐야 하고, K8s 메이저 버전이 3달 뒤에 새로 출시될 때까지 전 세계 고객은 그 넷앱 디스크를 쓸 수가 없었다.
    • 더 무서운 건 넷앱이 짠 코드가 버그를 뿜으면, K8s 심장(Master Node) 전체가 같이 뻗어버리는 대참사(보안 및 안정성 결함)가 발생했다.

📢 섹션 요약 비유: 초창기 아이폰(쿠버네티스)은 이어폰, 충전기, 스피커(스토리지)를 만들 때 애플 본사가 직접 아이폰 내부 메인보드(In-Tree)에 납땜해서 일체형으로 팔았습니다. 삼성이나 소니 스피커 회사가 자기 제품을 연결하게 해달라고 사정사정해도, 애플이 1년에 한 번 아이폰 신제품을 발표할 때까지 기다려야 했고, 스피커가 고장 나면 아이폰 메인보드 전체가 타버리는 멍청한 독재 구조였습니다.


Ⅱ. CSI(Container Storage Interface)의 선언: USB 포트의 탄생

"내 몸통에 손대지 마. USB 규격만 줄 테니 너희가 케이블 깎아와라!"

  1. Out-of-Tree 플러그인 아키텍처 (독립 선언):
    • K8s 개발진은 K8s 뱃속에 있던 AWS, GCP 스토리지 연동 코드를 전기톱으로 다 썰어내어 밖으로 던져버렸다(Out-of-Tree 전환).
    • 대신 "앞으로 스토리지 연결은 무조건 **Volume Create, Volume Delete, Volume Attach**라는 3개의 버튼(표준 인터페이스 규약, CSI)으로만 소통한다!"라고 C타입 USB 규격 같은 만국 공통 표준을 전 세계에 배포했다.
  2. 스토리지 벤더의 환호 (독립적 라이프사이클):
    • 스토리지 회사(Dell, 퓨어스토리지 등)는 환호했다.
    • 그들은 이제 K8s 본체의 눈치를 보지 않고, 저 3개 버튼 규격에 딱 맞는 **'CSI 드라이버 컨테이너(플러그인)'**만 자신들 마음대로 개발해서 깃허브에 올리면 끝이다.
    • 어제 배운 '동적 프로비저닝(StorageClass)'을 돌릴 때, K8s는 그저 이 외부 CSI 드라이버 컨테이너의 버튼을 '띡' 누르기만 하면, 벤더 드라이버가 알아서 자기네 회사 스토리지 API를 찔러 허공에서 10GB짜리 쇳덩어리(PV)를 뚝딱 만들어 바치게 되었다.

📢 섹션 요약 비유: K8s가 "C-Type USB(CSI) 구멍만 뚫어놓을 테니, 삼성 스피커든 LG 모니터든 너희들이 잭을 깎아와서 꽂아라!"라고 선언한 위대한 표준화 혁명입니다. 이제 스피커(스토리지 벤더) 회사는 자기 맘대로 신제품 드라이버를 찍어내어 팔 수 있고, 스피커가 폭발(버그)해도 아이폰(K8s 본체)은 USB 잭만 뽑아버리면 그만이라 아무런 타격을 받지 않는 완벽한 방화벽(안정성)이 세워졌습니다.


Ⅲ. CSI의 내부 작동 원리 (Controller와 Node 데몬셋)

그냥 잭만 꽂는다고 돌아가지 않는다. 대장 로봇과 노가다 로봇의 2인 1조다.

  1. CSI Controller (중앙 통제실의 API 찌르기):
    • 개발자가 "10GB 디스크 줘(PVC)!"라고 요청하면, 마스터 노드(Control Plane) 옆에 떠 있는 대장 로봇인 **CSI Controller**가 튀어나온다.
    • 얘는 리눅스 디스크를 만지지 않는다. 그냥 AWS 본사(클라우드 API)에 HTTP 네트워크 요청을 쏴서 "강남 센터에 10GB짜리 EBS(가상 디스크) 하나 만들어라"라고 지시만 내리는 화이트칼라다.
  2. CSI Node DaemonSet (현장 노가다 배관공):
    • AWS에서 10GB 디스크가 생성되면, 이제 그 디스크를 파드가 뜰 '1번 노드(물리 서버)'의 배꼽에 찰칵! 하고 진짜 리눅스 명령어를 쳐서 마운트(Mount) 시켜줘야 한다.
    • 이 위험한 노가다는 마스터 노드가 하지 않는다. 1번 노드 밑바닥에 숨어서 24시간 돌고 있는 배관공 로봇인 **CSI Node 플러그인(DaemonSet)**이 담당한다.
    • 1번 노드 배관공이 리눅스의 묵직한 마운트 명령(mount /dev/xvda /var/lib/kubelet...)을 쳐서 철제 디스크를 1번 서버 뱃속에 물리적으로 꽂아버려야만 파드가 데이터를 쓸 수 있는 궁극의 합체가 완료된다.

📢 섹션 요약 비유: 배달 음식을 시킬 때, 개발자(고객)가 10GB 피자(PVC)를 시킵니다. 배달 앱 서버(CSI Controller)는 피자 가게(AWS)에 전산(API)으로 "10GB 피자 하나 굽어라!"라고 오더만 내립니다(손에 피자를 안 묻힘). 피자가 구워져서 101호 건물(1번 노드) 앞에 도착하면, 건물 1층에 24시간 대기하고 있는 경비 아저씨(CSI Node 데몬셋)가 뛰어나가 그 피자를 직접 손으로 들고 엘리베이터를 타서 파드(고객)의 방 식탁(리눅스 마운트) 위에 완벽하게 세팅해 주는 철저한 2인 1조 분업 배달 시스템입니다.