목차
1. Amazon EFS CSI Driver 설치
    1.1. Amazon EFS CSI Driver 설치 및 IRSA 생성
    1.2. Amazon EFS CSI Driver 설치 확인
2. Amazon EFS CSI Driver의 동적 프로비저닝 구성
    2.1. 동적 프로비저닝 구성 - StorageClass, PVC, 파드 생성 및 확인
    2.2. 정보 확인


1. Amazon EFS CSI Driver 설치


이번 실습은 3장 Amazon EKS 원클릭 배포 환경에서 진행합니다.
인프라 배포를 진행하지 않은 경우 링크를 통해 배포 후 복귀 바랍니다.
그리고 새롭게 인프라를 배포하면 아래 기본 설정 명령을 입력 후 진행 바랍니다.

기본 설정 명령어


Default 네임 스페이스 변경

1
kubectl ns default


워커 노드의 IP 변수 선언

1
2
3
4
5
6
7
8
9
10
11
N1=$(kubectl get node --label-columns=topology.kubernetes.io/zone --selector=topology.kubernetes.io/zone=ap-northeast-2a -o jsonpath={.items[0].status.addresses[0].address})

N2=$(kubectl get node --label-columns=topology.kubernetes.io/zone --selector=topology.kubernetes.io/zone=ap-northeast-2b -o jsonpath={.items[0].status.addresses[0].address})

N3=$(kubectl get node --label-columns=topology.kubernetes.io/zone --selector=topology.kubernetes.io/zone=ap-northeast-2c -o jsonpath={.items[0].status.addresses[0].address})

echo "export N1=$N1" >> /etc/profile

echo "export N2=$N2" >> /etc/profile

echo "export N3=$N3" >> /etc/profile


노드에 Tool 설치

1
2
3
4
5
ssh ec2-user@$N1 sudo yum install links tree jq tcpdump sysstat -y

ssh ec2-user@$N2 sudo yum install links tree jq tcpdump sysstat -y

ssh ec2-user@$N3 sudo yum install links tree jq tcpdump sysstat -y


EFS 마운트 확인

1
2
3
4
5
6
df -hT --type nfs4

// 만약 마운트가 되지 않는다면.. 수동으로 마운트
EFS_ID=$(aws efs describe-file-systems --query "FileSystems[?Name=='myeks-EFS'].[FileSystemId]" --output text); echo $EFS_ID

mount -t nfs4 -o nfsvers=4.1,rsize=1048576,wsize=1048576,hard,timeo=600,retrans=2,noresvport $EFS_ID.efs.ap-northeast-2.amazonaws.com:/ /mnt/myefs


AWS Load Balancer Controller 설치

1
2
3
4
5
6
7
helm repo add eks https://aws.github.io/eks-charts

helm repo update

helm install aws-load-balancer-controller eks/aws-load-balancer-controller -n kube-system --set clusterName=$CLUSTER_NAME \
  --set serviceAccount.create=false \
  --set serviceAccount.name=aws-load-balancer-controller


ExternalDNS 설치

1
2
3
4
5
6
7
8
9
10
// 자신의 도메인 주소로 설정
MyDomain=<자신의 도메인>

MyDnsHostedZoneId=$(aws route53 list-hosted-zones-by-name --dns-name "${MyDomain}." --query "HostedZones[0].Id" --output text)

echo $MyDomain, $MyDnsHostedZoneId

curl -s -O https://raw.githubusercontent.com/cloudneta/cnaeblab/master/_data/externaldns.yaml

MyDomain=$MyDomain MyDnsHostedZoneId=$MyDnsHostedZoneId envsubst < externaldns.yaml | kubectl apply -f -


kube-ops-view 설치

1
2
3
4
5
6
7
8
9
helm repo add geek-cookbook https://geek-cookbook.github.io/charts/

helm install kube-ops-view geek-cookbook/kube-ops-view --version 1.2.2 --set env.TZ="Asia/Seoul" --namespace kube-system

kubectl patch svc -n kube-system kube-ops-view -p '{"spec":{"type":"LoadBalancer"}}'

kubectl annotate service kube-ops-view -n kube-system "external-dns.alpha.kubernetes.io/hostname=kubeopsview.$MyDomain"

echo -e "Kube Ops View URL = http://kubeopsview.$MyDomain:8080/#scale=1.5"



1.1. Amazon EFS CSI Driver 설치 및 IRSA 생성

Amazon EFS CSI Driver의 권한을 위임하기 위한 인증 절차로 IRSA 구성을 선행하고 Amazon EFS CSI Driver를 설치합니다.


Amazon EBS CFI Driver 버전 정보

1
2
3
4
5
6
// 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


IRSA 생성

1
2
3
4
5
6
7
8
9
10
11
12
// 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}


Amazon EFS CSI Driver Add-On 설치

1
2
3
4
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



1.2. Amazon EFS CSI Driver 설치 확인


Amazon EKS 클러스터 Add-On 확인

1
eksctl get addon --cluster ${CLUSTER_NAME}


Amazon EFS CSI Driver 설치 자원 확인

1
kubectl get pod -n kube-system -l "app.kubernetes.io/name=aws-efs-csi-driver,app.kubernetes.io/instance=aws-efs-csi-driver"


Amazon EFS CSI Driver의 컨테이너 확인

1
2
3
4
5
// 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




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


Amazon EFS CSI Driver 환경에서 동적 프로비저닝을 구성합니다.


2.1. 동적 프로비저닝 구성 - StorageClass, PVC, 파드 생성 및 확인


신규 터미널 - 모니터링

1
2
3
4
5
// 신규 터미널 1 - pod, pv, pvc, sc 모니터링
watch 'kubectl get pv,pvc,pod; echo; kubectl get sc efs-dp-sc'

// 신규 터미널 2 - 파일 시스템의 액세스 포인트 확인
while true; do aws efs describe-access-points --query "AccessPoints[*].AccessPointId"  --output text; date; sleep 1; done


EFS 파일 시스템 ID 변수 선언

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


StorageClass 생성

1
2
3
4
5
6
7
8
9
10
11
12
13
// 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


PVC와 파드 생성

1
2
3
4
5
6
7
// 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


2.2. 정보 확인


efs-csi-controller의 provisioner 로그 확인

1
kubectl logs -n kube-system -l app=efs-csi-controller -c csi-provisioner -f


데이터 확인

1
2
3
4
5
6
7
8
9
10
// 파드에서 마운트 대상의 디스크 사용 확인
kubectl exec -it efs-dp-app -- sh -c 'df -hT --type=nfs4'

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

// 작업용 인스턴스에서 공유 디렉토리 확인
df -hT --type=nfs4

tree /mnt/myefs


실습 종료 후 자원 삭제

1
2
// 파드, PVC, StorageClass 삭제
kubectl delete -f efs_dp_pvc_pod.yaml && kubectl delete -f efs_dp_sc.yaml


Warning: 다음 섹션의 실습을 이어서 진행할 것으로 Amazon EKS 원클릭 배포를 유지합니다. 혹시나 다음 섹션을 진행하지 않을 경우 3장 Amazon EKS 원클릭 배포를 삭제해 주길 바랍니다.



여기까지 3장의 Amazon EFS CSI Driver 실습을 마칩니다.
수고하셨습니다 :)