새소식

Recent Study/Kubernetes 학습과정

5. Volume - emptyDir, hostPath, PV/PVC & 실습

  • -

 

1. emptydir

 : 컨테이너들끼리 데이터를 공유하기 위해 볼륨을 사용하고, 최초 이 볼륨이 생성될 때 볼륨안에 내용이 비어 있기 떄문에 emptyDir이라고 명칭이 된 것입니다. 만약 컨테이너 1번이 웹 역할을 하는 서버, 컨테이너 2번이 백엔드단을 처리해주는 서버라면 이 웹서버로 받은 어떤 특정 파일을 마운트가 된 볼륨에 저장하고, 백엔드단에 있는 2번 컨테이너 역시 이 볼륨을 마운트 해놓으면 이 두 서버가 이 볼륨을 자신의 로컬에 있는 파일처럼 사용하기 때문에 두 서버가 파일을 주고 받을 필요없이 편하게 사용할 수 있습니다.

 

볼륨은 Pod안에 생성 되기 때문에, Pod 문제가 발생해서 재생성 되면 데이터가 모두 없어진다는 것을 의미합니다. 그래서 이 볼륨에 쓰이는 데이터는 꼭 일시적인 사용 목적에 의해서만 사용하는게 좋습니다.

 

 

2. hostPath

: 이름 그대로 한 호스트, 이 Pod들이 올라가져 있는 Node의 Path 볼륨으로써 사용하는 것 입니다. 1)과 다른 점은 Node의 패스를 각각의 Pod가 마운트해서 공유하기 때문에, Pod가 죽어도 Node에 있는 데이터는 사라지지 않습니다. 좋아보이지만 Pod 입장에서 한가지 문제가 있습니다. 만약 Pod2가 죽었을 때 꼭 해당 Node에 재생성 된다는 보장이 없습니다. 만약 재생성 되는 순간 스케줄러가 자원 상황을 보고 노드2의 Pod를 만들어 줄수도 있고, 또 Node1에 장애가 생겨 다른 노드에 파드가 옮겨질 수 있습니다. 그래서 Node1의 Pod2가 Node2로 옮겨졌을 때  Pod2는 Node1에 있는 볼륨을 마운트 할 수 없게 됩니다.

 

 hostPath이기 때문에 자신의 Pod가 올라가져 있는 본인의 Node의 볼륨만 사용을 할 수가 있습니다. 굳이 방법을 찾는다면 Node2가 추가 될 때마다 똑같은 이름의 경로를 만들어서 직접 Node에 있는 Path끼리 마운트를 시켜주면 문제가 없어지겠습니다. 하지만 이것은 k8s가 해주는 역할이 아니고 운영자가 직접 노드가 추가될 때마다 리눅스 시스템 별도의 마운트 기술을 사용해서 연결을 해줘야 합니다. 뭔가를 자동화시키는데 사람의 개입이 들어가는 것이 실수를 발생할 여지를 주기 때문에 이런 방법은 추천드리지 않습니다.

 

 그래서 어떨때 사용하면 각각의 노드에는 각 Node 자신을 위해 사용되는 파일이 있습니다. 시스템 파일, 여러 설정 파일들이 있는데 Pod 자신이 할당되어 있는 호스트의 데이터를 읽거나 써야될 때 사용하면 됩니다. 즉 Pod에 데이터를 저장하기 위한 용도가 아니라 노드에 있는 데이터를 Pod에서 사용하기 위한 용도로 사용하면 됩니다.

 

 

3. PVC / PV (Persistent Volume Claim / Persistent Volume)

 : PVC / PV가 Pod에 영속성 있는 볼륨을 제공하기 위한 개념입니다. 실제 볼륨들의 형태는 다양합니다. 로컬 볼륨도 있고, 원격 볼륨도 있습니다. 이런 것들을 각각 PV을 정의하고 연결을 합니다. Pod는 이 PV에 바로 연결하지 않고, PVC를 통해서 PV와 연결이 됩니다. 왜 중간에 PVC를 두나면, k8s는 이 볼륨 사용에 있어서 User, Admin 영역을 나눴습니다. Admin 영역은 k8s를 담당하는 k8s 운영자일 거구요. User는 Pod의 서비스를 만들고 배포를 관리하는 서비스 담당자일 것 입니다. yaml 파일의 다양한 속성을 관리하는 Amin이 PVC를 만들어 놓으면 User는 이걸 사용을 하기 위해 PVC를 만들어야 하는데 PVC를 만들기 위해 볼륨을 할당하고 요청을 해줍니다. 

