CKA — 쿠버네티스 관리자 · 스토리지 · 실습
스토리지 세 층 엮기
목표
StorageClass, PV, PVC 세 층을 직접 만들어 바인딩 조건을 몸으로 익히고, StatefulSet 이 볼륨을 어떻게 다루는지 확인합니다.
왜 중요한가
PVC 가 Pending 인 이유는 언제나 셋 중 하나입니다. 클래스 이름이 안 맞거나, 접근 모드가 안 맞거나, 용량이 모자랍니다. 여기에 프로비저너가 없어서 동적 생성이 안 되는 경우가 더해집니다. 이 실습 환경에는 실제 CSI 드라이버가 없으므로 정적 바인딩으로 이 조건들을 하나씩 확인합니다. 실제 데이터를 쓰는 것은 불가능하지만, 시험에서 묻는 것도 대부분 오브젝트 스펙과 바인딩 상태입니다.
allowVolumeExpansion 처럼 나중에 바꿔도 소용없는 필드를 미리 아는 것도 중요합니다. false 로 만든 클래스에서 나온 PVC 는 클래스를 나중에 고쳐도 확장할 수 없습니다.
단계
1. 네임스페이스 cka-storage 를 만들고 StorageClass cka-fast 를 만든다. provisioner nfs.csi.k8s.io, reclaimPolicy Delete, volumeBindingMode WaitForFirstConsumer, allowVolumeExpansion true.
2. StorageClass cka-archive 를 만든다. provisioner nfs.csi.k8s.io, reclaimPolicy Retain, volumeBindingMode Immediate. 그리고 cka-fast 에 애너테이션 storageclass.kubernetes.io/is-default-class: "true" 를 붙여 기본 클래스로 만든다. 기본 클래스는 정확히 하나여야 한다.
3. PersistentVolume cka-pv-1 을 만든다. capacity 2Gi, accessModes [ReadWriteOnce], persistentVolumeReclaimPolicy Retain, storageClassName cka-manual, 볼륨 소스는 hostPath /mnt/cka-data.
4. cka-storage 에 PVC cka-pvc-1 을 만든다. 요청 1Gi, accessModes [ReadWriteOnce], storageClassName cka-manual. cka-pv-1 에 Bound 되어야 한다.
5. PersistentVolume cka-pv-rwx 를 만든다. capacity 5Gi, accessModes [ReadWriteMany], storageClassName cka-shared, 볼륨 소스는 NFS (server 10.0.0.109, path /volume1/k8s). 그리고 PVC cka-pvc-rwx (5Gi, RWX, cka-shared)를 만들어 Bound 시킨다.
6. 헤드리스 서비스 db-headless (clusterIP None, port 5432, 셀렉터 app=db)를 만들고 StatefulSet db 를 만든다. serviceName db-headless, 레플리카 2, 이미지 nginx:1.27, podManagementPolicy Parallel, volumeClaimTemplates 는 이름 data (accessModes [ReadWriteOnce], storageClassName cka-fast, 1Gi), persistentVolumeClaimRetentionPolicy 는 whenDeleted Delete / whenScaled Retain. PVC data-db-0 과 data-db-1 이 자동으로 만들어져야 한다.
7. cka-storage 에 파드 vol-demo (이미지 nginx:1.27)를 만든다. 볼륨 cache 는 emptyDir 로 medium Memory, sizeLimit 128Mi 이고 /cache 에 마운트한다. 볼륨 hostlogs 는 hostPath path /var/log, type Directory 이고 /hostlogs 에 readOnly 로 마운트한다.
8. PersistentVolume cka-pv-static (capacity 1Gi, accessModes [ReadWriteOnce], storageClassName 을 아예 두지 않음, hostPath /mnt/cka-static)을 만들고, PVC cka-pvc-static (1Gi, RWO)을 storageClassName 을 빈 문자열로 명시해 만들어 Bound 시킨다.
참고
- 6단계의 PVC 는 프로비저너가 없어 Pending 에 머무릅니다. 정상이며, 채점은 PVC 오브젝트의 생성 여부를 봅니다.
kubectl get pvc -n cka-storage로 STATUS 와 VOLUME 컬럼을 함께 보면 바인딩 상태가 한눈에 들어옵니다.- 흔한 실수 1: PV 의 회수 정책 필드를
reclaimPolicy로 적는 것. PV 에서는persistentVolumeReclaimPolicy입니다. - 흔한 실수 2: 8단계에서
storageClassName을 생략하는 것. 생략하면 기본 클래스인cka-fast가 주입되어 바인딩되지 않습니다.
단계 8개
- StorageClass 만들기
- 두 번째 클래스와 기본 클래스 지정
- PersistentVolume 직접 만들기
- 정적 바인딩 확인하기
- RWX 볼륨 만들기
- volumeClaimTemplates 로 PVC 자동 생성
- emptyDir 과 hostPath 마운트
- 종합: 기본 StorageClass 거부하기