CKA — Kubernetes Administrator
Tying the Three Storage Layers Together
한국어 원문으로 표시합니다.
목표
StorageClass, PV, PVC 세 층을 직접 만들어 바인딩 조건을 몸으로 익히고, StatefulSet 이 볼륨을 어떻게 다루는지 확인합니다.
왜 중요한가
PVC 가 Pending 인 이유는 언제나 셋 중 하나입니다. 클래스 이름이 안 맞거나, 접근 모드가 안 맞거나, 용량이 모자랍니다. 여기에 프로비저너가 없어서 동적 생성이 안 되는 경우가 더해집니다. 이 실습 환경에는 실제 CSI 드라이버가 없으므로 정적 바인딩으로 이 조건들을 하나씩 확인합니다. 실제 데이터를 쓰는 것은 불가능하지만, 시험에서 묻는 것도 대부분 오브젝트 스펙과 바인딩 상태입니다.
allowVolumeExpansion 처럼 나중에 바꿔도 소용없는 필드를 미리 아는 것도 중요합니다. false 로 만든 클래스에서 나온 PVC 는 클래스를 나중에 고쳐도 확장할 수 없습니다.
단계
- 네임스페이스
cka-storage를 만들고 StorageClasscka-fast를 만든다. provisionernfs.csi.k8s.io, reclaimPolicyDelete, volumeBindingModeWaitForFirstConsumer, allowVolumeExpansiontrue. - StorageClass
cka-archive를 만든다. provisionernfs.csi.k8s.io, reclaimPolicyRetain, volumeBindingModeImmediate. 그리고cka-fast에 애너테이션storageclass.kubernetes.io/is-default-class: "true"를 붙여 기본 클래스로 만든다. 기본 클래스는 정확히 하나여야 한다. - PersistentVolume
cka-pv-1을 만든다. capacity 2Gi, accessModes[ReadWriteOnce], persistentVolumeReclaimPolicyRetain, storageClassNamecka-manual, 볼륨 소스는 hostPath/mnt/cka-data. cka-storage에 PVCcka-pvc-1을 만든다. 요청 1Gi, accessModes[ReadWriteOnce], storageClassNamecka-manual.cka-pv-1에 Bound 되어야 한다.- PersistentVolume
cka-pv-rwx를 만든다. capacity 5Gi, accessModes[ReadWriteMany], storageClassNamecka-shared, 볼륨 소스는 NFS (server10.0.0.109, path/volume1/k8s). 그리고 PVCcka-pvc-rwx(5Gi, RWX,cka-shared)를 만들어 Bound 시킨다. - 헤드리스 서비스
db-headless(clusterIP None, port 5432, 셀렉터app=db)를 만들고 StatefulSetdb를 만든다. serviceNamedb-headless, 레플리카 2, 이미지nginx:1.27, podManagementPolicyParallel, volumeClaimTemplates 는 이름data(accessModes[ReadWriteOnce], storageClassNamecka-fast, 1Gi), persistentVolumeClaimRetentionPolicy 는 whenDeletedDelete/ whenScaledRetain. PVCdata-db-0과data-db-1이 자동으로 만들어져야 한다. cka-storage에 파드vol-demo(이미지nginx:1.27)를 만든다. 볼륨cache는 emptyDir 로 mediumMemory, sizeLimit128Mi이고/cache에 마운트한다. 볼륨hostlogs는 hostPath path/var/log, typeDirectory이고/hostlogs에 readOnly 로 마운트한다.- PersistentVolume
cka-pv-static(capacity 1Gi, accessModes[ReadWriteOnce], storageClassName 을 아예 두지 않음, hostPath/mnt/cka-static)을 만들고, PVCcka-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가 주입되어 바인딩되지 않습니다.
StorageClass 만들기
네임스페이스 cka-storage 를 만들고 StorageClass cka-fast 를 만든다. provisioner nfs.csi.k8s.io, reclaimPolicy Delete, volumeBindingMode WaitForFirstConsumer, allowVolumeExpansion true.
provisioner 는 문자열이고 드라이버가 실제로 없어도 오브젝트는 만들어집니다. reclaimPolicy, volumeBindingMode, allowVolumeExpansion 은 StorageClass 최상위 필드로 parameters 안이 아닙니다.
두 번째 클래스와 기본 클래스 지정
StorageClass cka-archive 를 만든다. provisioner nfs.csi.k8s.io, reclaimPolicy Retain, volumeBindingMode Immediate. 그리고 cka-fast 에 애너테이션 storageclass.kubernetes.io/is-default-class: "true" 를 붙여 기본 클래스로 만든다. 기본 클래스는 정확히 하나여야 한다.
기본 클래스는 애너테이션으로 정합니다. 기본이 둘 이상이면 어떤 것이 쓰일지 예측할 수 없으니 정확히 하나여야 합니다.
PersistentVolume 직접 만들기
PersistentVolume cka-pv-1 을 만든다. capacity 2Gi, accessModes [ReadWriteOnce], persistentVolumeReclaimPolicy Retain, storageClassName cka-manual, 볼륨 소스는 hostPath /mnt/cka-data.
PV 는 클러스터 스코프입니다. 회수 정책 필드 이름이 StorageClass 와 다르다는 점에 주의하세요.
정적 바인딩 확인하기
cka-storage 에 PVC cka-pvc-1 을 만든다. 요청 1Gi, accessModes [ReadWriteOnce], storageClassName cka-manual. cka-pv-1 에 Bound 되어야 한다.
바인딩 조건은 클래스 이름 일치, 접근 모드 포함, 용량 충족 셋입니다. 하나만 어긋나도 조용히 Pending 에 머뭅니다.
RWX 볼륨 만들기
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 시킨다.
PV 와 PVC 의 accessModes 가 서로 맞아야 묶입니다. NFS 볼륨 소스는 server 와 path 두 필드를 요구합니다.
volumeClaimTemplates 로 PVC 자동 생성
헤드리스 서비스 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 이 자동으로 만들어져야 한다.
PVC 이름은 템플릿 이름과 파드 이름이 조합돼 정해집니다. 첫 파드가 Ready 가 되지 않으면 다음 파드가 만들어지지 않는 기본 동작을 바꿔야 합니다.
emptyDir 과 hostPath 마운트
cka-storage 에 파드 vol-demo (이미지 nginx:1.27)를 만든다. 볼륨 cache 는 emptyDir 로 medium Memory, sizeLimit 128Mi 이고 /cache 에 마운트한다. 볼륨 hostlogs 는 hostPath path /var/log, type Directory 이고 /hostlogs 에 readOnly 로 마운트한다.
볼륨 정의는 spec.volumes, 마운트는 컨테이너의 volumeMounts 입니다. 메모리 기반 emptyDir 은 medium 필드로 지정합니다.
종합: 기본 StorageClass 거부하기
PersistentVolume cka-pv-static (capacity 1Gi, accessModes [ReadWriteOnce], storageClassName 을 아예 두지 않음, hostPath /mnt/cka-static)을 만들고, PVC cka-pvc-static (1Gi, RWO)을 storageClassName 을 빈 문자열로 명시해 만들어 Bound 시킨다.
필드를 생략하는 것과 빈 문자열로 명시하는 것은 다릅니다. 전자는 기본값이 주입되고 후자는 거부입니다.