# EFS 정보 확인 aws efs describe-file-systems --query "FileSystems[*].FileSystemId" --output text ------ fs-00fc18f0ad801703e 4 정책을 만들어야 한다. 고객 관리형 정책을 별도로 만들어야 한다. (고객이 직접 만든 정책이다.) IRSA 설정을 해야 한다. 5 # IAM 정책 생성 curl -s -O https://raw.githubusercontent.com/kubernetes-sigs/aws-efs-csi-driver/master/docs/iam-policy-example.json aws iam create-policy --policy-name AmazonEKS_EFS_CSI_Driver_Policy --policy-document file://iam-policy-example.json 6 # IRSA 설정 : 고객관리형 정책 AmazonEKS_EFS_CSI_Driver_Policy 사용 eksctl create iamserviceaccount --name efs-csi-controller-sa --namespace kube-system --cluster ${CLUSTER_NAME} --attach-policy-arn arn:aws:iam::${ACCOUNT_ID}:policy/AmazonEKS_EFS_CSI_Driver_Policy --approve (2분 소요) 7 # IRSA 확인 kubectl get sa -n kube-system efs-csi-controller-sa -o yaml | head -5 apiVersion: v1 kind: ServiceAccount metadata: annotations: eks.amazonaws.com/role-arn: arn:aws:iam::476286675138:role/eksctl-myeks-addon-iamserviceaccount-kube-sy-Role1-Q5FRU0E419V2 eksctl get iamserviceaccount --cluster myeks --------- NAMESPACE NAME ROLE ARN kube-system aws-load-balancer-controller arn:aws:iam::476286675138:role/eksctl-myeks-addon-iamserviceaccount-kube-sy-Role1-ILKQZ0MFQ6E5 kube-system ebs-csi-controller-sa arn:aws:iam::4738:role/AmazonEKS_EBS_CSI_DriverRole kube-system efs-csi-controller-sa arn:aws:iam::47138:role/eksctl-myeks-addon-iamserviceaccount-kube-sy-Role1-Q5FRU0E419V2 // 로드 밸드밸런서 컨트롤러, EBS 컨트롤러, EFS컨트롤러 role을 가지고 있다. 8 # EFS Controller 설치 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=602401143452.dkr.ecr.${AWS_DEFAULT_REGION}.amazonaws.com/eks/aws-efs-csi-driver --set controller.serviceAccount.create=false --set controller.serviceAccount.name=efs-csi-controller-sa 9 # 확인 helm list -n kube-system (masterseo@myeks:default) [root@myeks-bastion-EC2 ~]# helm list -n kube-system NAME NAMESPACE REVISION UPDATED STATUS CHART APP VERSION aws-efs-csi-driver kube-system 1 2023-05-11 00:08:53.043865633 +0900 KST deployed aws-efs-csi-driver-2.4.3 1.5.5 aws-load-balancer-controller kube-system 1 2023-05-10 18:54:06.089972566 +0900 KST deployed aws-load-balancer-controller-1.5.2 v2.5.1 kube-ops-view kube-system 1 2023-05-10 18:55:59.745086296 +0900 KST deployed kube-ops-view-1.2.2 20.4.0 10 kubectl get pod -n kube-system -l "app.kubernetes.io/name=aws-efs-csi-driver,app.kubernetes.io/instance=aws-efs-csi-driver" NAME READY STATUS RESTARTS AGE efs-csi-controller-6f64dcc5dc-86nr5 3/3 Running 0 59s efs-csi-controller-6f64dcc5dc-wjlc6 3/3 Running 0 59s efs-csi-node-nf2c2 3/3 Running 0 59s efs-csi-node-ngrf5 3/3 Running 0 59s efs-csi-node-zdscq 3/3 Running 0 59s <2> EFS 파일시스템을 다수의 파드가 사용하게 설정 - static example 1 워크셥 https://www.eksworkshop.com/docs/fundamentals/storage/efs/efs-csi-driver/ 2 # 모니터링 watch 'kubectl get sc efs-sc; echo; kubectl get pv,pvc,pod' 3 # 실습 코드 clone git clone https://github.com/kubernetes-sigs/aws-efs-csi-driver.git /root/efs-csi cd /root/efs-csi/examples/kubernetes/multiple_pods/specs && tree ├── claim.yaml ├── pod1.yaml ├── pod2.yaml ├── pv.yaml └── storageclass.yaml 4 # EFS 스토리지클래스 생성 및 확인 cat storageclass.yaml | yh kubectl apply -f storageclass.yaml kubectl get sc efs-sc kubectl get sc (masterseo@myeks:default) [root@myeks-bastion-EC2 specs]# kubectl get sc NAME PROVISIONER RECLAIMPOLICY VOLUMEBINDINGMODE ALLOWVOLUMEEXPANSION AGE efs-sc efs.csi.aws.com Delete Immediate false 88s gp2 (default) kubernetes.io/aws-ebs Delete WaitForFirstConsumer false 6h42m gp3 ebs.csi.aws.com Delete WaitForFirstConsumer true 94m local-path rancher.io/local-path Delete WaitForFirstConsumer false 4h28m 5 # PV 생성 및 확인 : volumeHandle을 자신의 EFS 파일시스템ID로 변경 EfsFsId=$(aws efs describe-file-systems --query "FileSystems[*].FileSystemId" --output text) sed -i "s/fs-00fc18f0ad801703e/$EfsFsId/g" pv.yaml // 본인 EFS의 fs id 확인 sed -i "s/fs-00fc18f0ad801703e/$EfsFsId/g" pv.yaml cat pv.yaml | yh kubectl apply -f pv.yaml kubectl get pv; kubectl describe pv 6 # PVC 생성 및 확인 cat claim.yaml | yh kubectl apply -f claim.yaml kubectl get pvc -------------------- NAME STATUS VOLUME CAPACITY ACCESS MODES STORAGECLASS AGE ebs-snapshot-restored-claim Bound pvc-61d66ff6-be81-4899-8d84-7e6a55fd7b35 4Gi RWO gp3 36m efs-claim Bound efs-pv 5Gi RWX efs-sc 2s localpath-claim Bound pvc-c37e1be5-de1a-4e4b-a7df-4984a60f6ee3 1Gi RWO local-path 4h32m 7 # 파드 생성 및 연동 ? 파드 내에 /data 데이터는 EFS를 사용 # 파드 2개 생성 됨 cat pod1.yaml pod2.yaml | yh kubectl apply -f pod1.yaml,pod2.yaml kubectl df-pv PV NAME PVC NAME NAMESPACE NODE NAME POD NAME VOLUME MOUNT NAME SIZE USED AVAILABLE %USED IUSED IFREE %IUSED pvc-61d66ff6-be81-4899-8d84-7e6a55fd7b35 ebs-snapshot-restored-claim default ip-192-168-2-38.ap-northeast-2.compute.internal app persistent-storage 3Gi 44Ki 3Gi 0.00 12 262132 0.00 8 # 파드 정보 확인 ? kubectl get pods kubectl exec -ti app1 -- sh -c "df -hT -t nfs4" kubectl exec -ti app2 -- sh -c "df -hT -t nfs4" Filesystem Type Size Used Available Use% Mounted on 127.0.0.1:/ nfs4 8.0E 0 8.0E 0% /data # 공유 저장소 저장 동작 확인 tree /mnt/myefs 9 # 작업용EC2에서도 마운트 되어 있다. 확인 tail -f /mnt/myefs/out1.txt # 작업용EC2에서도 확인 kubectl exec -ti app1 -- tail -f /data/out1.txt kubectl exec -ti app2 -- tail -f /data/out2.txt // 모두 EFS에 저장 된다. 10 스테틱 방식으로 실습 한것이다. 11 # 쿠버네티스 리소스 삭제 kubectl delete pod app1 app2 kubectl delete pvc efs-claim && kubectl delete pv efs-pv && kubectl delete sc efs-sc <3> EFS 파일시스템을 다수의 파드가 사용하게 설정 : Dynamic 1 # 모니터링 watch 'kubectl get sc efs-sc; echo; kubectl get pv,pvc,pod' 2 다이나믹은 파게이트는 지원 안함. 3 # EFS 스토리지클래스 생성 및 확인 curl -s -O https://raw.githubusercontent.com/kubernetes-sigs/aws-efs-csi-driver/master/examples/kubernetes/dynamic_provisioning/specs/storageclass.yaml cat storageclass.yaml | yh sed -i "s/fs-00fc18f0ad801703e/$EfsFsId/g" storageclass.yaml kubectl apply -f storageclass.yaml kubectl get sc efs-sc 4 # PVC/파드 생성 및 확인 curl -s -O https://raw.githubusercontent.com/kubernetes-sigs/aws-efs-csi-driver/master/examples/kubernetes/dynamic_provisioning/specs/pod.yaml cat pod.yaml | yh kubectl apply -f pod.yaml kubectl get pvc,pv,pod # PVC/PV 생성 로그 확인 kubectl logs -n kube-system -l app=efs-csi-controller -c csi-provisioner -f 5 # 파드 정보 확인 kubectl exec -it efs-app -- sh -c "df -hT -t nfs4" Filesystem Type Size Used Available Use% Mounted on 127.0.0.1:/ nfs4 8.0E 0 8.0E 0% /data 6 # 공유 저장소 저장 동작 확인 tree /mnt/myefs # 작업용EC2에서 확인 kubectl exec efs-app -- bash -c "cat data/out" 7 콘솔에서 확인하자 EFS -> 엑세스 포인트에 정보가 나온다.