본문 바로가기
공부/Kubernetes

[k8s/aws] 쿠버네티스에서 AWS EBS를 볼륨으로 사용할 수 있기까지

by haejang 2023. 7. 26.
728x90
728x90

 

본 글은 설명하고자 하는 전체 과정을 러프하게만 설명하며,

각 리소스들에 대한 상세한 설명 및 만드는 방법 등은 모두 생략합니다.

 

 

# PV, PVC - 쿠버네티스에서의 볼륨

쿠버네티스에서 앱들은 pod 형태로 올라가며, 각 pod에는 1개 이상의 컨테이너가 돌아갑니다.

컨테이너 내 디스크에 존재하는 파일은 유실될 가능성이 높으며, 다른 pod 내 컨테이너와 공유할 수 없습니다.

-> 쿠버네티스 클러스터 상의 볼륨 리소스를 사용해 같은 배포 내의 pod들이 같은 볼륨을 바라볼 수 있어야 합니다.

 

먼저 임시 볼륨 (ephemeral volume) 이 있습니다. 임시 볼륨으로도 파드 재시작 시의 데이터 보존은 가능하지만, 데이터의 영구 보존은 불가합니다.

그치만 영구 보존... 필요하죠?

필요한 경우, PV와 PVC라는 두 가지 API 리소스를 사용하게 됩니다.

PV : Persistence Volume. 클러스터 안에서 사용할 수 있는 볼륨 자체를 뜻합니다.

PVC : Persistence Volume Claim. PV를 요청하는 API 입니다. 크기와 타입 등을 지정하면 쿠버네티스는 가장 적절한 PV를 찾아서 할당해줍니다.

 

PV는 직접 생성할수도 있고 (정적 프로비저닝), PVC에 의해 생성될 수도 있습니다. (동적 프로비저닝)

귀찮은게 싫은 우리는 당연히 동적 프로비저닝을 원합니다. 이를 위해선 PVC 생성 시 StorageClass를 지정해줘야 합니다.

 

# StorageClass - 쿠버네티스 볼륨에서 사용할 스토리지 종류

그냥 PV에서 사용할 실제 Storage에 대한 명세라고 생각하시면 됩니다.

로컬 볼륨 또한 SC로 정의해둘 수 있습니다. 그러나 로컬 볼륨은 한계가 있죠. 따라서 쿠버네티스 밖의 다른 물리 스토리지를 사용하고 싶습니다. > 가장 만만한 AWS의 EBS를 사용하겠습니다.

(EKS의 경우, defualt sc로 gp2 type의 ebs sc가 생성되어 있습니다.)

 

아무튼, PVC 생성 시 storageClassName에 클러스터 내에 존재하는 StorageClass의 이름만 넣어준다면, 자동으로 해당 sc에 맞는 스토리지와 그를 사용하는 PV가 생성되며 PVC와도 연결됩니다.

음...근데 로컬 볼륨이면 알겠는데, AWS EBS를 SC로 사용하는 경우, 쿠버네티스가 어떻게 EBS Volume을 생성할 수 있나요?

-> EBS 용 CSI Driver를 설치해줘야 합니다.

 

# CSI Driver?

먼저 CSI란, k8s같은 컨테이너 오케스트레이션 시스템(이하 CO)과 스토리지를 제어하는 플러그인 사이의 Interface 입니다.

CSI는 Storage Plugin, Storage LifeCycle, Interface 를 정의한다고 하는데.... 더 자세히 알아보진 않겠습니다.

여기선 그냥 CSI라는 인터페이스가 존재하는 덕분에 벤더사들이 자신들이 제공하는 스토리지별 CSI Driver를 개발할 수 있고, 각 CSI Driver가 실제 스토리지를 생성하는 주체가 된다고 생각하면 될 것 같습니다.

 

# aws-ebs-csi-driver

AWS EBS용 CSI Driver의 공식 이름입니다.

aws-ebs-csi-driver는 helm으로 설치 가능하지만, EKS에서 매니지드 애드온으로도 제공합니다.

다만, AWS의 리소스(EBS)를 직접 생성 또는 삭제해야 하므로, EBS에 대한 권한이 있는 IRSA Role을 만들어서 해당 애드온의 ServiceAccount 에 매핑시켜줘야 합니다. (IRSA Role은 kubernetes pod에 AWS 권한을 부여할 수 있는 방식입니다.)

요런 방식으로 IAM Role을 선택해줄 수 있습니다.

자세한 내용은 공식 도큐에서 직접 확인하시면 되는데, Managed AddOn은 치명적인 단점이 있습니다.

바로 EBS의 Snapshot 기능을 사용하기 위해서는 별도 CRD, RBAC Resource, Controller Deployment를 설치해야 한다고 하네요.

그럴바엔 그냥 helm으로 설치하겠습니다.

helm으로 설치할 시에도 마찬가지로 IRSA Role 만들어서 SA랑 매핑해주고, sidecars.snapshotter.forceEnabletrue로 해준다면 스냅샷용 리소스들까지 한번에 install됩니다.

 


이제 쿠버네티스에서 AWS EBS를 PV로 사용할 수 있게 되었습니다.

추가로,,,,

EKS에선 gp2 type의 EBS SC가 default 값으로 만들어진다고 했죠.

gp2 EBS SC의 default 설정을 해제하고 gp3용 EBS SC를 만들어 default로 설정하는 작업이 필요할 것 같지 않나요?

https://honglab.tistory.com/249

 

[Terraform/k8s] gp2 Storage Class patch

eks를 만들면, gp2 storage class가 자동으로 같이 생성되어 있다. https://docs.aws.amazon.com/eks/latest/userguide/storage-classes.html Storage classes - Amazon EKS Storage classes Amazon EKS clusters that were created prior to Kubernetes ver

honglab.tistory.com

테라폼으로 하는 법을 작성해 두었습니다.

 

감사합니다.

 

끝!

 

 

 

728x90
728x90

댓글