안녕하세요.
오늘은 AWS EBS를 활용해서 EKS 환경에 PV(Persistent Volume)를
동적 프로비저닝(Dynamic Provisioning)하는 방법을 알아보겠습니다.
본격적인 PV 배포 실습에 앞서, 이를 위해 꼭 알아두어야 할 핵심 개념인
'EBS CSI Driver'와 'EKS Pod Identity Agent'에 대해 먼저 짚고 넘어가겠습니다.
# EBS CSI Driver
PVC를 Pod에 할당하려면 PV 역할을 할 EBS 볼륨이 필요합니다.
저희는 이 과정을 자동화하는 '동적 프로비저닝(Dynamic Provisioning)' 방식을 사용할 것입니다.
이때 EKS가 우리 대신 AWS API를 호출해 EBS를 만들고 실제 노드에 볼륨을 마운트하는 과정이 필요합니다.
이 역할을 대신하는 것이 EBS CSI Driver입니다.
# EKS Pod Identity Agent
앞서 말씀드린대로 EBS CSI Driver가 클러스터의 요청을 받아 실제 EBS를 만드는 역할을 합니다.
하지만 EBS CSI Driver는 적절한 권한이 없어 생성하는 것이 불가능한데
여기서 EKS Pod Identity Agent가 임시 자격 증명을 실시간으로 발급해 줍니다.
# 실제 배포하기
이제 실제 배포해 보겠습니다.
가장 먼저 EBS CSI Driver가 사용할 IAM Role을 생성하겠습니다.

IAM에 들어와 역할 생성을 클릭합니다.

신뢰할 수 있는 엔터티로 EKS의 EKS - Pod Identity를 선택합니다.
"Pod가 이 역할을 사용한다." 라는 의미입니다.

"AmazonEBSCSIDriverPolicy" 정책을 할당합니다.

이름 설정 후 바로 생성합니다.
저는 AmazonEKS_EBS_CSI_DriverRole 명으로 하였습니다.

역할 생성이 완료되었으면 배포된 EKS로 들어옵니다.
추가 기능 → 추가 기능 가져오기를 클릭합니다.


"Amazon EBS CSI 드라이버"와 "Amazon EKS Pod Identity 에이전트"를 클릭 후 설치합니다.

EKS Pod Identity를 선택 후 아까 생성한 역할을 선택합니다.
다음으로 넘어가 생성합니다.

추가 기능란에서 두 기능이 활성화되어 있으면 설치된 것입니다.

EBS CSI Driver는 Kubernetes 내부에서 ebs-csi-controller 명의 deployment가 생성되어 있습니다.

EKS Pod Identity는 Daemonset으로 생성되어있습니다.
apiVersion: v1
kind: PersistentVolumeClaim
metadata:
name: dynamic-ebs-pvc
spec:
accessModes:
- ReadWriteOnce
storageClassName: gp2
resources:
requests:
storage: 32Gi
---
apiVersion: v1
kind: Pod
metadata:
name: ebs-test-pod
spec:
containers:
- name: web-server
image: nginx
volumeMounts:
- name: ebs-storage
mountPath: /var/www/html
volumes:
- name: ebs-storage
persistentVolumeClaim:
claimName: dynamic-ebs-pvc
이제 테스트를 위한 Pod와 PVC를 생성하겠습니다.
storageclass는 EKS에 기본으로 배포되어 있는 gp2를 사용하겠습니다.

"kubectl apply -f pod.yml" 명령어를 사용해 배포합니다.

Pod, PV, PVC 모두 정상적으로 배포된 것을 확인 가능합니다.

EBS도 생성되어 있습니다.
*참고 문서
https://docs.aws.amazon.com/ko_kr/eks/latest/userguide/ebs-csi.html
https://docs.aws.amazon.com/ko_kr/eks/latest/userguide/pod-id-agent-setup.html