정리하면 최초 Admin이 PV를 만들어놓고, 사용자가 PVC를 만들면 k8s가 PVC 내용에 맞는 적절한 볼륨에 연결해줍니다. 그리고 Pod를 만들 때 이 PVC를 사용하면 됩니다.

 

 

실습

1. emptyDir

2 컨테이너가 선정한 Path를 통해 한 볼륨에 접근하는 것을 확인해볼 것 입니다. 아래와 같이 입력 후 확인해보면 Pod에 pod-volume-1이라는 것이 생성된 것을 확인할 수 있습니다.

 

 

 해당 쉘은 pod-volume-1의 컨테이너 1입니다. 컨테이너1에 mount1이라는 폴더가 만들어진 것을 확인할 수 있고, 여기에 file.txt라는 파일을 만들어 본 후 컨테이너 2에서 확인해보겠습니다. 그러면 아래와 같이 컨테이너2에 mount2로, 컨테이너1에서 만든 file.txt 존재를 확인할 수 있습니다. 그리고 pod-volume-1을 삭제 후 재생성하면 mount1안에 존재했던 txt파일은 날아가게 됩니다.

 

 

 

2. hostPath

 yaml 내용은 이 Pod는 Node1에 생성할거고, 이 컨테이너에서 접근할 mountPath는 mount1이고, mount 할 볼륨의 이름은 host-path입니다. 그래서 host-path에 정의되어 있는 볼륨을 확인하면 hostParh 아래 경로와 tpye이 있습니다. type의 DirectoryOrCreate는 만약 노드에 해당 Path가 없으면 직접 생성하겠다는 것 입니다.

 위를 pod-volume-2, 3를 만들었을 때 결과로 2개의 Pod는 node1에 node-v 디렉토리를 공유해야 합니다. pod-volume-3 에서 mount1에 txt 파일을 생성하고, pod-volume-2에서 해당 파일이 존재하면 성공입니다. 또한 node-1 위에 경로가 node-v라면 옳게 된 것입니다. 결과로 아래는 잘 만들어졌죠??

pod-volume-3 새로운 txt 생성

 

 추가로 Pod를 삭제하고 다시 만들더라도, node1에 hostPath는 그대로 있기 때문에, 파일은 그대로 존재할 수 있게 됩니다. 하지만 만약 Pod를 생성할 때 Node를 지정하지 않고 만든다면? 스케줄러가 자원 상황상 node-1이 아닌 node-2에 새로 만든 Pod를 만들 것 입니다. 컨테이너로 들어가 보면 만들었던 txt파일은 존재하지 않게 됩니다.

 

 

3. PVC / PV

 

 각각 이름과 용량을 다르게, accessModes를 바꿔서 3개의 PV를 만들었습니다. PVC로 위와 같이 만든다면 pv-01이 바운드 된 것을 확인할 수 있습니다. 그리고 이렇게 한번 PV는 바인딩 되면 다른 클레임에서 사용할 수 없습니다.

 

 PV의 실체는 hostPath와 같은 성격의 로컬 볼륨인데 상세 내용은 나중에 다루겠습니다. 중요한 것은 이 PV에 연결되는 Pod들은 k8s-node1에 만들어지는 것만 알고 계시면 됩니다.

추가 PVC

 

 위 PV에서 local의 path를 /node-v 로 했고, k8s-node1으로 설정했습니다. 위의 결과로 PV 3개 생성이 되었고, 각 PVC에 맞는 PV가 바운드 되었습니다. 그리고 Pod를 생성 후 pvc-01과 연결한 후 해당 pod인 pod-volume-5로 들어가본다면, mount3 폴더가 존재하고, 이 안으로 들어가게 되면 hostPath에서 실습을 진행했던 해당 txt 파일을 아래와 같이 존재하는 것을 확인할 수 있습니다.

Contents

포스팅 주소를 복사했습니다

이 글이 도움이 되었다면 공감 부탁드립니다.