Kubernetes에서 스토리지 관리는 컨테이너화된 애플리케이션의 데이터 영속성을 보장하는 데 중요한 역할을 합니니다. 이번 글에서는 데이터 영속성 보장을 위하여 사용되는 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.yaml
과 kubectl 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 describe
와kubectl get pv
명령어로 바인딩 문제나 마운트 오류를 확인하고 해결합니다.
'쿠버네티스' 카테고리의 다른 글
helm uninstall시 일부 리소스가 남아 있는 이유 (0) | 2025.03.21 |
---|---|
helm Chart로 생성한 object 수동 삭제하기 (0) | 2025.03.15 |
Storage 3대장 이해하기 (4/4) - Object Storage (0) | 2025.03.07 |
externalTrafficPolicy 활용 하기 (0) | 2025.03.06 |
Storage 3대장 이해하기 (3/4) - File Storage (0) | 2025.02.26 |