데이터베이스처럼 포드 내부에서 특정 데이터를 보유해야 하는, 상태가 있는(stateful) 애플리케이션의 경우에는 데이터를 어떻게 관리할지 고민해야 한다. 이를 해결하기 위해 포드의 데이터를 영속적으로 저장하기 위한 방법이 필요하다.
쿠버네티스에서는 호스트에 위치한 디렉터리를 각 포드와 공유함으로써 데이터를 보존하는 것이 가능하다. 그러나 여러 개의 서버로 구성된 쿠버네티스와 같은 클러스터 환경에서는 이 방법이 적합하지 않을 수 있다.
따라서 어느 노드에서도 접근해 사용이 가능한 퍼시스턴트 볼륨(Persistent Volume)을 사용한다!
퍼시스턴트 볼륨은 워커 노드들이 네트워크 상에서 스토리지를 마운트해 영속적으로 데이터를 저장할 수 있는 볼륨이다. 따라서 포드에 장애가 생겨 다른 노드로 옮겨가더라도 해당 노드에서 퍼시스턴트 볼륨에 네트워크로 연결해 데이터를 계속 사용할 수 있다.
퍼시스턴트 볼륨의 대표적인 예로는 NFS, AWS의 EBS, Ceph, GlusterFS 등이 있다.
🌐 네트워크 볼륨
온프레미스 환경에서도 구축할 수 있는 NFS, iSCSI, GlusterFS, Ceph와 같은 네트워크 볼륨 뿐 아니라 AWS의 EBS, GCP의 gcePersistentDisk와 같은 클라우드 플랫폼의 볼륨을 포드에 마운트할 수도 있다.
🌻 NFS
NFS(Network File System)는 대부분의 운영 체제에서 사용할 수 있는 네트워크 스토리지로, 여러 개의 클라이언트가 동시에 마운트해 사용할 수 있다는 특징이 있다.
실제 운영 환경에서 NFS 서버를 도입하려면 백업 스토리지를 별도로 구축해 NFS의 데이터 손실에 대비하거나 NFS 서버의 설정 튜닝 및 NFS 서버에 접근하기 위한 DNS 이름을 준비해야 한다. 이러한 설정들은 환경에 맞게 적절히 구성할 필요가 있다.
볼륨과 애플리케이션의 정의는 서로 밀접하게 연관되어 있어 서로 분리할 수 없는 상황이 될 수 있다.
이러한 불편함을 해결하기 위해 PV와 PVC 오브젝트를 함께 사용한다.
이 두 오브젝트는 포드가 볼륨의 세부적인 사항을 몰라도 볼륨을 사용할 수 있도록 추상화해주는 역할을 담당한다.
→ 사용자는 디플로이먼트의 YAML 파일에 볼륨의 상세한 스펙을 정의하지 않아도 된다!
🍕 퍼시스턴트 볼륨을 선택하기 위한 조건 명시
적어도 특정 조건을 만족하는 볼륨만을 사용한다는 것을 퍼시스턴트 볼륨 클레임을 통해 쿠버네티스에 알려주어야 한다.
애플리케이션에서 사용하기 위한 볼륨의 조건을 만족하는 것이 중요 (실제 볼륨의 종류는 중요 X)
퍼시스턴트 볼륨의 사용이 끝나 퍼시스턴트 볼륨 클레임을 삭제했을 때, 해당 볼륨과 볼륨의 데이터를 어떻게 처리할 것인지 별도로 설정할 수 있다.
이를 Reclaim Policy라고 부르는데, Reclaim Policy는 크게 Retain, Delete, Recycle 방식이 있다.
[출처] 시작하세요! 도커/쿠버네티스 (용찬호 지음)