CSI
개요
컨테이너 스토리지 인터페이스
Container Storage Interface (CSI) is a standardized mechanism for Container Orchestration Systems (COs), including Kubernetes, to expose arbitrary storage systems to containerized workloads.
위와 같이 FAQ에 정의돼 있다.
직역하자면 쿠버네티스를 포함한 컨테이너 오케스트레이션 시스템에서 워크로드에 임의의 스토리지를 노출하기 위한 표준화된 매커니즘.
복잡해 보이지만 결국 쿠버네티스에 내장되지 않은 스토리지를 쿠버네티스에서 사용하고자 할 때 세팅할 수 있는 통일화된 인터페이스를 제공한다는 것이다.
CNI, CRI와 마찬가지로 말이다.
이렇게 세팅된 볼륨은 외장(out-of-tree) 볼륨이라고 부른다.
필요성
기본적으로 CSI의 필요성은 스토리지의 필요성과 같다.
컨테이너는 가축으로 간주된다.
즉, 언제든 종료될 수 있다.
그래서 관리자는 컨테이너로부터 생명 주기를 달리하는 스토리지를 제공하고 싶은 것인데, 이때 쿠버네티스에서 내장되어 제공하는 볼륨 타입만으로는 모든 환경의 요구사항을 충족시킬 수 없다.
그래서 내장되지 않은 채 자체적으로 원하는 스토리지를 연결할 수 있게끔 인터페이스를 제공해주는 것이다.
과거에는
쿠버네티스에서는 사실 내장 드라이버로 다양한 스토리지 플러그인을 지원했다.
그래서 클라우드 사마다 각자의 리소스가 기본 쿠버네티스에 내장되어 있는 형태였다.
오픈소스니까 각자 알아서 만들어댄 것이다.
이 방식은 각 스토리지 사용에 있어서 벤더 종속적이라 혼란을 야기했고, 이에 따라 쿠버네티스 측에서는 내장되었던 모든 플러그인을 빼낸 후, 이 인터페이스에 맞춰서 개발하도록 유도하기 시작했다.
이게 1.25버전 당시의 마이그레이션 플랜이었다.
Kubernetes v1.31 - Elli 기준으로 공식 문서를 보면, 스토리지 부분에 죄다 deprecated가 된 것을 확인할 수 있다.
아무튼 쿠버네티스에서 사용될 수 있는 스토리지들은 기본적으로 이 인터페이스 규격을 준수하도록 설계되고 있는 실정이다.
만약 본인이 이미 사용하고 있는 스토리지가 있으나 쿠버네티스에서 지원하지 않는다면, 이 인터페이스에 맞춰서 어댑터 로직을 만들면 된다.
사용 방법
그래서 이걸로 어떻게 외부 스토리지를 이용할 수 있는가?
관리자 세팅 방법
저마다 조금씩의 차이는 있을 수 있으나, 기본적으로는 다음의 순서를 따르면 된다.
대부분의 CSI들은 간단하게 양식 파일을 작동시키는 것으로 드라이버 설치가 가능하도록 지원해준다.
그래서 막상 해보면 세부 설정을 해야할 때나 까다롭지 꽤나 단순하다.
CSI는 쿠버네티스 버전이 올라가면서 계속 발전되고 있다.
그래서 이전에 만들어진 CSI 드라이버가 특정 기능을 지원하지 않는다던가 하는 세팅 이슈가 있을 수 있으니 정확하게 파악해야 한다.
개발자 사용 방법
CSI는 다음의 방법으로 사용될 수 있다.
- PVC
- 문서를 보면 알겠지만, 일반 임시 볼륨(generic ephemeral volume)으로도 사용할 수 있다.
- csi 임시 볼륨
- 파드 스펙에
.spec.volumes[*].csi
라는 식으로 명시해서 사용한다. - 이걸 지원하는 드라이버가 많지 않으니 참고해야 한다.
- 파드 스펙에
양식 작성법
관리자의 관점에서, pv나 스토리지클래스에 작성할 수 있는 필드를 간략하게 보고자 한다.
어차피 이렇게 보더라도, 사실 그냥 해당 드라이버에 나온 문서를 보는 게 훨씬 효율적이고 좋다.
- driver
- 볼륨 드라이버의 이름으로, csi 스펙의
GetPluginInfoResponse
와 일치해야 한다. - 이걸 통해 어떤 pv가 어떤 드라이버에 속하는지 식별한다.
- 볼륨 드라이버의 이름으로, csi 스펙의
- volumeHandle
- 볼륨을 고유하게 식별하는 문자열.
- csi 스펙의
CreateVolumeResponse
의volume.id
와 맞닿는 부분.
- readOnly
- 기본은 비활성화인 선택 필드.
ControllerPublishVolumeRequest
에서 전달된다.
- fstype
- 볼륨에서 명시적으로 파일 타입을 지정 안하면 사용되는 값.
VolumeCapability
field ofControllerPublishVolumeRequest
,NodeStageVolumeRequest
, andNodePublishVolumeRequest
로부터 온다.
- volumeAttributes
- 볼륨의 정적 속성을 매핑하는 값.
volume.attributes
field of theCreateVolumeResponse
에서 매핑된다.volume_context
field in theControllerPublishVolumeRequest
,NodeStageVolumeRequest
, andNodePublishVolumeRequest
로 연결된다.
- controllerPublishSecretRef
ControllerPublishVolume
andControllerUnpublishVolume
호출을 완성하기 위해 사용되는 시크릿 오브젝트- 시크릿이 필요없다면 사용되지 않는으며, 여기의 모든 시크릿은 허용된다.
- nodeExpandSecretRef
NodeExpandVolum
호출을 완성하기 위한 시크릿 정보.- 이것도 필요에 따라 사용된다.
CSINodeExpandSecret
피처 게이트를 api서버와 kubelet에 사용할 수 있다.- 1.27부터 기본으로 설정됐다.
- nodePublishSecretRef
- 이것도 아무튼..
- nodeStageSecretRef
- 이것도 아무튼..
raw 블록 볼륨을 지원하기도 한다.
바로 파드 스펙에 csi 를 설정할 수도 있는데, 이런 놈은 임시 볼륨이 된다.
참고
- 공식
- https://kubernetes.io/docs/concepts/storage/storage-classes
- https://kubernetes.io/blog/2019/01/15/container-storage-interface-ga/
- https://github.com/kubernetes/community/blob/master/sig-storage/volume-plugin-faq.md
- https://kubernetes.io/blog/2022/09/26/storage-in-tree-to-csi-migration-status-update-1.25/
- https://kubernetes.io/blog/2024/07/19/kubernetes-1-31-upcoming-changes/
- 1.31에서는 전부 없어졌다고 자랑한다.
- https://aws.amazon.com/ko/compare/the-difference-between-block-file-object-storage/
- https://serverfault.com/questions/1159882/why-the-nfs-csi-driver-is-recommended-over-the-nfs-in-tree-driver