[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

여기서 제한사항이 존재합니다.

이렇게 사전 수동으로 스토리지를 프로비저닝하여 사용하는 방식을 Static Provisioning 이라고 합니다.

Dynamic Provisioning

동적 프로비저닝에는 StorageClass가 필요합니다.

apiVersion: storage.k8s.io/v1
kind: StorageClass
metadata:
  name: silver  # 또는 gold, platinum
provisioner: pd.csi.storage.gke.io
parameters:
  type: pd-standard  # 스토리지 타입 지정

주요 구성 요소는 다음과 같습니다.


동작 과정은 다음과 같습니다.


바인딩 모드 WaitForFirstConsumer 는 PVC가 실제 Pod에 바인딩되기 전까지 PV에 사용되지 않습니다. Pod가 스케줄링될 때까지 대기하는 상태로 Pod의 스케줄링 요구사항을 고려하여 더 나은 PV 바인딩 결정을 할 수 있게 하는 역할입니다.

파드를 --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