쿠버네티스에는 다양한 볼륨관련 리소스들이 있습니다.
이에 대해 헷갈리지 않도록 간단하게 정리하는 글입니다.
Volume
쿠버네티스를 사용하다보면, 헷갈리는 것 중 하나입니다.
PV, PVC, Storage Class + GCP의 PD까지 너무 헷갈리는 용어들이 나옵니다…
이러한 기본적인 개념을 한번에 정리하고자 합니다.
TMI - 저같은 경우 GCP의 PD가 당연히 PV랑 같은 말인줄 알았습니다…
사용하는 이유
“저런 것들을 왜 사용할까요..?”
“컨테이너 내의 저장공간으로 사용하면 되지 않을까요..? “ 이러한 의문을 던질 수 있습니다.
첫번째 이유는 안정성
입니다.
클라우드 공부를 하면서 가장 많이 보는 단어 중 하나는 안정성인 것 같습니다.
컨테이너의 디스크는 임시적입니다. 컨테이너가 종료되면 디스크 안의 내용도 사라지게 됩니다.
일회성으로 운영되는 저장공간이라면 상관없지만, 사용해야 하는 데이터가 사라지만 치명적이게 됩니다.
만약, 예상하지 못한 오류가 발생하여 Pod이 다시 실행된다면…? - 끔직합니다.
다른 문제점으로는 컨테이너간 파일 공유
입니다.
컨테이너 내부 저장공간을 사용하면 다른 컨테이너에서 사용할 수 없습니다.
이러한 문제점을 해결하기 위해 Volume 이라는 개념이 등장하게 됩니다.
PV ( Persistent Volume )
이름을 보면 느껴지겠지만, 지속되는 볼륨입니다. 파드 내의 컨테이너가 삭제되든, 재시작되든 PV는 별도의 라이프사이클을 가집니다.
Kubernets Docs를 보면 PV는 node에 속해있는 자원이 아닌, node와 같은 클러스터의 자원중 하나라고 언급하고 있습니다.
즉, 서로 다른 Pod뿐만 아니라, 서로 다른 Node도 하나의 PV를 사용할 수 있습니다.
이러한 PV는 관리자가 직접 프로비저닝 하는 방법과, 이후 설명할 Storage Class를 이용해서 동적 프로비저닝 하는 두가지 방법으로 생성되게 됩니다.
PVC ( Persistent Volume Claim )
PVC는 사용자의 스토리지에 대한 요청입니다. “나는 어떤 PV를 얼마만큼 사용할 꺼야.” 라고 생각하면 편합니다.
PVC는 PV 리소스를 사용하며, 특정 수준의 리소스를 요청합니다. 또한 접근 모드 (RWO, ROM, RWM)를 설정 할 수 있습니다.
하지만 PVC를 바로 PV로 바인딩 하지 않고 중간에 스토리지 클래스를 사용하는데, 이유는 PVC를 통해 PV를 바로 호출하면, 일부를 가져오는 형식이 아닌 모든 PV를 가져오고 일정부분만 사용하게 되는 형식으로 여러 PVC에서 하나의 PV를 사용하지 못한다는 문제를 해결하기 위해서입니다.
많은 강의에서 피자를 예제로 설명합니다. PV 및 Storage Class를 연결하는 것은, 피자 한조각을 가져오는 것이고, PVC하나만 연결해서 사용하는 것은, 피자한판을 다 가져오는 행위라고 설명합니다.
PV & PVC 라이프 사이클
- 프로비저닝
-
정적 프로비저닝
정적 프로비저닝은, 사전에 생성된 실제 스토리지에 PV를 연결하는 방식입니다. ex) GCP Persistent Disk를 미리 생성하고, 이를 PV로 연결
-
동적 프로비저닝
동적 프리비저닝은, 정적 프로비저닝을 사용하도록 실제 스토리지를 정의하지 않았을 때, 스토리지 클래스를 기반으로 동적으로 스토리지 프로비저닝을 진행합니다.
-
- 바인딩
- 사용자의 요청에 따라, 원하는 특정 용량 및 접근 모드로 PVC를 생성하거나 동적 프로비저닝이 완료된 상태입니다.
- 새로운 PVC가 요청되면, 할당 가능한 PV가 있으면 이를 할당하고 없으면 생성하여 바인딩합니다.
- 기존에 연결되었던 PVC가 있다면, 항상 해당 PV에만 바인딩합니다.
- 만약 일치하는 볼륨이 없다면, 무한정 바인딩되지 않는 상태로 머물수 있다.
- 사용자의 요청에 따라, 원하는 특정 용량 및 접근 모드로 PVC를 생성하거나 동적 프로비저닝이 완료된 상태입니다.
- 사용 중
- 일반적으로 파드는 PVC를 볼륨으로 사용합니다. 클러스터는 클레임을 검사하여 바인딩된 볼륨을 찾고 볼륨을 파드에 마운트합니다.
- Reclaiming (반환)
- 사용자가 볼륨을 다 사용하고 나면 리소스를 반환할 수 있는 API를 사용하여 PVC를 삭제한다.
- Retain (보존)
- PVC가 삭제되어도, PV는 여전히 존재하여 릴리스 된 것으로 간주
- Delete (삭제)
- 쿠버네티스에서 PV 및 외부 인프라(AWS EBS, GCE PD 등)의 관련 된 자산을 모두 삭제한다.
- Recycle (재활용)
- 더 이상 사용하지 않음
Stroage Class
스토리지 클래스는, PVC와 PV를 연결하는 역할을 합니다.
PV를 이용한 구성을 보면, PV가 생성되어 있어야 PVC를 연결할 수 있습니다. 이를 위해서 충분한 용량의 PV를 만들고 이를 PVC를 통해서 할당하는 방법을 사용합니다.
하지만 Cloud 환경에서 운영하는 상황에서는 Storage Class를 통해 동적 프로비저닝을 할 수 있으므로, 위와같은 상황을 구현할 필요없이 필요할 때마다 용량을 증가 시킬 수 있습니다.
이 외에도, 스토리지 클래스를 통해 얻을 수 있는 많은 이점이 있습니다. ( PV 동시에 사용 등 )
Hard Disk
마지막으로 클라우드 환경에서 운영하는 실제 디스크 or 하드디스크입니다.
이는 실제 데이터를 저장하는 공간입니다.
PV랑 비교했을 때, 다른 듯하면서도 비슷합니다. ( 정확히 따지자면 하드디스크를 PV와 연결해서 PV가 하드디스크의 용량을 사용하는? 구조입니다. )
많이 사용되는 구조
Hard Disk - PV - Storage Class - PVC - POD
미리 정적으로 용량을 설정해 두고 사용하는 구조
AWS 및 GCP 같이 Public Cloud를 사용한다면?
Storage Class - PVC - POD의 구조를 많이 사용합니다.
동적 프로비저닝을 통해 필요한 용량만큼 사용하는 구조
(PV를 생성하지 않는 것이 아니라, Kubernetes가 알아서 생성)