[EKS] AWS EFS CSI를 이용한 동적 프로비저닝

vinca·2024년 2월 18일
0

🦓 EKS

목록 보기
16/23
post-thumbnail
post-custom-banner

AWS EFS란?☁️

EFS란 AWS에서 제공하는 파일스토리지로 EBS와 같이 별도의 스토리지 용량이 지정된 것이 아닌 Elastic하게 늘어나는 스토리지를 말한다.

즉, 다수의 가용영역에서 다수의 사용자가 필요한 만큼의 스토리지를 사용할 수 있다.📈

EBS와의 차이🤔

EBS는 단일 EC2 인스턴스에 마운트되는 블록 스토리지로, 더 높은 IOPS와 낮은 지연시간을 필요로 하는 워크로드에 적합하다.

반면, EFS는 여러 EC2 인스턴스에서 공유되는 파일 스토리지로, 여러 애플리케이션 또는 인스턴스 간에 공유되는 데이터를 저장하기 적합하다.💡

IOPS🗄️

IOPS(Input/Output Operations Per Second)
초당 입출력 연산 횟수. 더 높은 IOPS 값을 가진 장치는 더 많은 데이터를 빠르게 처리할 수 있다. 데이터베이스와 같은 지속적인 데이터 읽기/쓰기 작업의 지표로 쓰인다.

Latency⚡

지연시간(LLatency)
데이터를 요청하고 그 결과를 받는 데 걸리는 시간을 의미한다. 지연시간이 낮을수록 시스템이 더 빠르게 반응하므로, 사용자 경험이 개선되고, 응용 프로그램의 성능이 향상된다. 고성능 컴퓨팅, 온라인 게임, 실시간 데이터 처리와 같이 즉각적인 반응이 요구되는 환경에서 지연시간이 중요한 지표로 쓰인다.

AWS EFS CSI의 특징

1. accessMode에 무관함

PV와 PVC를 구성할 때의 accessMode는 어떤 것을 쓰던지 상관이 없다. (RWO, ROX, RWX)

🅰️ : EFS의 특성상 다중 리전의 다중 사용자에게 공유하는 특징이 있기 때문이다.

2. NodeAffinity 필요 없음

PV를 사용하기 위해서 EFS가 존재하는 리전에 파드의 배포를 맞출 필요가 없다.
즉, PV구성 시 별도의 NodeAffinity를 설정할 필요가 없다.

🅰️ : 이 또한 다중 리전을 지원하는 EFS의 특징이기 때문이다.

AWS EFS CSI 설치 및 확인

다음과 같은 과정을 통해서 수행된다.

AWS EBS CSI와 마찬가지로 EKS에 add-on형태로 AWS에서 제공한다.

0. Amazon EBS CFI Driver 버전 확인

// Amazon EFS CSI Driver 버전 정보 (True = 기본 설치 버전)
aws eks describe-addon-versions \
    --addon-name aws-efs-csi-driver \
    --kubernetes-version 1.26 \
    --query "addons[].addonVersions[].[addonVersion, compatibilities[].defaultVersion]" \
    --output text

현재 add-on 버전은 1.7.5로 확인된다. 이를 설치해 주도록 하자.

1. IRSA 생성

// AWS 관리형 IAM Policy인 AmazonEFSCSIDriverPolicy 사용
eksctl create iamserviceaccount \
  --name efs-csi-controller-sa \
  --namespace kube-system \
  --cluster ${CLUSTER_NAME} \
  --attach-policy-arn arn:aws:iam::aws:policy/service-role/AmazonEFSCSIDriverPolicy \
  --approve \
  --role-only \
  --role-name AmazonEKS_EFS_CSI_DriverRole

// IRSA 확인
eksctl get iamserviceaccount --cluster ${CLUSTER_NAME}

AWS EBS CSI Driver와 마찬가지로 EBS CSI Driver 또한 add-on으로 공식 제공하므로, IAM 정책이 AWS에서 공식 제공된다. 갖다 쓰면 된다!😀

여기서의 확인되는 iamserviceaccountKubernetes에 AWS 리소스 접근 권한을 부여하기 위해 사용되는 EKS의 IAM Service Account다. 따라서 kubectl 명령으로는 해당 SA가 조회되지 않는다.❌

2. Amazon EFS CSI Driver 설치 (Add-On 설치)

eksctl create addon --name aws-efs-csi-driver\
 --cluster ${CLUSTER_NAME}\
 --service-account-role-arn arn:aws:iam::${ACCOUNT_ID}:role/AmazonEKS_EFS_CSI_DriverRole\
 --force

이 과정에서 Kubernetes 클러스터 내의 SA를 생성하며 AWS IAM role과 연결하면서 kubectl get sa(service account)로 확인이 가능해진다. ⭕

3.1. Amazon EFS CSI Driver 설치 확인

// Amazon EKS 클러스터 Add-On 확인
eksctl get addon --cluster ${CLUSTER_NAME}


