본문 바로가기
AWS/EKS

AWS EFS CSI Driver 설치 가이드

by aws-evan 2024. 12. 1.
반응형

  • 아키텍처

  • Amazon Elastic File System(Amazon EFS)은 완전히 탄력적인 서버리스 파일 스토리지를 제공하므로 스토리지 용량과 성능을 프로비저닝하거나 관리하지 않고도 파일 데이터를 공유할 수 있습니다
  • 사용 가능한 EFS CSI Driver 버전
aws eks describe-addon-versions \
    --addon-name aws-efs-csi-driver \
    --kubernetes-version 1.26 \
    --query "addons[].addonVersions[].[addonVersion, compatibilities[].defaultVersion]" \
    --output text

  • OIDC 공급자 연결
eksctl utils associate-iam-oidc-provider --cluster=my-cluster --approve
  • IRSA생성
// AWS 관리형 IAM Policy인 AmazonEFSCSIDriverPolicy 사용
eksctl create iamserviceaccount \
  --name efs-csi-controller-sa \
  --namespace kube-system \
  --cluster my-cluster \
  --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 my-cluster

  • EKS EFS CSI Driver Add-On 설치
eksctl create addon --name aws-efs-csi-driver\
 --cluster my-cluster \
 --service-account-role-arn arn:aws:iam::976442799645:role/AmazonEKS_EFS_CSI_DriverRole\
 --force

  • EKS EFS CSI Driver Add-On 확인
eksctl get addon --cluster my-cluster

  • EKS EFS CSI Driver 확인
kubectl get daemonset -n kube-system | grep efs-csi
kubectl get pods -n kube-system | grep efs-csi


EKS EFS 변수 생성 및 보안 그룹 생성

  • 클러스터가 있는 VPC ID를 검색하여 이후 단계에서 사용할 변수에 저장
vpc_id=$(aws eks describe-cluster \
    --name my-cluster \
    --query "cluster.resourcesVpcConfig.vpcId" \
    --output text)
  • 클러스터의 VPC에 대한 CIDR 범위를 검색하여 이후 단계에서 사용할 수 있도록 변수에 저장
cidr_range=$(aws ec2 describe-vpcs \
    --vpc-ids $vpc_id \
    --query "Vpcs[].CidrBlock" \
    --output text \
    --region us-east-1)
  • 보안 그룹 생성
security_group_id=$(aws ec2 create-security-group \
    --group-name MyEfsSecurityGroup \
    --description "My EFS security group" \
    --vpc-id $vpc_id \
    --output text)
  • 클러스터의 VPC에 대한 CIDR에서 인바운드 NFS 트래픽을 허용하는 인바운드 규칙 생성
aws ec2 authorize-security-group-ingress \
    --group-id sg-022ab01e8d8457d99 \
    --protocol tcp \
    --port 2049 \
    --cidr $cidr_range

 

EKS EFS 생성

  • 파일 시스템 생성
file_system_id=$(aws efs create-file-system \
    --region us-east-1 \
    --performance-mode generalPurpose \
    --query 'FileSystemId' \
    --output text)

 

마운트 타켓 생성

 

  • 클러스터 노드 IP 확인
kubectl get nodes
  • VPC에 있는 서브넷의 ID와 서브넷이 있는 가용성 영역
aws ec2 describe-subnets \
    --filters "Name=vpc-id,Values=$vpc_id" \
    --query 'Subnets[*].{SubnetId: SubnetId,AvailabilityZone: AvailabilityZone,CidrBlock: CidrBlock}' \
    --output table

 

  • 노드에 서브넷 ID , 보안그룹 ID 연결(프라이빗 서브넷 2개 등록)
aws efs create-mount-target \
    --file-system-id $file_system_id \
    --subnet-id subnet-063dd361d1d2389dc \
    --security-groups sg-022ab01e8d8457d99
    
    
aws efs create-mount-target \
    --file-system-id $file_system_id \
    --subnet-id subnet-0c1d99acf7b440325 \
    --security-groups sg-022ab01e8d8457d99
    
    
aws efs create-mount-target \
    --file-system-id fs-07b7d551ab0ebc7f2 \
    --subnet-id subnet-047c9c2c5532b3b3d \
    --security-groups sg-022ab01e8d8457d99

 

 

EKS EFS 테스트

  • 샘플 데이터다운로드
git clone https://github.com/kubernetes-sigs/aws-efs-csi-driver.git
cd aws-efs-csi-driver/examples/kubernetes/multiple_pods/

 

  • EFS ID 검색
aws efs describe-file-systems --query "FileSystems[*].FileSystemId" --output text

 

  • StorageClass yaml 파일수정
kind: StorageClass
apiVersion: storage.k8s.io/v1
metadata:
  name: efs-dp-sc
provisioner: efs.csi.aws.com
parameters:
  provisioningMode: efs-ap
  fileSystemId: fs-07b7d551ab0ebc7f2
  directoryPerms: "700"

  • PV, PVC 배포
apiVersion: v1
kind: PersistentVolumeClaim
metadata:
  name: efs-dp-claim
spec:
  accessModes:
    - ReadWriteMany
  storageClassName: efs-dp-sc
  resources:
    requests:
      storage: 5Gi
---
apiVersion: v1
kind: Pod
metadata:
  name: efs-dp-app
spec:
  containers:
    - name: app
      image: centos
      command: ["/bin/sh"]
      args: ["-c", "while true; do echo $(date -u) >> /data/out.txt; sleep 10; done"]
      volumeMounts:
        - name: persistent-storage
          mountPath: /data
  volumes:
    - name: persistent-storage
      persistentVolumeClaim:
        claimName: efs-dp-claim

  • Pod 데이터 확인
kubectl exec -it efs-dp-app -- sh -c 'df -hT --type=nfs4'

kubectl exec efs-dp-app -- tail -f /data/out.txt

 

  • 노드에서 데이터 확인
df -hT --type=nfs4

tree /efs

반응형

'AWS > EKS' 카테고리의 다른 글

AWS EKS EBS CSI Driver  (0) 2024.11.08
AWS EKS 생성하기  (0) 2024.11.07

댓글