[Kubernetes] Volumes
Contents
1. Volume의 필요성
2. Volume이란
3. Volume의 종류
Kubernetes에서 관리하는 자원단위인 Volume의 개념과 종류에 대해 알아봅니다.
1. Volume의 필요성
컨테이너는 컨테이너 이미지를 실행한 형태이죠.
따라서, 컨테이너의 파일 시스템은 컨테이너의 이미지로부터 옵니다.
이러한 이유로 POD 내부의 컨테이너들은 각각 독립된 파일 시스템을 갖습니다.
또한! 컨테이너가 재시작되는 경우에도 이미지로부터 컨테이너가 재실행이 됩니다.
따라서, 새로운 컨테이너는 이미지가 빌드 되었던 때의 파일시스템 상태를 로드하게 되어,
이전의 컨테이너에서 작업한 내용은 모두 사라지게 됩니다.
조금 더 자세히 설명 드리자면,
컨테이너는 아래 그림과 같이 층층이 쌓인 layerd 이미지 최상단에 writable 파일시스템을 추가한 형태입니다.
즉, 이미지를 컨테이너로서 실행시키게 되면 최상단 writable 파일시스템이 추가 됩니다.
그런데 이 writable 파일 시스템이 Container가 삭제되면 같이 지워지므로,
컨테이너 재시작의 경우 이전의 작업내용이 저장되지 않는 것입니다.
그렇다면, 컨테이너의 재시작 후에도 이전의 작업 내역이 유지되도록 하려면 어떻게 해야할까요?
이를 가능하게 해주는 것이 Kubernetes의 Volume이라는 객체 입니다.
자 그럼 이 Volume에 대해서 알아봅시다.
2. Volume이란
앞서 잠깐 소개 했듯이,
Volume은 컨테이너 재시작 후에도 이전의 작업 내역을 유지하기 위한 Kubernetes의 자원 입니다.
Volume은 POD의 구성 요소입니다.
따라서, POD의 정의 내에 Volume에 대한 Specification을 작성하게 됩니다.
Volume이 갖는 특징은 아래와 같습니다.
2-1) POD 의 생애주기를 따른다.
POD의 생성과 함께 Volume이 생성되며,
POD의 삭제와 함께 Volume이 삭제됩니다.
따라서 POD내의 컨테이너들은 각 컨테이너가 재시작되더라도,
POD가 살아 있는 한 Volume도 살아 있기 때문에,
이전 컨테이너가 Volume에 저장한 데이터를 재시작된 컨테이너가 다시 불러 올 수 있습니다.
2-2) POD 내 Container들과 공유 된다.
Volume은 POD 내 존재하는 Container들 간 공유가 가능합니다.
이때, 항상 모든 Container들이 Volume을 공유하는 것은 아닙니다.
POD 내 각 Container들 마다 Volume에 대한 mount 여부를 결정해주어야 합니다.
따라서, POD 내 Container 간 공유하는 Volume을 다르게 설정할 수 있습니다.
아래 그림의 예시를 보면,
하나의 POD 안에 WebServer, ContentAgent, LogRotator라는 3개의 컨테이너가 있고,
publicHtml, logVol 이라는 2개의 Volume이 있습니다.
WebServer와 ContentAgent라는 컨테이너는 publicHtml Volume을 함께 공유하며,
동시에 WebServer와 LogRotator라는 컨테이너는 logVol Volume을 공유하고 있습니다.
3. Volume의 종류
Kubernetes의 Volume에는 정말 정말 다~양~한 종류들이 있습니다.
Volume의 '종류'라고 하면, POD에 생성되는 Volume이라는 객체가 갖는 스토리지 특성 'type' 입니다.
Volume의 종류에 따라 POD와 Volume이 삭제된 후에도 Volume 내의 파일들이 유지되거나 삭제될 수 있습니다.
대표적인 몇가지 Volume의 종류들만 소개하도록 하겠습니다.
3-1) emptyDir
이름 그대로 비어있는 경로를 POD에 제공하는 Volume으로, 가장 대표적인 Volume 종류 입니다.
emptyDir Volume을 위한 스토리지 공간은 해당 Volume을 마운트한 POD가 실행중인 노드의 disk에서 제공됩니다.
따라서, emptyDir Volume의 성능은 노드의 disk 성능에 의존성을 갖습니다.
그러나 emptydir는 POD의 생애주기에 따르는 Volume으로, POD가 삭제되면 Volume의 내용도 사라집니다.
따라서, POD 내 컨테이너들 간 파일 공유를 위해 주로 쓰입니다.
3-2) hostPath
hostPath는 이름 그대로, 노드의 파일시스템을 제공하는 Volume입니다.
노드 파일시스템의 특정 경로를 Volume으로 지정하여 POD에 마운트 가능하며,
이 경우 해당 노드 파일시스템 경로에 저장되어 있던 파일을 POD내 컨테이너들이 불러 올 수 있습니다.
따라서 노드 내 저장된 파일을 POD들 간 공유해야하는 상황에서 주로 사용됩니다.
emptyDir도 노드의 disk 공간을 제공한다는 점에서 hostPath와 동일하다 느끼실 수 있습니다.
그런데, 이 두 Volume에는 아주 큰 차이점이 있습니다.
바로 hostPath는 Persistent Volume이라는 것입니다.
emptyDir는 POD의 삭제에 따라 Volume의 내용도 사라진다고 했었죠.
그렇지만 hostPath는 POD가 삭제되더라도 Volume의 내용이 사라지지 않는 Persistent (영구적인) volume 입니다.
hostPath 외에 다른 Persistent Volume (PV) 도 많지만, 이 hostPath가 가장 대표적인 PV 입니다.
hostPath를 사용하실 때 주의할 점은.
Volume의 데이터가 특정 노드에 저장되어 있다는 사실입니다.
POD가 위치하는 노드가 바뀌면 이전 노드에 저장되어 있던 hostPath Volume의 데이터를 불러오지 못합니다.
(아래 그림과 같이 Registry POD가 WorkerNode#1에서 WorkerNode#2로 이동된 경우, 이전에 WorkerNode#1에 저장되어 있던 이미지 데이터들을 불러오지 못합니다.)
그러므로, 일반적인 Database를 hostPath Volume을 사용하여 구현하기에 무리가 있습니다.