Application 기능으로 이해하기-PVC/PV, Deploym... #7-3

Application 기능으로 이해하기-PVC/PV, Deploym... #7-3

해당 블로그는 [쿠버네티스 어나더 클래스] 강의에 일부 내용입니다. 많은 관심 부탁 드려요!


 

테스트 환경에서 통상 노드를 임시 스토리지 볼륨으로 많이 사용합니다.

이때 hostPath를 쓰거나 PV local 속성을 쓰는데, 그러다보니 이 기능들이 임시저장 용도 인줄 오해하는 사람들이 많아요. 이번 블로그에서 자세히 얘기 해볼게요!

 

PVC, PV


image

 

image

여기까지는 이전 시간에 배워서 익숙한 그림이죠? 근데 이번엔 볼륨에 Secret이 아닌 PVC를 연결합니다. 그러면 PVC에 resource, accessModes와 같은 속성이 있고 PV에도 비슷한 내용이 있는데, 이번 강의에서는 이 내용이 실제 볼륨 속성으로 적용되지는 않아요. 필수 값이라서 넣은 거고, Sprint3 에서 자세히 다룰 겁니다.

근데 쓰이진 않더라도 이 두 속성이 같은 값으로 들어가져 있긴 해야되요. 현재 이 두 오브젝트는 selector랑 label로 연결이 되어 있지만, 두 속성의 내용이 같지 않으면 연결이 안되거든요.

 

image

이제 본격적으로 배울 내용으로 local 이라는 속성이 있고, 내용으로는 path가 들어가는데 이 속성이 어떻게 노드를 스토리지로 사용할 수 있게 되는지 설명을 드릴게요.

local을 쓰면 필수로 nodeAffinity라는 속성을 꼭 사용하게 되어 있고, 이게 어느 노드에 Pod를 생성 할 건지를 정하는 속성인데 좀 복잡해 보일순 있지만, PV의 local을 쓸 때, 사용하는 루틴이라고 생각을 하시고 색이 있는 내용만 잘 보면 어떻게 쓰는지 직관적으로 알 수가 있죠.

제 주관적인 견해지만, 한줄 한줄 여러 케이스를 설명해봤자 어차피 자주 변경해서 쓸 일이 없으면 금방 까먹거든요. 그래서 이 상황에서는 이렇게 그냥 통으로 쓰는 게 편하기도 하고, 자세히 설명을 드리면 중요한 거라고 생각하실까봐 이 정도로 넘어가는 거예요.

 

image
우리가 마스터 노드를 만들 때, 기본적으로 Node라는 오브젝트가 만들어지고 label이 달려 있어요. 만약에 여러 워커노드를 만든다면, 각각 label이 달려 있을 거구요. 이 nodeAffinity 속성이 있는 PV에 연결된 Pod는 이 노드 위에 만들어지게 됩니다.

테스트 환경에서 별도의 스토리지를 구축하기가 번거롭기 때문에 쿠버네티스 노드중에 한 곳을 임시 스토리지로 정해놓고 쓰는거고 쿠버네티스가 노드의 path와 컨테이너 path를 연결을 해줘요. 그리고 마스터 노드의 이 path를 만들어 놓고 Pod가 다른 노드에 생성되면 안되니까 nodeAffinity라는 속성이 꼭 필요합니다.

 


image

그리고 근본적으로 이렇게 PVC와 PV를 써서 별도의 스토리지 공간을 만들어 놔야 되는 이유는, App이 컨테이너 안에다가만 파일을 저장해 놓으면 Pod가 죽었을 때, 파일도 같이 삭제가 되서 그래요. 물론 그래도되는 임시파일이면 상관이 없는데 영구적으로 보관해야 되는 파일이면 Pod가 죽었다 다시 만들어지더라도 기존의 파일들을 그대로 볼 수 있어야 겠죠?

