1. 개요
Kubernetes는 기본적으로 상태가 없는(stateless) 애플리케이션을 실행하는 데 적합하지만, 데이터의 지속성을 보장해야 하는 상태 저장(stateful) 애플리케이션도 많이 사용된다. 이를 위해 Kubernetes는 Persistent Volume(PV) 및 Persistent Volume Claim(PVC) 개념을 도입하여 스토리지를 동적으로 관리할 수 있도록 한다.
2. Persistent Volume(PV)란?
Persistent Volume(PV)은 클러스터 내에서 관리되는 독립적인 스토리지 리소스로, 관리자가 미리 생성해두고 사용자가 요청하여 사용할 수 있다. PV는 특정 스토리지 유형과 연결되며, 수명 주기가 Pod보다 길어 Pod가 재시작되거나 이동하더라도 데이터를 유지할 수 있다.
2.1 PV의 주요 속성
- 스토리지 클래스(Storage Class): 동적 프로비저닝(dynamic provisioning)을 지원하는 경우 스토리지 클래스를 지정하여 자동으로 스토리지를 생성할 수 있음.
- 액세스 모드(Access Modes):
ReadWriteOnce (RWO)
: 하나의 노드에서 읽기 및 쓰기 가능ReadOnlyMany (ROX)
: 여러 노드에서 읽기만 가능ReadWriteMany (RWX)
: 여러 노드에서 읽기 및 쓰기 가능
- 용량(Capacity): 저장 가능한 데이터의 크기 지정.
- 볼륨 플러그인(Volume Plugin): NFS, iSCSI, AWS EBS, Azure Disk, GCE Persistent Disk 등 다양한 스토리지 백엔드를 지원.
- Reclaim Policy: 스토리지가 반환될 때 처리 방식 (
Retain
,Recycle
,Delete
).
2.2 PV 예제 (NFS 기반)
apiVersion: v1
kind: PersistentVolume
metadata:
name: example-pv
spec:
capacity:
storage: 10Gi
accessModes:
- ReadWriteOnce
persistentVolumeReclaimPolicy: Retain
nfs:
path: /mnt/data
server: 192.168.1.100
3. Persistent Volume Claim(PVC)란?
Persistent Volume Claim(PVC)은 사용자가 스토리지를 요청하는 방식이다. PVC는 PV에서 정의된 스토리지를 사용하기 위한 요구사항을 명시하며, Kubernetes가 적절한 PV를 자동으로 바인딩해준다.
3.1 PVC의 주요 속성
- 요청된 스토리지 용량 및 액세스 모드 지정 가능.
- 특정 Storage Class 지정 가능.
- 동적으로 PV를 생성할 수도 있음.
3.2 PVC 예제
apiVersion: v1
kind: PersistentVolumeClaim
metadata:
name: example-pvc
spec:
accessModes:
- ReadWriteOnce
resources:
requests:
storage: 5Gi
4. PVC와 PV 바인딩
PVC가 생성되면 Kubernetes는 해당 PVC의 요구사항과 일치하는 PV를 찾아 자동으로 바인딩한다. 사용자는 PVC를 Pod에 마운트하여 영구적인 스토리지를 사용할 수 있다.
4.1 PVC를 사용하는 Pod 예제
apiVersion: v1
kind: Pod
metadata:
name: example-pod
spec:
containers:
- name: my-container
image: busybox
volumeMounts:
- mountPath: "/data"
name: storage
volumes:
- name: storage
persistentVolumeClaim:
claimName: example-pvc
5. 동적 스토리지 프로비저닝
PV를 미리 생성하는 대신, Storage Class를 이용하여 PVC가 생성될 때 자동으로 PV를 동적으로 생성할 수도 있다.
5.1 Storage Class 예제 (AWS EBS)
apiVersion: storage.k8s.io/v1
kind: StorageClass
metadata:
name: standard
provisioner: kubernetes.io/aws-ebs
parameters:
type: gp2
PVC에서 Storage Class를 지정하면 Kubernetes가 자동으로 EBS 볼륨을 프로비저닝하여 PVC에 연결해준다.
apiVersion: v1
kind: PersistentVolumeClaim
metadata:
name: dynamic-pvc
spec:
accessModes:
- ReadWriteOnce
resources:
requests:
storage: 10Gi
storageClassName: standard
6. 결론
Kubernetes의 PV와 PVC는 애플리케이션이 지속적인 스토리지를 활용할 수 있도록 도와준다. 이를 통해 Stateful 애플리케이션을 Kubernetes 환경에서도 안정적으로 운영할 수 있으며, 동적 프로비저닝을 활용하면 운영의 편의성을 더욱 높일 수 있다.