// Amazon EFS CSI Driver 설치 자원 확인
kubectl get pod -n kube-system -l "app.kubernetes.io/name=aws-efs-csi-driver,app.kubernetes.io/instance=aws-efs-csi-driver"

Add-on 형태로 설치된 것을 확인할 수 있고, efs-csi-controllerefs-csi-node파드가 deployment 형태로 배포된 것을 확인할 수 있다.

3.2. Amazon EFS CSI Driver의 컨테이너 확인

// efs-csi-controller 파드에 컨테이너 확인
kubectl get pod -n kube-system -l app=efs-csi-controller -o jsonpath='{.items[0].spec.containers[*].name}' ; echo

// efs-csi-node 데몬셋에 컨테이너 확인
kubectl get daemonset -n kube-system -l app.kubernetes.io/name=aws-efs-csi-driver -o jsonpath='{.items[0].spec.template.spec.containers[*].name}' ; echo

배포된 파드의 컨테이너📦를 살펴보자.
위 그림과 같이 efs-csi-controllerefs-csi-node파드에 각각 3개의 컨테이너가 배치되어 있는 것을 확인할 수 있다.

Amazon EFS CSI Driver의 동적 프로비저닝 구성

Amazon EFS CSI Driver 환경에서 동적 프로비저닝을 구성해보자.

EFS는 기존에 생성해둔 EFS를 사용하도록 한다.

what? 기존에 생성해둔 EFS? 🤔

분명 동적 프로비저닝 임에도 미리 EFS를 생성해두는 이유는 EBS와 달리 EFS는 동적 프로비저닝이 가능하지만, 동적으로 생성되는 것은 파일 시스템 내의 액세스 포인트 또는 서브디렉토리이다. 이는 EFS 파일 시스템 자체가 아닌 파일 시스템 내의 리소스가 동적으로 생성되는 것을 의미한다.

따라서, 동적 프로비저닝을 사용하기 전에 미리 EFS 파일 시스템을 생성하고, 해당 파일 시스템의 ID (fileSystemId)를 StorageClass 리소스에 명시해야 한다. 이렇게 해야 Kubernetes 클러스터가 어떤 EFS 파일 시스템에 대해 동적으로 리소스를 생성할지 알 수있다.

EFS 파일 시스템 ID 변수 선언

EFS_ID=$(aws efs describe-file-systems --query "FileSystems[?Name=='myeks-EFS'].[FileSystemId]" --output text); echo $EFS_ID

StorageClass 생성

// yaml 파일 다운로드 및 확인
curl -s -O https://raw.githubusercontent.com/cloudneta/cnaeblab/master/_data/efs_dp_sc.yaml
cat efs_dp_sc.yaml | yh

// 파일 시스템 ID 설정 변수 치환
sed -i "s/fs-0123456/$EFS_ID/g" efs_dp_sc.yaml; cat efs_dp_sc.yaml | yh

// StorageClass 생성
kubectl apply -f efs_dp_sc.yaml
// StorageClass 확인
kubectl describe sc efs-dp-sc | yh

EFS를 이용한 동적 프로비저닝을 수행할 것이므로 provisioner에 efs.csi.aws.com을 써주고, EFS 스토리지 클래스를 생성한다.

이 때 provisioningMode: efs-ap로 동적 프로비저닝으로 EFS 액세스 포인트를 생성한다. 이를 통해 미리 생성해둔 fs-0a7374ce368dedcbf EFS에 액세스 포인트를 생성하게 된다.

PVC와 파드 생성

// yaml 파일 다운로드 및 확인
curl -s -O https://raw.githubusercontent.com/cloudneta/cnaeblab/master/_data/efs_dp_pvc_pod.yaml
cat efs_dp_pvc_pod.yaml | yh

// PVC와 파드 생성
kubectl apply -f efs_dp_pvc_pod.yaml

PVC를 생성하고 파드를 생성해보자.
파드를 생성할 때 PVC를 바탕으로 PV를 요청한다. 이때 위의 StorageClass에 waitForFirstConsumer 옵션을 지정하지 않았으므로 PVC가 생성되는 순간 바로 PV또한 생성될 것이다.

PV가 바로 생성되고 PVC와 바인딩된다.

PVC, PV 생성 후 EFS 액세스 포인트 생성

데이터 확인

// 파드에서 마운트 대상의 디스크 사용 확인
kubectl exec -it efs-dp-app -- sh -c 'df -hT --type=nfs4'

// 파드에서 out.txt 파일 내용 확인
kubectl exec efs-dp-app -- tail -f /data/out.txt

// 인스턴스에서 공유 디렉토리 확인
tail /mnt/myefs/pvc-983a7207-fa5e-4962-8d64-bf79bafbf5b1/out.txt
df -hT --type=nfs4
tree /mnt/myefs

파드에서 이러한 EFS 볼륨 스토리지에 접근하여 사용할 수 있고, 현재 작업 중인 Bastion EC2에서도 연결해뒀는데 이를 통해서도 확인할 수 있다.

profile
붉은 배 오색 딱다구리 개발자 🦃Cloud & DevOps
post-custom-banner

0개의 댓글