Infra/Kubernetes
StorageClass
TrendPilot
2025. 3. 26. 16:00
쿠버네티스 환경에서 스토리지 클래스(StorageClass)는 동적 프로비저닝의 핵심 메커니즘으로, PersistentVolume(PV)의 생성 방식을 추상화합니다.
PV 프로비저닝 방식 비교
1. 정적 프로비저닝
직접 pv 를 정의하고 mount 해야한다.
- 수동 PV 생성: 관리자가 직접 PV를 정의하고 NFS 서버 경로 등 세부정보를 지정
- PVC와 PV 바인딩: 사용자가 PVC 생성 시 storageClassName을 생략하거나 "" 지정
- 사용 사례: 고정된 스토리지 인프라가 이미 구성된 환경에 적합
# 정적 PV 예시 (수동 생성 필요)
apiVersion: v1
kind: PersistentVolume
metadata:
name: pv-nfs-static
spec:
capacity:
storage: 10Gi
accessModes:
- ReadWriteMany
nfs:
server: 192.168.60.162
path: /data/data_nfs
2. 동적 프로비저닝
따로 생성해주지 않아도 먼저 할당한 디스크에서 필요한 만큼 volume 이 잡힌다.
- 자동 PV 생성: StorageClass가 PVC 요청 시 자동으로 PV 생성
- 템플릿 기반: 스토리지 클래스에 정의된 파라미터(server, share 경로 등)를 기반으로 PV 구성
- 사용 사례: 클라우드 환경이나 스토리지 풀 관리가 필요한 경우
# 동적 프로비저닝용 StorageClass 예시
apiVersion: storage.k8s.io/v1
kind: StorageClass
metadata:
name: nfs-csi
annotations:
storageclass.kubernetes.io/is-default-class: "true"
provisioner: nfs.csi.k8s.io # CSI 드라이버 지정
parameters:
server: 192.168.60.162
share: /data/data_nfs
mountOptions:
- hard
- nfsvers=4.1
reclaimPolicy: Retain # PV 삭제 정책
volumeBindingMode: Immediate
StorageClass의 핵심 기능
- 프로비저너 정의: provisioner 필드를 통해 CSI 드라이버 지정(nfs.csi.k8s.io)
- 정책 관리:
- reclaimPolicy: PV 삭제 시 처리 방식(Delete/Retain)
- volumeBindingMode: PVC-PV 바인딩 시점 제어(Immediate/WaitForFirstConsumer)
- 파라미터 전달:
parameters: server: 192.168.60.162 # NFS 서버 IP share: /data/data_nfs # 공유 디렉토리 경로
- 마운트 옵션:
mountOptions: # NFS 클라이언트 설정 - hard - nfsvers=4.1
설치
1. 설치를 위해 NFS 서버를 설치합니다.
Private Registry 노드에서 실행
sudo apt-get install nfs-kernel-server
sudo mkdir -p /data/data_nfs
sudo chmod 777 /data/data_nfs
echo "/data/data_nfs *(rw,sync,no_subtree_check)" | sudo tee -a /etc/exports
sudo exportfs -a
sudo systemctl restart nfs-kernel-server
2. NFS 클라이언트 설치
master, worker 노드에서 실행
sudo apt-get install nfs-common -y
2-1. NFS 접근 테스트
mkdir -p /mnt/test-nfs
sudo mount -t nfs 192.168.60.162:/data/data_nfs /mnt/test-nfs
umount /mnt/test-nfs
3. NFS CSI 드라이버 설치
master 노드에서 진행
# csi 드라이버 배포
helm repo add csi-driver-nfs https://raw.githubusercontent.com/kubernetes-csi/csi-driver-nfs/master/charts
helm install csi-driver-nfs csi-driver-nfs/csi-driver-nfs --namespace kube-system --version v4.5.0
# 설치 확인
kubectl get pods -n kube-system -l app.kubernetes.io/name=csi-driver-nfs
4. sc 배포
master node 에서 진행
# vim nfs-sc.yaml
apiVersion: storage.k8s.io/v1
kind: StorageClass
metadata:
name: nfs-csi
annotations:
storageclass.kubernetes.io/is-default-class: "true"
provisioner: nfs.csi.k8s.io
parameters:
server: 192.168.60.162 # 실제 서버 IP 확인
share: /data/data_nfs
mountOptions:
- hard
- nfsvers=4.1
reclaimPolicy: Retain
volumeBindingMode: Immediate
5. 배포
kubectl apply -f nfs-sc.yaml
6. 확인
kubectl get storageclass
StorageClass를 통해 개발자는 인프라 세부정보를 알 필요 없이 스토리지 요청을 할 수 있으며, 클러스터 관리자는 표준화된 스토리지 정책을 적용할 수 있습니다.
특히 NFS CSI 드라이버를 사용하면 기존 NFS 인프라를 쿠버네티스 스토리지 시스템에 자연스럽게 통합할 수 있습니다.
동적 프로비저닝은 DevOps 워크플로우에 최적화되어 있으며, 클라우드 네이티브 환경에서 필수적인 요소로 자리잡았습니다.
감사합니다.
참고 문서
https://kubernetes.io/docs/concepts/storage/storage-classes/
Storage Classes
This document describes the concept of a StorageClass in Kubernetes. Familiarity with volumes and persistent volumes is suggested. A StorageClass provides a way for administrators to describe the classes of storage they offer. Different classes might map t
kubernetes.io