POD의 Container는 이미지로부터 파일시스템을 제공받는데, POD가 종료되면 POD내의 데이터(파일)
은 더 이상 사용할 수 없게 됩니다.
Controller에의해 새 POD가 생성되면 이미지로부터 새로운 파일시스템을 제공받는 구조로 설계되어 있기 때문입니다.
즉 Container는 기본적으로 데이터를 유지하지 않으며, 이런 형태를 상태가 없다(Stateless)
라고 합니다.
POD는 데이터 보존을 위해 Volume
을 생성하고 이런 Volume을 Container에 Mount
해서 사용하게됩니다. 물론 Volume은 여러 POD에서 동시
에 접근이 가능하구요
기본적인 Volume의 LifeCycle
은 POD의 LifeCycle
과 같은데, POD가 생성되고 삭제됨에 따라 Volume도 같이 생성되고 삭제되기 때문입니다.
그러나 POD가 재 시작되면 Volume의 데이터는 삭제되지 않고 유지되며, 재 시작 된 POD에게 해당 Volume의 데이터를 다시 제공해줍니다.
PersistentVolume
, PersistentVloumeClaim
로 Volume만의 LifeCycle은 분리할 수 있고, POD의 로직과 별도로 Volume(스토리지)
을 사용 할 수 있습니다.
Kuberntes는 Volume을 POD에 직접 할당하는 방식이 아닌 PVC를 둠으로 POD와 스토리지를 분리했습니다.
이 구조는 각자의 상황에 맞게 다양한 스토리지를 사용할 수 있게 해줍니다. CLOUD를 사용하는 경우에는 본인이 사용하는 CLOUD SaaS를 Volume 서비스를 사용할 수도 있고
직접 구축해서 사용 중인 스토리지가 있다면 그것 또한 사용할 수도 있습니다. 이렇게 다양한 스토리지를 PV로 사용할 수 있지만 POD에 직접 연결하는게 아니라 PVC를 통해서 사용하기 때문에 POD는 자신이 어떤 스토리지를 사용하는지 신경쓰지 않아도 됩니다.
Provisioning
이라고 합니다.정적(static)
: PV를 미리 만들어두고 사용합니다.동적(dynamic)
: 요청이 있을때마다 PV를 만드는 방법.스토리지클래스(StorageClasses)
를 사용합니다. StorageClasses를 이용해서 원하는 스토리지에 PV를 생성합니다.Retain
: PV의 데이터를 그대로 보존 합니다.Recycle
: 재사용하게될 경우 기존의 PV 데이터들을 모두 삭제 후 재사용 합니다.Delete
: 사용이 종료되면 해당 Volume을 삭제 합니다.apiVersion: v1 kind: PersistentVolume metadata: name: dev-pv spec: capacity: storage: 2Gi volumeMode: Filesystem accessModes: - ReadWriteOnce storageClassName: manual persistentVolumeReclaimPolicy: Delete hostPath: path: /tmp/log_backup
path
: /tmp/log_backupspec.capacity.storage
→ 사용할 용량을 2GB로 설정 합니다.spec.volumeMode
→ Volume을 Filesystem으로 사용 합니다.spec.accessModes
→ Pod의 접근 제어를 합니다.ReadWriteOnce
: 하나의 Pod에서만 읽고 쓸 수 있습니다.ReadOnlyMany
: 여러개의 Pod에서 읽을 수 있습니다.ReadWriteMany
: 여러개의 Pod에서 읽고 쓸 수 있습니다.spec.storageClassName
→ 스토리지 클래스를 지정, 클래스에 맞는 PVC와 연결spec.persistentVolumeReclaimPolicy
→ Delete는 Volume의 사용이 종료되면 Volume을 삭제 합니다. 회수 단계에서 설명한 필드hostPath
→ 노드에 저장되는 디렉토리를 설정 합니다.accessModes
는 Volume의 읽기/쓰기에 관한 옵션을 지정합니다.