카테고리 없음

[26WKRD2] EFS on EKS 체험해보기 - EFS CSI Driver

CloudBackend 2026. 4. 2. 16:45

개요

AWS EKS 환경에서 여러 Pod들이 같은 스토리지를 공유하기 위해서는 EFS를 사용할 수 있습니다.

EBS를 사용할 경우 하나의 가용 영역에서만 사용이 가능한 반면, EFS를 사용하면 리전 내 모든 가용 구역에서 접근할 수 있다는 장점이 있습니다. 

 

그럼 빠르게 EKS에서 EFS를 사용하는 방법을 알아보도록 하겠습니다.

 

1. EKS Cluster Setup

VPC와 Subnet, EKS Cluster를 빠르게 프로비저닝하기 위해 아래 명령어로 클러스터를 한번에 생성합니다.

옵션을 추가적으로 부여할 수 있다는 점에 유의합니다.

eksctl create cluster --region ap-northeast-2

 

이렇게 생성하면, 아래와 같이 VPC, Subnet, EKS Cluster가 한번에 생성됩니다.

 

2. EFS Setup

EFS를 생성하기 전, EKS Cluster에 IRSA를 생성하고, 먼저 EFS 드라이버인 efs-csi-driver를 설치해줍니다. 

먼저, 아래 명령어로 IRSA를 생성합니다.

eksctl utils associate-iam-oidc-provider \
    --cluster adorable-gopher-1775088244 \
    --region ap-northeast-2 \
    --approve

eksctl create iamserviceaccount \
    --name efs-csi-controller-sa \
    --namespace kube-system \
    --cluster adorable-gopher-1775088244 \
    --region ap-northeast-2 \
    --role-name AmazonEKS_EFS_CSI_DriverRole \
    --attach-policy-arn arn:aws:iam::aws:policy/service-role/AmazonEFSCSIDriverPolicy \
    --approve

 

그 후, 만약 helm이 없으면 아래 명령어로 설치하고, 있다면 스킵합니다.

curl https://raw.githubusercontent.com/helm/helm/master/scripts/get-helm-3 > get_helm.sh
chmod 700 get_helm.sh
./get_helm.sh

 

그 후, helm을 통해 EKS 클러스터에 efs-csi-driver를 설치합니다.

helm repo add aws-efs-csi-driver https://kubernetes-sigs.github.io/aws-efs-csi-driver/
helm repo update
helm upgrade -i aws-efs-csi-driver aws-efs-csi-driver/aws-efs-csi-driver \
    --namespace kube-system \
    --set image.repository=<리전 별 Registry>/eks/aws-efs-csi-driver \
    --set controller.serviceAccount.create=false \
    --set controller.serviceAccount.name=efs-csi-controller-sa

 

리전 별 레지스트리 정보는 https://docs.aws.amazon.com/ko_kr/eks/latest/userguide/add-ons-images.html 여기서 확인할 수 있습니다.

 

그 후, 보안 그룹을 아래와 같이 잘 설정합니다.

 

이제, EFS를 생성하고, Access point를 생성해보겠습니다.

해당 부분은 잘 설정한 후, 계속 진행합니다.

 

아래와 같이 Private Subnet에 배치한 후, 보안 그룹을 방금 설정한 efs-sg로 설정합니다.

 

파일 시스템 정책은 입맛에 맞게 잘 설정한 후, EFS를 생성합니다.

 

마지막으로, EFS Access Point도 적절히 설정해봅시다.

 

생성합시다.

3. Kubernetes

이제, EKS Pod와 EFS를 엮어주는 작업을 해봅시다.

<이 링크(링크삽입필요!)>의 레포를 클론받아, Account id, region, efs id, efs ap id 등을 본인의 것으로 채워넣은 후, 아래 명령어를 순차적으로 실행합니다.

1. StorageClass를 생성합니다.

StorageClass는 PVC가 어떤 Provisioner를 사용할지 참조하도록 합니다. 그 후, 설정해둔 EFS를 PV로 등록합니다.

# Access Point 사용하여 연결
kubectl apply -f example_eks_manifests/0_storageclass_use_accesspoint.yaml

# EFS Mount Point 사용하여 연결
kubectl apply -f example_eks_manifests/0_storageclass.yaml

 

2. PVC를 생성합니다.

StorageClass를 통해 1번에서 만든 PV에 바인딩 요청합니다. Pod는 PV에 다이렉트로 스토리지를 요청하는 것이 아니라 PVC를 통해 요청하므로 필요합니다.

PV <-> PVC 간 정상적으로 연결될 경우, status가 Bound로 변경됩니다.

kubectl apply -f example_eks_manifests/1_pvc.yaml

 

3. 테스트용 Pod를 배포합니다.

Writer pod는 EFS에 Data를 쓰고, Reader는 EFS를 Watching 하며 Data가 작성될 경우 출력합니다.

kubectl apply -f example_eks_manifests/2_pod_test.yaml

 

4. 이제 정상적으로 배포되었는지 테스트해봅니다.

아래 명령어를 실행하여 생성된 리소스들과 Pod 로그를 확인해봅시다.

# PVC 바인딩 확인
kubectl get pvc -n default

# Pod 상태 확인
kubectl get pods -n default

# 로그 보기; Writer
kubectl logs efs-test-writer -n default
# 로그 보기; Reader
kubectl logs efs-test-reader -n default

 

아래와 같이 PVC가 정상적으로 Bound 되었고, Pod들도 모두 정상적으로 실행이 완료된 것을 알 수 있습니다.

마치며

이번 글에서는 EKS 환경에서 Amazon EFS를 연동하여 여러 Pod가 동일한 스토리지를 공유하는 방법을 간단히 살펴보았습니다. EFS CSI Driver 설치부터 IRSA 설정, EFS 및 Access Point 생성, 그리고 Kubernetes의 StorageClass, PVC, Pod까지 순서대로 연결해보면, EKS에서도 비교적 자연스럽게 공유 파일 시스템을 구성할 수 있음을 확인할 수 있습니다.

특히 EFS는 여러 가용 영역에서 동시에 접근할 수 있다는 점에서, 다수의 워크로드가 같은 데이터를 함께 다뤄야 하는 환경에 유용합니다. 다만 실제 운영 환경에서는 단순히 연결만 확인하는 수준을 넘어, 보안 그룹, 파일 시스템 정책, Access Point 분리, 권한 관리 방식까지 함께 고려하여 보다 안정적인 구조로 설계하는 것이 중요합니다.

참고 문서

[1] EFS 파일 시스템 설계하기 - https://ninejuan.tistory.com/entry/26WKRD2-EFS-%ED%8C%8C%EC%9D%BC-%EC%8B%9C%EC%8A%A4%ED%85%9C-%EC%84%A4%EA%B3%84%ED%95%98%EA%B8%B0

해당 글은 Advanced FS Policy를 적용해야 할 경우 확인하시기 바랍니다.