본문 바로가기

쿠버네티스

PV, PVC, StorageClass 실습

Kubernetes에서 스토리지 관리는 컨테이너화된 애플리케이션의 데이터 영속성을 보장하는 데 중요한 역할을 합니니다. 이번 글에서는 데이터 영속성 보장을 위하여 사용되는 PV, PVC, StorageClass 에 대하여 실습 예제와 함께 자세히 알아봅니다.

 

pv, pvc, storageclass 실습

 

 

목 차

 


 

1. Kubernetes에서 PV와 PVC의 기본 개념 이해하기


Persistent Volume(PV)은 클러스터 내에서 스토리지 리소스를 나타내며, 관리자가 물리적 스토리지(예: NFS, iSCSI, 클라우드 스토리지 등)를 프로비저닝하여 정의합니다.

 

반면 Persistent Volume Claim(PVC)은 사용자가 PV를 요청하는 방법으로, 필요한 스토리지 크기나 접근 모드(예: ReadWriteOnce, ReadOnlyMany 등)를 명시합니다.

 

PV와 PVC는 공급과 수요 관계로 비유할 수 있는데, PV는 제공되는 스토리지이고 PVC는 이를 사용하는 요청입니다. Kubernetes가 이 둘을 자동으로 매핑하므로 사용자는 스토리지의 물리적 세부사항을 신경 쓰지 않아도 됩니다. 실습을 통해 확인해 보겠습니다.



 

실습 : PV, PVC 생성

간단한 PV와 PVC를 생성해보겠습니다. 먼저 PV를 정의하는 YAML 파일(pv-example.yaml)을 작성합니다.

apiVersion: v1  
kind: PersistentVolume  
metadata:  
  name: example-pv  
spec:  
  capacity:  
    storage: 1Gi  
  accessModes:  
    - ReadWriteOnce  
  hostPath:  
    path: "/mnt/data"  

 

다음으로, PVC를 정의하는 파일(pvc-example.yaml)을 작성합니다.

apiVersion: v1  
kind: PersistentVolumeClaim  
metadata:  
  name: example-pvc  
spec:  
  accessModes:  
    - ReadWriteOnce  
  resources:  
    requests:  
      storage: 1Gi  

 

이제 kubectl apply -f pv-example.yamlkubectl apply -f pvc-example.yaml 명령어를 실행해 적용합니다. 확인하려면 kubectl get pv를 실행하면 다음과 같은 결과가 나타날 수 있습니다.

NAME         CAPACITY   ACCESS MODES   RECLAIM POLICY   STATUS   CLAIM               STORAGECLASS   REASON   AGE  
example-pv   1Gi        RWO            Retain           Bound    default/example-pvc                          5m  

 

또한 kubectl get pvc를 실행하면 아래와 같이 PVC가 PV와 바인딩된 것을 볼 수 있습니다. (STATUS: Bound)

NAME         STATUS   VOLUME       CAPACITY   ACCESS MODES   STORAGECLASS   AGE  
example-pvc  Bound    example-pv   1Gi        RWO                           5m  

 

이 결과는 PV와 PVC가 성공적으로 연결되었음을 보여줍니다.

 


 

2. Storage Class와 동적 프로비저닝의 역할

Storage Class는 Kubernetes에서 스토리지를 동적으로 프로비저닝할 수 있게 해주는 기능입니다. PV를 수동으로 생성하는 대신, Storage Class를 사용하면 PVC 요청이 들어올 때 자동으로 PV가 생성됩니다. 이는 클라우드 환경(예: AWS EBS, GCP Persistent Disk)에서 특히 유용하며, 관리 부담을 줄여줍니다.

 

Storage Class는 스토리지 제공자(provisioner), 파라미터(예: 디스크 유형), 그리고 재확인 정책(reclaimPolicy)을 정의합니다. 이를 통해 스토리지의 유연성과 확장성을 확보할 수 있으며, 수동 작업 없이도 효율적으로 스토리지를 관리할 수 있습니다.

 

실습 : Storage Class 생성

Storage Class를 생성하고 동적 프로비저닝을 테스트해봅시다. 먼저 Storage Class를 정의하는 YAML 파일(storageclass-example.yaml)을 작성합니다.

 

apiVersion: storage.k8s.io/v1  
kind: StorageClass  
metadata:  
  name: fast-storage  
provisioner: kubernetes.io/no-provisioner # 로컬 테스트용, 클라우드에서는 실제 provisioner 사용  
parameters:  
  type: local  
reclaimPolicy: Delete  

 

kubectl apply -f storageclass-example.yaml을 실행해 적용합니다. 이제 PVC에서 이 Storage Class를 참조하도록 설정합니다(pvc-dynamic.yaml)

apiVersion: v1  
kind: PersistentVolumeClaim  
metadata:  
  name: dynamic-pvc  
spec:  
  storageClassName: fast-storage  
  accessModes:  
    - ReadWriteOnce  
  resources:  
    requests:  
      storage: 2Gi  

 

kubectl apply -f pvc-dynamic.yaml을 실행한 후, kubectl get pvc dynamic-pvc를 실행하면 결과는 다음과 같을 수 있습니다.

NAME         STATUS   VOLUME       CAPACITY   ACCESS MODES   STORAGECLASS    AGE  
dynamic-pvc  Bound    pv-dynamic   2Gi        RWO            fast-storage    3m  

 

