Kubernetes 볼륨(Persistent Volume & Claim) 영구 스토리지 개념 이해
Kubernetes에서 Persistent Volume (PV)와 Persistent Volume Claim (PVC)은 일반적으로 1:1 매핑됩니다. 하나의 PV는 하나의 PVC에 바인딩되며, 반대로 하나의 PVC는 하나의 PV에 바인딩됩니다. 따라서, 하나의 PV에 여러 PVC를 바인딩하는 것은 불가능합니다. 이 방식은 데이터를 저장하는 볼륨이 특정 애플리케이션에 독립적으로 할당되어 데이터 무결성을 유지하도록 보장합니다.
- Persistent Volume (PV): 클러스터 관리자가 제공하는 스토리지 자원입니다. PV는 클러스터에 있는 실제 스토리지(예: NFS, iSCSI, 클라우드 스토리지 등)를 추상화한 것입니다.
- Persistent Volume Claim (PVC): 개발자가 애플리케이션에서 스토리지를 요청할 때 사용하는 객체입니다. PVC는 필요한 스토리지의 크기와 접근 모드를 지정합니다.
PV 정의
apiVersion: v1
kind: PersistentVolume
metadata:
name: example-pv
spec:
capacity:
storage: 10Gi
accessModes:
- ReadWriteOnce
hostPath:
path: /mnt/data
PVC 정의
apiVersion: v1
kind: PersistentVolumeClaim
metadata:
name: example-pvc
spec:
accessModes:
- ReadWriteOnce
resources:
requests:
storage: 10Gi
이렇게 정의된 PVC가 PV와 매칭되면, 해당 스토리지는 해당 PVC를 사용하는 하나의 파드에서만 접근할 수 있습니다.
다중 파드에서 공유 스토리지가 필요한 경우, ReadOnlyMany (ROX) 또는 ReadWriteMany (RWX) 접근 모드를 지원하는 스토리지를 사용해야 합니다. 하지만 이는 특정 스토리지 시스템에 따라 지원 여부가 다릅니다. 만약 동일한 데이터를 여러 파드에서 접근해야 하는 시나리오라면, NFS 같은 네트워크 파일 시스템을 사용하여 PV를 설정하고, 여러 PVC가 이를 참조하도록 구성할 수 있습니다. 하지만 이는 PV 자체의 제한을 우회하는 것이지 PV-PVC 매핑 규칙을 바꾸는 것은 아닙니다. Kubernetes의 PV와 PVC는 다음과 같은 관점으로 이해할 수 있습니다.
Persistent Volume (PV)
- 물리적 스토리지의 추상화: PV는 실제 물리적 스토리지(예: NFS, iSCSI, 클라우드 스토리지)를 Kubernetes 클러스터 내에서 추상화한 것입니다.
- 관리자가 제공: 클러스터 관리자가 설정하고 관리합니다.
- 스토리지 세부 정보: 스토리지 용량, 접근 모드, 스토리지 클래스 등을 정의합니다.
Persistent Volume Claim (PVC)
- 논리적 스토리지 요청: PVC는 애플리케이션 또는 사용자가 필요로 하는 스토리지를 요청하는 객체입니다.
- 개발자가 사용: 개발자나 애플리케이션이 필요로 하는 스토리지 용량과 접근 모드를 정의합니다.
- PV와 바인딩: PVC는 클러스터 내에서 적절한 PV와 자동으로 바인딩됩니다.
이해를 돕는 예시
- Persistent Volume (PV)
- 마치 실제 하드 드라이브나 SSD와 같은 물리적 스토리지 장치입니다.
- 스토리지 관리자나 클러스터 관리자가 설정합니다.
- 예를 들어, 100GB의 NFS 스토리지를 제공할 수 있습니다.
- Persistent Volume Claim (PVC)
- 사용자가 필요한 스토리지를 요청하는 논리적 객체입니다.
- 개발자나 애플리케이션이 특정 용량과 접근 모드로 스토리지를 요청합니다.
- 예를 들어, 10GB의 스토리지가 필요하다고 요청하면, 해당 요구사항을 만족하는 PV와 바인딩됩니다.
PV 정의 (물리적 스토리지 추상화)
apiVersion: v1
kind: PersistentVolume
metadata:
name: example-pv
spec:
capacity:
storage: 100Gi
accessModes:
- ReadWriteOnce
nfs:
path: /mnt/data
server: nfs-server.example.com
PVC 정의 (논리적 스토리지 요청)
apiVersion: v1
kind: PersistentVolumeClaim
metadata:
name: example-pvc
spec:
accessModes:
- ReadWriteOnce
resources:
requests:
storage: 10Gi
위의 예시에서 example-pvc
는 10Gi의 스토리지를 요청하며, 이는 example-pv
와 바인딩됩니다.
- PV: 클러스터 관리자가 제공하는 물리적 스토리지의 추상화.
- PVC: 개발자나 애플리케이션이 논리적으로 요청하는 스토리지.
하나의 PV가 하나의 PVC에 바인딩되며, 반대로 하나의 PVC는 하나의 PV에 바인딩됩니다. 따라서 하나의 PV를 여러 PVC로 나누어 사용하는 것은 불가능합니다. 각 PV는 하나의 PVC에만 바인딩되며, 여러 PVC가 하나의 PV를 공유할 수 없습니다.
접근 모드에 따른 사용 방법
하나의 PV를 여러 파드에서 공유하고 싶은 경우, 접근 모드를 활용하여 이를 달성할 수 있습니다. Kubernetes에서 접근 모드는 다음과 같습니다.
- ReadWriteOnce (RWO): 단일 노드에서 읽기/쓰기가 가능하며, 하나의 PVC만 사용할 수 있습니다.
- ReadOnlyMany (ROX): 여러 노드에서 읽기 전용으로 사용할 수 있습니다.
- ReadWriteMany (RWX): 여러 노드에서 읽기/쓰기가 가능합니다.
예를 들어, ReadWriteMany (RWX) 접근 모드를 지원하는 스토리지 시스템을 사용할 경우, 하나의 PV를 여러 파드에서 공유할 수 있습니다.
PV 정의 (RWX 접근 모드)
apiVersion: v1
kind: PersistentVolume
metadata:
name: example-pv-rwx
spec:
capacity:
storage: 100Gi
accessModes:
- ReadWriteMany
nfs:
path: /mnt/shared-data
server: nfs-server.example.com
PVC 정의 (RWX 접근 모드)
apiVersion: v1
kind: PersistentVolumeClaim
metadata:
name: example-pvc-rwx
spec:
accessModes:
- ReadWriteMany
resources:
requests:
storage: 100Gi
이 경우, 여러 파드가 example-pvc-rwx
PVC를 참조할 수 있으며, 이를 통해 동일한 PV를 공유하게 됩니다. 그러나 이 경우에도 PVC는 하나이고, 여러 PVC가 하나의 PV를 공유하는 것은 아닙니다.
- 1:1 매핑: 하나의 PV는 하나의 PVC에만 바인딩됩니다.
- 여러 파드에서의 공유: RWX 접근 모드를 사용하여 하나의 PVC를 여러 파드에서 공유할 수 있습니다.
- 여러 PVC가 하나의 PV를 공유: 불가능합니다. 하나의 PV는 오직 하나의 PVC와 매핑됩니다.
Kubernetes의 스토리지 관리는 이러한 규칙을 통해 데이터의 무결성과 일관성을 유지합니다.
핵심 개념 요약
- PV와 PVC는 1:1 매핑: 하나의 PV는 하나의 PVC에만 바인딩됩니다.
- PVC를 여러 파드에서 사용: 여러 파드가 동일한 PVC를 참조할 수 있습니다.
세부 설명
- PV와 PVC는 1:1 매핑
- 하나의 PV는 하나의 PVC에 바인딩됩니다.
- 여러 PVC가 하나의 PV를 공유할 수 없습니다.
- PVC를 여러 파드에서 사용
- 하나의 PVC를 여러 파드에서 사용할 수 있습니다.
- 이를 위해서는 PVC가 적절한 접근 모드를 가지고 있어야 합니다.
RWX 접근 모드를 사용하는 경우
하나의 PV와 하나의 PVC가 ReadWriteMany (RWX) 접근 모드를 사용하여 여러 파드에서 공유될 수 있습니다.
PV 정의 (RWX 접근 모드)
apiVersion: v1
kind: PersistentVolume
metadata:
name: example-pv
spec:
capacity:
storage: 100Gi
accessModes:
- ReadWriteMany
nfs:
path: /mnt/shared-data
server: nfs-server.example.com
PVC 정의 (RWX 접근 모드)
apiVersion: v1
kind: PersistentVolumeClaim
metadata:
name: example-pvc
spec:
accessModes:
- ReadWriteMany
resources:
requests:
storage: 100Gi
파드 정의 (PVC를 사용하는 여러 파드)
apiVersion: v1
kind: Pod
metadata:
name: pod1
spec:
containers:
- name: container1
image: some-image
volumeMounts:
- mountPath: /data
name: shared-volume
volumes:
- name: shared-volume
persistentVolumeClaim:
claimName: example-pvc
---
apiVersion: v1
kind: Pod
metadata:
name: pod2
spec:
containers:
- name: container2
image: some-image
volumeMounts:
- mountPath: /data
name: shared-volume
volumes:
- name: shared-volume
persistentVolumeClaim:
claimName: example-pvc
위의 예시에서 example-pvc
는 example-pv
와 바인딩되며, 두 파드(pod1
, pod2
)가 example-pvc
를 사용하여 동일한 PV를 공유합니다. 이 경우, 여러 파드가 하나의 PVC를 통해 PV에 접근하게 됩니다.
- PV와 PVC는 1:1 매핑: 하나의 PV는 하나의 PVC에 바인딩됩니다.
- PVC를 여러 파드에서 사용: 여러 파드가 동일한 PVC를 참조하여 하나의 PV를 공유할 수 있습니다.