[Kubernetes] Volumes

2020. 1. 27. 21:56Engineering/Container&Kubernetes

Contents

1.  Volume의 필요성
2. Volume이란
3. Volume의 종류

 


 

Kubernetes에서 관리하는 자원단위인 Volume의 개념과 종류에 대해 알아봅니다. 


 

1. Volume의 필요성

컨테이너는 컨테이너 이미지를 실행한 형태이죠.

따라서, 컨테이너의 파일 시스템은 컨테이너의 이미지로부터 옵니다.

이러한 이유로 POD 내부의 컨테이너들은 각각 독립된 파일 시스템을 갖습니다.

 

또한! 컨테이너가 재시작되는 경우에도 이미지로부터 컨테이너가 재실행이 됩니다.

따라서, 새로운 컨테이너는 이미지가 빌드 되었던 때의 파일시스템 상태를 로드하게 되어,

이전의 컨테이너에서 작업한 내용은 모두 사라지게 됩니다.

 

조금 자세히 설명 드리자면,

컨테이너는 아래 그림과 같이 층층이 쌓인 layerd 이미지 최상단에 writable 파일시스템을 추가한 형태입니다.

, 이미지를 컨테이너로서 실행시키게 되면 최상단 writable 파일시스템이 추가 됩니다.

그런데 writable 파일 시스템이 Container 삭제되면 같이 지워지므로,

컨테이너 재시작의 경우 이전의 작업내용이 저장되지 않는 것입니다.

 

https://www.freecodecamp.org/news/a-beginner-friendly-introduction-to-containers-vms-and-docker-79a9e3e119b/

 

 

그렇다면, 컨테이너의 재시작 후에도 이전의 작업 내역이 유지되도록 하려면 어떻게 해야할까요?

이를 가능하게 해주는 것이 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 공유하고 있습니다.

 

Kubernetes in action Figure 6.2

 

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 사용하여 구현하기에 무리가 있습니다.