동시에 kubectl get pv를 실행하면 동적으로 생성된 PV를 확인할 수 있습니다.

NAME         CAPACITY   ACCESS MODES   RECLAIM POLICY   STATUS   CLAIM                STORAGECLASS    REASON   AGE  
pv-dynamic   2Gi        RWO            Delete           Bound    default/dynamic-pvc  fast-storage            3m  

 

이는 Storage Class가 PVC 요청에 따라 PV를 자동으로 생성했음을 나타냅니다.

 


 

3. PV와 PVC를 Pod에 연결하는 방법

PV와 PVC를 생성한 후에는 이를 Pod에 마운트해 실제 애플리케이션에서 사용할 수 있습니다. Pod는 PVC를 볼륨으로 참조하여 데이터를 읽고 쓸 수 있으며, PVC는 Pod와 스토리지 간의 연결 역할을 합니다.


Pod 스펙에서 volumes 섹션에 PVC를 정의하고, 컨테이너의 volumeMounts에 마운트 경로를 설정합니다. 이 과정을 통해 컨테이너가 재시작되더라도 데이터를 유지할 수 있습니다.

 

실습 : Pod에 PVC 연결

 

앞서 만든 PVC를 Pod에 연결해보겠습니다. Pod 정의 YAML(pod-example.yaml)을 작성합니다.

apiVersion: v1  
kind: Pod  
metadata:  
  name: example-pod  
spec:  
  containers:  
  - name: nginx  
    image: nginx  
    volumeMounts:  
    - mountPath: "/usr/share/nginx/html"  
      name: storage  
  volumes:  
  - name: storage  
    persistentVolumeClaim:  
      claimName: example-pvc  

 

kubectl apply -f pod-example.yaml을 실행합니다. Pod 상태를 확인하려면 kubectl get pod example-pod를 실행하면 다음과 같은 결과를 확인할 수 있습니다.

NAME          READY   STATUS    RESTARTS   AGE  
example-pod   1/1     Running   0          2m  

 

Pod가 정상적으로 실행 중임을 확인한 후, kubectl exec -it example-pod -- bash로 Pod 내부에 접속해 마운트된 경로(/usr/share/nginx/html)에 파일을 생성해보면 데이터가 유지되는 것을 알 수 있습니다.

 


4. 스토리지 관리 시 주의사항과 디버깅 팁

Kubernetes에서 스토리지를 다룰 때 흔히 발생하는 문제는 PV와 PVC의 바인딩 실패나 Pod의 볼륨 마운트 오류입니다.

PV와 PVC가 매핑되지 않으면 PVC 상태가 Pending으로 남는데, 이는 스토리지 용량 부족, 접근 모드 불일치, 또는 Storage Class 설정 오류 때문일 수 있습니다. 디버깅 시 kubectl describe pvc <pvc-name> 명령어로 이벤트 로그를 확인하면 원인을 파악할 수 있습니다.

 

Pod가 볼륨을 마운트하지 못할 경우 kubectl logs <pod-name>로 컨테이너 로그를, kubectl describe pod <pod-name>로 Pod 상태를 점검하는 것이 유용합니다.

 

실습 : PV 없이 PVC 생성

 

PVC가 바인딩되지 않는 상황을 확인해봅시다. PV 없이 PVC만 생성하는 YAML(test-pvc.yaml)을 작성합니다.

apiVersion: v1  
kind: PersistentVolumeClaim  
metadata:  
  name: test-pvc  
spec:  
  accessModes:  
    - ReadWriteOnce  
  resources:  
    requests:  
      storage: 10Gi  

 

kubectl apply -f test-pvc.yaml을 실행한 후, kubectl get pvc test-pvc를 실행하면 결과는 다음과 같습니다.

NAME      STATUS    VOLUME   CAPACITY   ACCESS MODES   STORAGECLASS   AGE  
test-pvc  Pending                                      2m  

 

PVC가 Pending 상태임을 확인한 뒤, kubectl describe pvc test-pvc를 실행하여 이벤트 로그를 확인합니다.

Events:  
  Type     Reason              Age   From                         Message  
  ----     ------              ----  ----                         -------  
  Warning  ProvisioningFailed  2m    persistentvolume-controller  No matching persistent volumes found for claim  

 

이는 PV가 없어 바인딩이 실패했음을 나타내며, 해결하려면 적절한 PV를 추가하거나 Storage Class를 사용해야 합니다.

 




5. 요약정리: PV, PVC, Storage Class 사용법 핵심

Kubernetes에서 스토리지를 효과적으로 관리하려면 PV, PVC, Storage Class의 역할과 사용법을 이해하는 것이 필수입니다.

  • PV - 스토리지의 공급자: 클러스터에서 사용할 수 있는 물리적 스토리지를 정의하며, 수동 생성 또는 동적 프로비저닝으로 제공됩니다.
  • PVC - 스토리지 요청자: 사용자가 필요한 스토리지를 요청하며, PV와 매핑되어 Pod에 연결됩니다.
  • Storage Class로 동적 관리: 수동 PV 생성 대신 PVC 요청 시 PV를 자동 생성하며, 관리 효율성을 높입니다.
  • Pod에 볼륨 마운트: PVC를 Pod의 볼륨으로 지정해 데이터를 영속적으로 사용하며, YAML 설정이 핵심입니다.
  • 디버깅은 필수: kubectl describekubectl get pv 명령어로 바인딩 문제나 마운트 오류를 확인하고 해결합니다.