사용자가 PersistentVolumeClaim(PVC)을 생성하면, Kubernetes는 해당 PVC가 참조하는 StorageClass를 확인함.(예를 들어, StorageClass가 ceph-rbd라면 Ceph RBD(Block Storage)를 사용하겠다는 의미)
kubernetes가 CSI에게 요청을 던지고 Ceph CSI의 Provisioner(Controller Plugin) 가 이 요청을 받아서 Ceph 클러스터에서 새로운 RBD 이미지나 CephFS 서브볼륨을 생성함.
이 과정에서 Ceph Monitors와 통신하여 필요한 메타데이터를 저장하고, RADOS Gateway(S3 API)를 이용하는 경우 오브젝트 스토리지도 설정됨.
생성된 볼륨은 Kubernetes가 PV를 생성하고 PVC에 연결함
→ Ceph에서 만들어진 볼륨을 Kubernetes에 PV(Persistent Volume)로 등록하고, 사용자의 PVC와 연결
Pod에서 자동으로 볼륨을 사용함
→ PVC가 Pod에 마운트되면, Ceph에서 제공하는 저장공간을 Pod가 사용할 수 있게 됨
필요할 때 자동으로 스토리지를 만들어 주는 기능
원래는 사람이 직접 Ceph에서 볼륨을 만들고, Kubernetes에 등록해야 하는데, 이걸 자동으로 해주는 게 동적 볼륨 프로비저닝(Dynamic Volume Provisioning)
Kubernetes에서 Pod가 실행되려면 저장공간(Persistent Volume, PV)이 필요함
예전에는 운영자가 미리 PV를 만들어 두고, Pod가 이걸 가져다 쓰도록 했음. (이걸 정적 프로비저닝(Static Provisioning) 이라고 해.)
하지만 이렇게 하면 필요할 때 즉시 만들 수 없고, 미리 만들어 놓은 PV가 부족하면 새로 추가하는 게 번거로워.
그래서 Kubernetes가 필요한 만큼 자동으로 Ceph에서 볼륨을 만들어 주도록 한 게 동적 프로비저닝.
Kubelet은 컨테이너 런타임(containerd, CRI-O)과 협력하여 Pod 내부에서 해당 볼륨을 마운트할 위치를 설정함.
Ceph CSI Node Plugin이 mount 명령을 사용하여 컨테이너의 파일시스템에 볼륨을 연결함.
이때, RBD 볼륨은 ext4 또는 xfs와 같은 파일시스템을 사용할 수 있고, CephFS는 공유 파일시스템으로 마운트됨.
4️⃣ 볼륨 사용 (I/O 요청 처리)
Pod가 실행 중이면, 애플리케이션이 볼륨을 통해 Ceph 클러스터에 데이터를 저장하고 읽음.
RBD의 경우 블록 레벨에서 I/O 요청이 이루어지며, Ceph OSD로 전송됨.
CephFS의 경우 POSIX 기반의 파일 읽기/쓰기가 Ceph Metadata Server(MDS)와 OSD를 거쳐 처리됨.
5️⃣ 볼륨 해제 (Unmount & Detach)
Pod가 종료되거나 이동할 경우, Kubelet은 Ceph CSI에게 볼륨을 언마운트하도록 요청함.
Ceph CSI Node Plugin은 umount를 실행하여 컨테이너에서 볼륨을 제거함.
RBD의 경우 rbd unmap 명령을 사용하여 블록 디바이스를 해제함.
CephFS의 경우 단순히 umount 명령으로 해제됨.
만약 PVC가 삭제되면, Ceph CSI Provisioner가 PV를 제거하고, Ceph 내부에서도 해당 볼륨(RBD 이미지 또는 CephFS 서브볼륨)이 삭제됨.
(base) j_s24z ~/rook-ceph kubectl logs -n rook-ceph csi-cephfsplugin-r4nnm
Defaulted container "driver-registrar" out of: driver-registrar, csi-cephfsplugin
I0309 07:36:57.873133 1 main.go:150] "Version" version="v2.13.0"
I0309 07:36:57.873249 1 main.go:151] "Running node-driver-registrar" mode=""
I0309 07:37:07.880767 1 connection.go:253] "Still connecting" address="unix:///csi/csi.sock"
I0309 07:37:17.876537 1 connection.go:253] "Still connecting" address="unix:///csi/csi.sock"
I0309 07:37:27.876601 1 connection.go:253] "Still connecting" address="unix:///csi/csi.sock"
E0309 07:37:27.876665 1 main.go:176] "Error connecting to CSI driver" err="context deadline exceeded"
(base) j_s24z ~/rook-ceph kubectl logs -n rook-ceph csi-rbdplugin-zvhqt
Defaulted container "driver-registrar" out of: driver-registrar, csi-rbdplugin
I0309 07:42:20.828902 62817 main.go:150] "Version" version="v2.13.0"
I0309 07:42:20.829159 62817 main.go:151] "Running node-driver-registrar" mode=""
I0309 07:42:30.829395 62817 connection.go:253] "Still connecting" address="unix:///csi/csi.sock"
csi-plugin이 csi socket에 연결하지 못하고 있어서 Kubernetes가 CSI 드라이버를 정상적으로 실행하지 못하고 있
이 문제는 CSI 드라이버와 Kubelet의 통신 문제 때문에 발생하는 경우가 많아.