그래서 PVC, PV를 사용하면 컨테이너 path 에다가 파일을 만들면 실제 파일은 노드에 저장이 되고 이 파일은 Pod가 죽더라도 데이터는 유지가 되기 때문에 새 Pod가 만들어지면 쿠버네티스가 기존과 똑같이 path를 연결하고 새로 만들어진 App은 기존의 파일들을 그대로 볼 수가 있게 됩니다.

 


image

사실 PVC와 PV를 설명 드리려고 이 속성을 쓴 거지 더 쉬운 방법이 있어요!

바로 Pod에 볼륨으로 hostPath 라는 속성을 쓰는 건데, 이렇게 똑같이 path를 지정할 수 있는 내용이 있고요. Pod에 nodeSelector라는 속성을 주면 똑같이 노드를 지정할 수가 있거든요. 그래서 이렇게 쓰는게 더 간결하기도 하고 더 많이 써요

 

image
주의사항이 있습니다.

이건 쿠버네티스 문서 내용을 그대로 가지고 온 거고요. 이렇게 [가능하면 hostPath를 사용하지 않는 게 좋다] 라는 경고가 있거든요. 테스트용으로 쓰기 편해서 이 속성을 저장 용도 라고 생각하기 쉬운데, 원래는 노드에 있는 정보를 App이 조회하는 용도로 쓰는 거에요.

 

image

예를 들어, 우리가 지금까지 Grafana에서 Loki를 통해서 모든 App들의 로그를 봤었잖아요? 실제 Pod들의 log는 노드에 이 path로 저장이 되고 있고, Loki의 promtail이라는 Pod가 hostPath로 이 경로를 조회하고 있었기 때문에 우리는 모든 Pod의 log들을 Loki를 통해서 볼 수 있었던 거예요. 그래서 여기에 필요한 파일 또는 디렉토리 범위만 정하고 ReadOnly로 마운팅 하라고 써있는 거구요.

그래서 hostPath는 노드의 정보를 이용해야 되는 기능의 App인 경우에 사용하라는 거고, 그래도 테스트 환경에서는 간단하게 쓸 스토리지가 있으면 편하기 때문에 임시 저장용으로 많이 써요

 

image
쿠버네티스 개념적으로 Pod를 만드는 주체는 개발자예요. 볼륨 솔루션들에는 여러가지가 있고 각각의 기능에 따라서 써야되는 속성도 달라지기 때문에, 개발자가 Pod를 만들면서 이것까지 신경쓰는건 좀 아니라고 생각을 한거죠. 그래서 인프라 담당자가 볼륨 솔루션들을 관리하는 컨셉으로 PV라는 오브젝트를 만드는 거고요. PVC는 Pod에서 필요한 자원을 요청하는 용도로 개발자가 만드는데, 이렇게 인터페이스 역할을 해주는 게 있어야지 PV 에 솔루션이 변경되더라도 Pod까지 손을 대는 일은 없어지게 됩니다.

그래서 PVC와 PV라는 오브젝트가 있는 건데, 현재는 모두가 쿠버네티스를 다 아는 게 아니기 때문에 개발자와 인프라 담당자 할 것 없이 그냥 쿠버네티스를 아는 사람이 다 하고 있어서 이런 컨셉이 와닿지는 않을 거예요 :)

 

Deployment


image

RollingUpdate만을 가지고 Recreate와 Blue/Green에 가까운 효과를 낼 수가 있습니다. 강의 영상에서 저도 종종 사용하는 방법을 공유 드려요.

Service


image

쿠버네티스에서 Service에 대한 개념을 잡는게 가장 어려운데, 이유는 이 Service가 해주는 역할이 많아서 그래요. 강의 영상에서 각각 무슨 역할들을 하는지 설명 드려요.

 

HPA


image

CPU에 대한 [이상적인 스케일링] 그래프는 사실 "쿠버네티스를 쓰면 자동으로 스케일링도 해주고 좋아요"라는 홍보를 할 때나 볼 수 있는 내용입니다. 영상에서는 [현실적인 스케일링] 상황에 대해서 말씀드려요.

 

 


ps. make me want to be a better man :)

 

댓글을 작성해보세요.