[CKA] PersistentVolume과 PVC 실습

PV와 PVC의 바인딩 조건, Pod 마운트, StorageClass 기반 확장을 정리합니다.

PVC가 Pending이면 요청 용량, access mode, StorageClass와 PV 상태를 비교합니다.

kubectl get pv
kubectl get pvc -A
kubectl describe pvc <claim> -n <namespace>
apiVersion: v1
kind: PersistentVolumeClaim
metadata:
  name: my-pvc
spec:
  accessModes: [ReadWriteOnce]
  volumeMode: Filesystem
  resources:
    requests:
      storage: 10Mi

Pod에서는 volume이 PVC를 참조하고, 컨테이너가 같은 volume 이름을 마운트합니다.

spec:
  containers:
  - name: app
    image: nginx
    volumeMounts:
    - name: data
      mountPath: /data
  volumes:
  - name: data
    persistentVolumeClaim:
      claimName: my-pvc

기존 PV를 특정 PVC에 연결해야 한다면 용량과 access mode뿐 아니라 storageClassName과 필요 시 volumeName을 확인합니다.

다음은 StorageClass가 없는 기존 PV를 명시적으로 선택하는 PVC입니다. 빈 문자열을 명시하지 않으면 클러스터의 기본 StorageClass가 적용되어 동적 프로비저닝이 시작될 수 있습니다.

apiVersion: v1
kind: PersistentVolumeClaim
metadata:
  name: my-pvc
spec:
  storageClassName: ""
  volumeName: <pv-name>
  accessModes: [ReadWriteOnce]
  resources:
    requests:
      storage: 10Mi

기존 PV에 storageClassName이 있다면 빈 문자열 대신 정확히 같은 class를 PVC에 지정합니다. control plane은 volumeName을 지정해도 storage class, access mode와 요청 용량이 유효한지 확인합니다. 자세한 조건은 PersistentVolume 예약 공식 문서에서 확인할 수 있습니다.

PVC 확장

StorageClass에서 확장을 허용해야 PVC 요청 용량을 늘릴 수 있습니다.

apiVersion: storage.k8s.io/v1
kind: StorageClass
metadata:
  name: standard
provisioner: <csi-provisioner>
allowVolumeExpansion: true

그다음 PVC의 resources.requests.storage를 더 큰 값으로 수정하고 상태를 확인합니다. provisioner는 클러스터 환경에 맞는 값을 사용해야 합니다.

kubectl edit pvc my-pvc
kubectl get pvc my-pvc -w