mingming

EKS Amazon EFS CSI Driver (helm) 본문

kubernetes

EKS Amazon EFS CSI Driver (helm)

mingming_96 2023. 8. 25. 04:20

Amazon EFS CSI Driver

kubernetes 클러스터 내에서 Amazon EFS를 이용을 위해 제공하는 도구입니다. EFS 파일 시스템 Pod마운트하여 PV동적으로 생성해 데이터를 공유하고, 영구보관할 수 있습니다. 

 

EFS를 사용하는 이유

1. 동적 프로비저닝: PVC(Persistent Volume Claim).을 생성하면, PV가 자동으로 생성됩니다.

2. 다중가용영역: EFS CSI Driver를 통해 다중가용영역에서 데이터를 공유하는 PV를 생성할 수 있습니다.

3. 동시접근: 여러 Pod에서 동시에 EFS 파일 시스템을 마운트하여 데이터를 공유할 수 있습니다.

4. Kubernetes Native: Kubernetes의 CSI 스펙을 따르므로 Kubernetes 워크플로우에 통합하기 용이합니다. 

 

IAM Policy 생성

iam 정책을 다운로드 합니다.

curl -O https://raw.githubusercontent.com/kubernetes-sigs/aws-efs-csi-driver/master/docs/iam-policy-example.json

다운받은 정책으로 iam 정책을 생성해 줍니다

aws iam create-policy \
    --policy-name AmazonEKS_EFS_CSI_Driver_Policy \
    --policy-document file://iam-policy-example.json

 

Service Account 생성 및 정책 연결

IAM OIDC Provider 매핑

eksctl utils associate-iam-oidc-provider --cluster <cluster_name> --approve

 

Service Account

eksctl create iamserviceaccount \
  --cluster=<cluster_name> \
  --namespace=kube-system \
  --name=aws-efs-controller-sa \
  --attach-policy-arn=arn:aws:iam::<Account_ID>:policy/AmazonEKS_EFS_CSI_Driver_Policy \
  --override-existing-serviceaccounts \
  --approve

 

EFS CSI Driver 설치

helm 설치하기

curl -fsSL -o get_helm.sh https://raw.githubusercontent.com/helm/helm/main/scripts/get-helm-3
chmod 700 get_helm.sh
./get_helm.sh

 

helm repo 추가하기 

helm repo add efs https://kubernetes-sigs.github.io/aws-efs-csi-driver/
helm repo update
helm search repo efs

 

EFS CSI Driver 설치하기

helm install aws-efs-csi-driver efs/aws-efs-csi-driver \
-n kube-system \
--set clusterName=<cluster_name> \
--set serviceAccount.create=false \
--set serviceAccount.name=aws-efs-csi-drive \
--set region=ap-northeast-2 \

 

정적 프로비저닝

정적 프로비저닝미리 생성된 EFS 파일 시스템의 AccessPoint를 Kubernetes 클러스터 내에서 수동으로 프로비저닝 하는 방법 입니다. PVC 생성후 PV를 생성해 해당 볼륨을 Pod에 마운트하는 방법입니다. 

EFS 를 생성해줍니다. 이떄 주의 사항으로 파일시스템의 탑재 대상의 네트워크를 kubernetes 클러스터와 연결 가능한 vpc , subnet 으로 지정해야 합니다. 

 

pv.yaml

apiVersion: v1
kind: PersistentVolume
metadata:
  name: efs-pv
spec:
  capacity:
    storage: 5Gi
  volumeMode: Filesystem
  accessModes:
    - ReadWriteMany
  persistentVolumeReclaimPolicy: Retain
  storageClassName: efs-sc
  csi:
    driver: efs.csi.aws.com
    volumeHandle: efs-id

 

pvc. yaml

apiVersion: v1
 kind: PersistentVolumeClaim
 metadata:
   name: efs-claim
 spec:
   accessModes:
     - ReadWriteMany
   resources:
     requests:
       storage: 1Gi
   storageClassName: efs-sc

 

pod.yaml

apiVersion: v1
kind: Pod
metadata:
  name: efs-app
spec:
  containers:
    - name: app
      image: centos
      command: ["/bin/sh"]
      args: ["-c", "while true; do echo $(date -u) >> /data/out; sleep 5; done"]
      volumeMounts:
        - name: persistent-storage
          mountPath: /data
  volumes:
    - name: persistent-storage
      persistentVolumeClaim:
        claimName: efs-claim

 

작성한 매니페스트 파일을 pvc, pv, pod 순서대로 배포합니다.

kubectl apply -f pvc.yaml
kubectl apply -f pv.yaml
kubectl apply -f pod.yaml

 

해당 파드에 접속해 마운트가 잘 되어있는지 확인합니다.

kubectl exec -it efs-app -- bash -c "cat  data/out

 

동적 프로비저닝

동적 프로비저닝은 Access Point를 미리 생성하는 것이 아닌 Storage Class에 의해서 동적으로 필요에 따라 Access Point가 생성되는 것입니다. 내용은 정적 프로비저닝와 흡사합니다.

 

StorageClass.yaml

kind: StorageClass
apiVersion: storage.k8s.io/v1
metadata:
  name: efs-sc
provisioner: efs.csi.aws.com
parameters:
  provisioningMode: efs-ap
# PV 생성하는 부분 
  fileSystemId: fs-09380ead7b417098d
  directoryPerms: "700"
  gidRangeStart: "1000" # optional
  gidRangeEnd: "2000" # optional
  basePath: "/dynamic_provisioning" # optional

 

pvc.yaml

apiVersion: v1
kind: PersistentVolumeClaim
metadata:
  name: efs-claim
  spec:
    accessModes:
      - ReadWriteMany
    resources:
      requests:
        storage: 1Gi
    storageClassName: efs-sc

 

pod.yaml

apiVersion: v1
kind: Pod
metadata:
  name: efs-app
spec:
  containers:
    - name: app
      image: centos
      command: ["/bin/sh"]
      args: ["-c", "while true; do echo $(date -u) >> /data/out; sleep 5; done"]
      volumeMounts:
        - name: persistent-storage
          mountPath: /data
  volumes:
    - name: persistent-storage
      persistentVolumeClaim:
        claimName: efs-claim

 

작성한 매니페스트 파일을 StorageClass, pvc, pod 순서대로 배포합니다.

kubectl apply -f StorageClass.yaml
kubectl apply -f pvc.yaml
kubectl apply -f pod.yaml

 

pv(persistant volume) 이 정상적으로 생성되어있는지 확인합니다.

kubectl get pv

 

해당 파드에 접속해 마운트가 잘 되어있는지 확인합니다.

kubectl exec -it efs-app -- bash -c "cat  data/out

 

실습이 마무리 되었으면 생성한 리소스를 모두 지우고 클러스터를 삭제합니다.

kubectl delete -f StorageClass.yaml
kubectl delete -f pvc.yaml
kubectl delete -f pod.yaml
eksctl delete cluster --name <cluster_name> --region ap-northeast-2

'kubernetes' 카테고리의 다른 글

kubernetes init container  (0) 2023.08.29
kubernetes livenessProve  (0) 2023.08.27
EKS AWS Load Balancer Controller (helm)  (0) 2023.08.25
Kubernetes 컴포넌트  (0) 2023.08.14
kubernetes 동작원리  (0) 2023.08.13