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의 핵심 기능

  1. 프로비저너 정의: provisioner 필드를 통해 CSI 드라이버 지정(nfs.csi.k8s.io)
  2. 정책 관리:
    • reclaimPolicy: PV 삭제 시 처리 방식(Delete/Retain)
    • volumeBindingMode: PVC-PV 바인딩 시점 제어(Immediate/WaitForFirstConsumer)
  3. 파라미터 전달:
    parameters:
      server: 192.168.60.162  # NFS 서버 IP
      share: /data/data_nfs   # 공유 디렉토리 경로
  4. 마운트 옵션:
    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