[CKA] StorageClass
StorageClass의 핵심 개념과 구성 방법, 실습 풀이를 정리합니다.
Storage Class
Static Provisioning
GCP에서 볼륨을 생성하고 PV를 정의하는 예시입니다.
gcloud beta compute disks create \
--size 1GB \
--region us-east1 \
pd-disk
아래 gcePersistentDisk 소스는 Kubernetes 1.28에서 제거된 과거 인트리 플러그인 예시이므로 현재 클러스터에서는 작동하지 않습니다. 현재 환경에서는 GCE PD CSI 드라이버를 사용해야 합니다.
apiVersion: v1
kind: PersistentVolume
metadata:
name: pv-vol1
spec:
accessModes:
- ReadWriteOnce
capacity:
storage: 500Mi
gcePersistentDisk:
pdName: pd-disk
fsType: ext4
여기서 제한사항이 존재합니다.
- 매번 스토리지가 필요할 때마다 수동 작업이 필요
- 디스크 생성과 PV 정의 파일 작성이라는 두 단계의 작업이 필요
- 확장성이 제한됨 (자동화된 프로비저닝이 아님)
이렇게 사전 수동으로 스토리지를 프로비저닝하여 사용하는 방식을 Static Provisioning 이라고 합니다.
Dynamic Provisioning
동적 프로비저닝에는 StorageClass가 필요합니다.
- 스토리지가 필요할 때 자동으로 생성되는 방식
- Storage Class를 통해 필요한 스토리지 특성을 미리 정의
- PVC 요청이 들어올 때 자동으로 PV를 생성하고 할당
apiVersion: storage.k8s.io/v1
kind: StorageClass
metadata:
name: silver # 또는 gold, platinum
provisioner: pd.csi.storage.gke.io
parameters:
type: pd-standard # 스토리지 타입 지정
주요 구성 요소는 다음과 같습니다.
- Storage Class: 스토리지 타입과 프로비저닝 정책 정의하며 고유 식별자로 구성합니다.
- PVC (Persistent Volume Claim): 스토리지 요청
- Provisioner: 실제 스토리지 리소스를 생성하는 컴포넌트이며 실제 스토리지를 생성하는 플러그인을 지정하거나 클라우드 제공자별 프로비저너를 사용합니다.
- PV (Persistent Volume): 자동 생성되는 실제 스토리지 리소스
동작 과정은 다음과 같습니다.
- PVC 생성 요청 → StorageClass 확인
- StorageClass의 Provisioner가 동작
- 실제 스토리지(PV) 자동 생성
- PVC와 PV 자동 바인딩
- Pod에서 사용 가능한 상태가 됨
StorageClass 이름은 운영자가 정하며slow,fast처럼 성능 특성을 드러내도록 구성할 수 있습니다.
바인딩 모드 WaitForFirstConsumer 는 PVC가 실제 Pod에 바인딩되기 전까지 PV에 사용되지 않습니다. Pod가 스케줄링될 때까지 대기하는 상태로 Pod의 스케줄링 요구사항을 고려하여 더 나은 PV 바인딩 결정을 할 수 있게 하는 역할입니다.
- 더 효율적인 리소스 할당
- Pod의 스케줄링 요구사항 고려 가능
- 특히 local storage 사용 시 중요
- Pod가 특정 노드에 스케줄링되어야 할 때
- 해당 노드의 local storage를 사용해야 할 때
파드를 --dry-run 으로 생성하기 위해선 run 명령어를 사용합니다.
$ kubectl run nginx --image=nginx:alpine --dry-run=client -o yaml > nginx.yaml
apiVersion: v1
kind: Pod
metadata:
creationTimestamp: null
labels:
run: nginx
name: nginx
spec:
containers:
- image: nginx:alpine
name: nginx
resources: {}
volumeMounts:
# a mount for site-data
- name: local-pv-1
mountPath: /var/www/html
dnsPolicy: ClusterFirst
restartPolicy: Always
volumes:
- name: local-pv-1
persistentVolumeClaim:
claimName: local-pvc
status: {}
StorageClass 생성하기
apiVersion: storage.k8s.io/v1
kind: StorageClass
metadata:
name: delayed-volume-sc
provisioner: kubernetes.io/no-provisioner
reclaimPolicy: Retain
mountOptions:
- debug
volumeBindingMode: WaitForFirstConsumer