Storage Class

Storage Class란?

PV를 자동으로 프로비저닝해주는 쿠버네티스 리소스다.

PV와 PVC만 쓸 때는 관리자가 PV를 미리 수동으로 만들어둬야 한다. 하지만 Storage Class를 사용하면 PVC를 생성하는 순간 조건에 맞는 PV가 자동으로 만들어진다. 이를 Dynamic Provisioning(동적 프로비저닝) 이라고 한다.

PVC 생성
  ↓
Storage Class가 감지
  ↓
PV 자동 생성 (EBS 볼륨 등 실제 스토리지 함께 생성)
  ↓
PVC ↔ PV 자동 바인딩
  ↓
파드에서 사용

PV/PVC와의 관계 정리

방식PV 생성특징
Static Provisioning관리자가 수동으로 미리 생성PVC가 조건에 맞는 기존 PV에 바인딩
Dynamic ProvisioningStorage Class가 자동 생성PVC 생성 시 PV와 실제 스토리지가 함께 생성됨

PVC에 storageClassName을 명시하면 해당 Storage Class를 통해 동적 프로비저닝이 이루어진다.


Storage Class 구성 요소

apiVersion: storage.k8s.io/v1
kind: StorageClass
metadata:
  name: gp3
provisioner: ebs.csi.aws.com      # 어떤 스토리지 드라이버를 쓸지
parameters:
  type: gp3                        # 프로비저너에게 전달할 파라미터
  fsType: ext4
volumeBindingMode: WaitForFirstConsumer  # 바인딩 시점
reclaimPolicy: Delete              # PVC 삭제 시 PV 처리 방법

provisioner

실제 스토리지를 생성하는 드라이버. AWS에서는 보통 아래 중 하나를 쓴다.

provisioner설명
ebs.csi.aws.comAWS EBS CSI 드라이버 (권장)
kubernetes.io/aws-ebs구버전 in-tree EBS 드라이버 (deprecated)
efs.csi.aws.comAWS EFS CSI 드라이버

reclaimPolicy

PVC가 삭제됐을 때 PV(와 실제 스토리지)를 어떻게 처리할지 결정한다.

동작
DeletePV와 실제 스토리지(EBS 볼륨 등)도 함께 삭제
RetainPV는 Released 상태로 남고 실제 스토리지도 유지. 수동으로 정리해야 함

운영 환경에서는 실수로 데이터를 날리지 않도록 Retain을 쓰는 경우가 많다.

volumeBindingMode

PV 바인딩(및 프로비저닝)을 언제 할지 결정한다.

동작
ImmediatePVC 생성 즉시 PV 생성 및 바인딩
WaitForFirstConsumer파드가 실제로 PVC를 사용하려 할 때까지 대기

WaitForFirstConsumer를 권장하는 이유: EBS는 특정 AZ에 종속된다. Immediate로 설정하면 파드가 뜨기 전에 PV(EBS)가 먼저 만들어지는데, 파드가 다른 AZ에 스케줄링되면 볼륨을 마운트할 수 없다. WaitForFirstConsumer를 쓰면 파드가 어느 노드에 스케줄링될지 확인한 뒤 같은 AZ에 EBS를 생성하므로 이 문제를 방지할 수 있다.


PVC에서 Storage Class 지정

apiVersion: v1
kind: PersistentVolumeClaim
metadata:
  name: my-pvc
spec:
  accessModes:
    - ReadWriteOnce
  storageClassName: gp3    # 사용할 Storage Class 이름
  resources:
    requests:
      storage: 10Gi

storageClassName: ""으로 명시하면 동적 프로비저닝을 하지 않고 기존 PV에서 수동 바인딩을 시도한다.


기본 Storage Class

클러스터에 기본(default) Storage Class를 지정해두면 PVC에 storageClassName을 생략해도 자동으로 적용된다.

# 클러스터의 Storage Class 목록 확인
kubectl get storageclass
 
# 기본값인 경우 NAME 옆에 (default) 표시
# NAME            PROVISIONER             ...
# gp2 (default)   kubernetes.io/aws-ebs   ...
# gp3             ebs.csi.aws.com         ...

EBS와의 관계

EKS에서 EBS를 PV로 쓸 때의 흐름:

PVC 생성 (storageClassName: gp3)
  ↓
Storage Class가 EBS CSI 드라이버 호출
  ↓
AWS API로 EBS 볼륨 자동 생성
  ↓
PV 생성 (node affinity에 해당 AZ 자동 기록)
  ↓
파드 → PVC → PV → EBS 볼륨

EBS CSI 드라이버가 PV를 생성할 때 nodeAffinity에 해당 볼륨이 위치한 AZ를 자동으로 기록한다. 이 때문에 PV 재생성 시 AZ가 바뀌면 PVC도 함께 재생성해야 한다.