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 Provisioning | Storage 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.com | AWS EBS CSI 드라이버 (권장) |
kubernetes.io/aws-ebs | 구버전 in-tree EBS 드라이버 (deprecated) |
efs.csi.aws.com | AWS EFS CSI 드라이버 |
reclaimPolicy
PVC가 삭제됐을 때 PV(와 실제 스토리지)를 어떻게 처리할지 결정한다.
| 값 | 동작 |
|---|---|
Delete | PV와 실제 스토리지(EBS 볼륨 등)도 함께 삭제 |
Retain | PV는 Released 상태로 남고 실제 스토리지도 유지. 수동으로 정리해야 함 |
운영 환경에서는 실수로 데이터를 날리지 않도록 Retain을 쓰는 경우가 많다.
volumeBindingMode
PV 바인딩(및 프로비저닝)을 언제 할지 결정한다.
| 값 | 동작 |
|---|---|
Immediate | PVC 생성 즉시 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: 10GistorageClassName: ""으로 명시하면 동적 프로비저닝을 하지 않고 기존 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도 함께 재생성해야 한다.
댓글 (0)