image

쿠버네티스에서 볼륨(Volume)을 사용하는 구조는 PV라고 하는 **퍼시스턴트 볼륨(PersistentVolume)**과 PVC라고 하는 퍼시스턴트 볼륨 클레임(PersistentVolumeClaim) 2개로 분리되어 있습니다.

PV/PVC

PV는 볼륨 자체를 뜻한다. 클러스터 안에서의 자원이다. POD와는 별개로 관리되며 별도의 생명 주기가 있다. 

PVC는 사용자가 PV에 하는 요청입니다. 사용하고 싶은 용량은 얼마인지, 읽기/쓰기는 어떤 모드로 설정하고 싶은지 등을 정해서 요청한다. 쿠버네티스 볼륨을 파드에 직접 할당하는 방식이 아니라 중간에 PVC를 두어 파드와 파드가 사용할 스토리지를 분리했다. 이런 구조는 파드 각각의 상황에 맞게 다양한 스토리지를 사용할 수 있게 한다.  \

PV와 PVC는 다음과 같은 생명주기가 있다.

|475

1. Provisioning(프로비저닝)

PV를 만드는 단계

프로비저닝 방법에는 두 가지가 있는데,

  1. PV를 미리 만들어 두고 사용하는 정적(static) 방법
  2. 요청이 있을 때 마다 PV를 만드는 동적(dynamic) 방법

정적(static) 프로비저닝

미리 적정 용량의 PV를 만들어 두고 사용자의 요청이 있으면 미리 만들어둔 PV를 할당. 사용할 수 있는 스토리지 용량에 제한이 있을 때 유용 

동적(dynamic) 프로비저닝

동적으로 프로비저닝 할 때는 사용자가 PVC를 거쳐서 PV를 요청했을 때 생성해 제공. \

사용자가 원하는 용량만큼을 생성해서 사용할 수 있다.

PVC는 동적 프로비저닝할 때 여러가지 스토리지 중 원하는 스토리지를 정의하는 스토리지 클래스(Storage Class)로 PV를 생성합니다.

2. Binding(바인딩)

프로비저닝으로 만든 PV를 PVC와 연결하는 단계

PVC에서 원하는 스토리지를 요청하면 거기에 맞는 PV가 할당.

이 때 PVC에서 원하는 PV가 없다면 요청은 실패한다. 하지만 PVC는 원하는 PV가 생길 때까지 대기하다가 바인딩한다. 

PV와 PVC의 매핑은 1대1 관계다.

3. Using(사용)

PVC는 파드에 설정되고 파드는 PVC를 볼륨으로 인식해서 사용한다.

할당된 PVC는 파드를 유지하는 동안 계속 사용하며 시스템에서 임의로 삭제할 수 없다!!

이 기능을 ‘Storage Object in Use Protection’ (사용 중인 스토리지 오브젝트 보호)라고 한다

4. Reclaiming(반환)

사용이 끝난 PVC는 삭제되고 PVC를 사용하던 PV를 초기화(reclaim)하는 과정을 거칩니다. 이를 Reclaiming(반환)이라고 합니다.

초기화 정책에는 Retain, Delete, Recycle이 있습니다.

Retain

Retain은 PV를 그대로 보존합니다. PVC가 삭제되면 사용 중이던 PV는 해제(released) 상태여서 다른 PVC가 재사용할 수 없습니다. 단순히 사용 해제 상태이므로 PV 안의 데이터는 그대로 남아있습니다. 이 PV를 재사용하려면 관리자가 다음 순서대로 직접 초기화해줘야합니다.

  1. PV 삭제. 만약 PV가 외부 스토리지와 연결되었다면 PV는 삭제되더라도 외부 스토리지의 볼륨은 그대로 남아 있습니다.
  2. 스토리지에 남은 데이터를 직접 정리
  3. 남은 스토리지의 볼륨을 삭제하거나 재사용하려면 해당 볼륨을 이용하는 PV 재생성

Delete

PV를 삭제하고 연결된 외부 스토리지 쪽의 볼륨도 삭제합니다. 프로비저닝할 때 동적 볼륨 할당 정책으로 생성된 PV들은 기본 반환 정책(Reclaim Policy)이 Delete 입니다. 상황에 따라 처음에 Delete로 설정된 PV의 반환 정책을 수정해서 사용해야 합니다.

Recycle

Recycle은 PV의 데이터들을 삭제하고 다시 새로운 PVC에서 PV를 사용할 수 있도록 합니다. 특별한 파드를 만들어 두고 데이터를 초기화하는 기능도 있지만 동적 볼륨 할당을 기본 사용할 것을 추천

예시

PV 예시

apiVersionv1
kindPersistentVolume
metadata:
  namepv-hostpath
spec:
  capacity:
    storage2Gi # 스토리지 용량 2GB
  volumeModeFilesystem # 파일 시스템 형식
  accessModes: # 읽기/쓰기 옵션
  - ReadWriteOnce
  storageClassNamemanual
  persistentVolumeReclaimPolicyDelete
  hostPath:
    path/tmp/k8s-pv # 스토리지를 연결할 Path

9번 라인의 .spec.accessModes 필드는 볼륨의 읽기/쓰기 옵션을 설정합니다. 볼륨은 한 번에  accessModes 필드를 하나만 설정할 수 있으며 필드 값은 세 가지가 있다. 

  • ReadWriteOnce: 노드 하나에만 볼륨을 읽기/쓰기하도록 마운트할 수 있음
  • ReadOnlyMany: 여러 개 노드에서 읽기 전용으로 마운트할 수 있음
  • ReadWriteMany: 여러 개 노드에서 읽기/쓰기 가능하도록 마운트할 수 있음