Kubernetes에서 StorageClass란?
Source: Dev.to
스토리지 흐름의 논리
Kubernetes에서 스토리지 체인은 다음과 같습니다:
Pod → PVC → StorageClass → PV → Physical Storage
Persistent Volume (PV)
PV는 클러스터 내 실제 디스크 자원을 나타냅니다. 이 자원은 다음 중 하나일 수 있습니다:
- 노드에 있는 로컬 디스크
- NFS 공유
- 클라우드 디스크
- 분산 스토리지
즉, PV는 스토리지 자체입니다.
Persistent Volume Claim (PVC)
PVC는 애플리케이션이 요구하는 디스크입니다. 예를 들어:
resources:
requests:
storage: 10Gi
accessModes:
- ReadWriteOnce
storageClassName: fast-storage
PVC는 디스크를 생성하지 않으며, 단지 디스크를 요청할 뿐입니다.
StorageClass란?
StorageClass는 PVC가 생성될 때 디스크가 어떻게 제공될지를 정의하는 정책 계층입니다. 예를 들어:
- 디스크가 로컬인지, NFS인지, 클라우드 블록 스토리지인지?
- 자동으로 생성될 것인지?
- 어떤 성능 클래스를 사용할 것인지?
Static vs Dynamic Provisioning
Static Provisioning
- PV를 수동으로 생성합니다.
- 먼저 스토리지 자원을 정의하고, 그 다음 PVC를 해당 PV에 연결합니다.
- 더 많은 제어권을 제공하지만, 새 디스크가 필요할 때마다 수동 작업이 필요합니다.
- 주로 테스트 환경이나 로컬/NFS 설정에서 사용됩니다.
Dynamic Provisioning
- PVC만 생성하면 됩니다.
- 연결된 StorageClass가 백그라운드에서 자동으로 적절한 PV를 생성하고 PVC에 연결합니다.
- 이 과정은 CSI(Container Storage Interface) 드라이버를 통해 이루어집니다.
- 프로덕션 환경에서 일반적으로 선호되며, 더 자동화되고 확장 가능합니다.
디스크는 실제로 어디에 있나요?
이 질문에 대한 답은 PV 정의에 있습니다.
Local PV
PV가 예를 들어 /mnt/k8s/data와 같은 경로를 가리킨다면, 디스크는 노드에 존재합니다. 노드가 장애가 나면 데이터가 손실될 수 있으며, 파드가 다른 노드로 이동하면 해당 디스크에 접근할 수 없습니다.
NFS
nfs:
server: 192.168.1.10
path: /srv/nfs/share
디스크는 NFS 서버에 있습니다. 파드가 어느 노드에 있든 동일한 데이터를 사용할 수 있습니다.
Cloud Storage
PV가 클라우드 볼륨에 연결되어 있으면, 디스크는 클라우드 제공자 측에 있습니다.
Access Modes
- ReadWriteOnce (RWO) – 하나의 노드만 쓸 수 있습니다.
- ReadWriteMany (RWX) – 여러 노드가 동시에 쓸 수 있습니다.
- ReadOnlyMany (ROX) – 여러 노드가 읽기만 할 수 있습니다.
Reclaim Policy
PVC가 삭제될 때 디스크가 어떻게 처리될지를 정의합니다. Kubernetes에는 세 가지 reclaim policy가 있습니다(하나는 더 이상 사용되지 않음):
- Retain – PVC가 삭제되어도 PV와 그 안의 데이터는 보존됩니다.
- Delete – PVC가 삭제되면 PV와 그 뒤에 있는 스토리지 자원도 삭제됩니다.
- Recycle (Deprecated) – PV 내부 데이터를 간단히 정리하고 재사용 가능하게 만들었습니다.
예시: MariaDB와 PostgreSQL 데이터는 어디에?
MariaDB
- 기본 데이터 디렉터리:
/var/lib/mysql - 영속성이 설정되지 않으면, 이 디렉터리는 컨테이너 파일시스템에 존재하며 파드가 삭제될 때 데이터가 사라집니다.
- 영속성이 활성화되면, 이 경로는
volumeMount를 통해 PVC에 연결됩니다:PVC → PV → Physical storage. 파드가 삭제돼도 데이터는 보존됩니다.
kubectl describe pod <pod-name>
위 명령으로 마운트된 경로들을 확인할 수 있습니다.
PostgreSQL
- 기본 데이터 디렉터리:
/var/lib/postgresql/data - 논리는 MariaDB와 동일합니다. 영속성이 없으면 데이터는 일시적이며, 영속성이 있으면 해당 디렉터리는 PVC에 마운트되고 실제 디스크는 PV에 존재합니다.
실제 디스크 위치는 어떻게 찾나요?
# PVC 확인
kubectl get pvc -n <namespace>
# 연결된 PV 확인
kubectl describe pvc <pvc-name>
# PV 상세 정보 확인
kubectl describe pv <pv-name>
이 명령들을 통해 PV가 로컬 경로인지, NFS 서버인지, 클라우드 볼륨인지, 혹은 분산 스토리지인지 확인할 수 있습니다. 실제 디스크 위치는 PV 정의에 명시됩니다.