본문 바로가기
k8s

Kubernetes 스토리지 구조

by marble25 2023. 3. 26.

Kubernetes에서는 영속적인 저장 공간을 저장하는 방법으로 Persistent Volume을 사용한다.

Persistent Volume은 StorageClass를 속성으로 가지게 된다.

Pod는 Persistent Volume(pv)과 Persistent Volume Claim(pvc)으로 1:n 관계로 매핑되어 사용한다.

정리하자면 다음과 같다.

하나의 StorageClass로 다양한 PV를 만들 수 있다.

PV - PVC - Pod의 관계는 1:1 대응으로, 하나의 PV에 하나의 PVC, 하나의 PVC에 하나의 Pod가 매핑되는 관계이다.

StorageClass

https://kubernetes.io/ko/docs/concepts/storage/storage-classes/

 

스토리지 클래스

이 문서는 쿠버네티스의 스토리지클래스의 개념을 설명한다. 볼륨과 퍼시스턴트 볼륨에 익숙해지는 것을 권장한다. 소개 스토리지클래스는 관리자가 제공하는 스토리지의 "classes"를 설명할 수

kubernetes.io

StorageClass에는 프로비저닝할 볼륨에 대한 정보를 담고 있다. 이 볼륨은 네트워크 볼륨일 수도, 클라우드 볼륨일 수도, 로컬 볼륨일 수도 있다.

지원되는 볼륨 종류는 다음과 같다.

스토리지 클래스에 다양한 볼륨을 설정할 수 있다. 눈에 띄는 것은 AWS EBS와 GCE PD, NFS, Local 등이 있다. 클라우드 볼륨, NAS, 로컬 볼륨을 사용할 수 있다.

Persistent Volume / Persistent Volume Claim

https://kubernetes.io/ko/docs/concepts/storage/persistent-volumes/

 

퍼시스턴트 볼륨

이 페이지에서는 쿠버네티스의 퍼시스턴트 볼륨 에 대해 설명한다. 볼륨에 대해 익숙해지는 것을 추천한다. 소개 스토리지 관리는 컴퓨트 인스턴스 관리와는 별개의 문제다. 퍼시스턴트볼륨 서

kubernetes.io

PV는 관리자가 수동으로 프로비저닝하거나 스토리지 클래스를 이용해서 동적으로 프로비저닝한 클러스터의 스토리지이다. 정적 프로비저닝 관리자가 직접 PV를 생성하는 경우를 말한다. 이와 다르게, 동적 프로비저닝은 이미 생성된 정적 PV가 사용자의 PVC와 일치하지 않으면 클러스터가 PVC를 위해 볼륨을 동적으로 만들어 준다. PVC는 스토리지 클래스를 요청해야 한다.

PVC는 사용자의 스토리지에 대한 요청으로 PV의 리소스를 사용하게 된다.

  • 바인딩

사용자가 생성한 PVC에 대해 컨트롤러는 PVC의 조건에 일치하는 PV를 찾아 바인딩해준다. 일치하는 볼륨이 없는 경우 클레임은 무한정 바인딩되지 않은 상태로 남아있다. 예를 들어 50Gi PV로 프로비저닝된 클러스터는 100Gi를 요청하는 PVC와 일치하지 않는다. 이 경우 PVC와 연결된 pod도 볼륨을 마운트하지 못했기 때문에 시작되지 못한 상태로 남아있다.

  • 사용중인 스토리지 오브젝트 보호

사용자가 파드에서 사용중인 PVC를 삭제하면 PVC는 즉시 삭제되지 않는다. PVC가 파드에 마운트되지 않는 시점까지 PVC 삭제가 연기된다. 이때, PVC의 상태가 Terminating으로 변하게 된다. 또한, 관리자가 PVC에 바인딩된 PV를 삭제하면 PV는 즉시 삭제되지 않는다.

  • Retain 정책

PVC가 삭제되더라도 PV는 여전히 존재하고, 볼륨은 릴리즈된 상태로 남아있게 된다. 그러나 이전 요청자의 데이터가 볼륨에 남아있기 때문에 다른 요청에 대해서는 사용할 수 없다. 이런 경우 PV를 삭제 후 재생성하는 방법으로 다시 사용할 수 있게 된다.

동일 PV에 대해 PVC를 재할당하려는 경우 다음 명령어를 사용해 볼 수 있다.

kubectl patch pv <pv명> -p '{"spec":{"claimRef": null}}'

PV와 연결된 PVC 정보가 삭제되면서 다른 PVC를 연결할 수 있는 상태가 된다.

  • Node Affinity

해당볼륨이 마운팅될 노드를 지정한다. 다이나믹 프로비저닝이 아닌, 관리자가 직접 PV를 할당해 주는 경우(주로 로컬 PV) 어떤 PV가 어떤 노드에 들어갈지를 노드 어피니티를 통해 지정할 수 있다.

  • Phase
    • Available(사용 가능) -– 아직 클레임에 바인딩되지 않은 사용할 수 있는 리소스
    • Bound(바인딩) –- 볼륨이 클레임에 바인딩됨
    • Released(릴리스) –- 클레임이 삭제되었지만 클러스터에서 아직 리소스를 반환하지 않음
    • Failed(실패) –- 볼륨이 자동 반환에 실패함

StorageClass, PV와 PVC 사이에 중요한 차이점이 하나 있다. StorageClass와 PV는 namespace가 존재하지 않지만, PVC는 namespace가 존재한다는 점이다. 그 말은 StorageClass와 PV는 클러스터 레벨의 자원이기 때문이다. 즉, StorageClass와 PV는 인프라 팀이 관리를 담당하는 반면, PVC와 Pod는 사용자, 개발팀이 관리를 담당할 수 있다는 뜻이다.

'k8s' 카테고리의 다른 글

[TIL] regcred 알아보기  (0) 2023.04.24
K8S 컴포넌트 정리  (0) 2023.03.31
Kubernetes에서 NAS 사용하기  (0) 2023.03.26
[TIL] pod에서 서비스 접속하기  (0) 2022.07.10
Minikube, Kubeadm, Kind, K3S  (0) 2022.05.08