πŸ“ AWS EFSλ₯Ό μ‚¬μš©ν•˜μ—¬ POD Storage κ΅¬μ„±ν•˜κΈ°

2022λ…„ 11μ›” 13일

λ“€μ–΄κ°€λ©°

μ‚¬λ‚΄μ—μ„œ PODλ₯Ό 생성할 λ•Œμ— EFK Stack으둜 κ΅¬μ„±ν•˜κΈ°μ „, PODλ³„λ‘œ logλ₯Ό μ €μž₯ν•΄μ•Όν•  μ΄μŠˆκ°€ μžˆμ—ˆμŠ΅λ‹ˆλ‹€. (λ¬Όλ‘  νŒŒλ“œλŠ” statelessν•˜κ²Œ κ΄€λ¦¬λ˜μ–΄μ•Όν•˜μ§€λ§Œ μ–΄λ–€ 이유 λ•Œλ¬Έμ— Statefulν•˜κ²Œ 관리가 λ˜μ—ˆμ—ˆμŠ΅λ‹ˆλ‹€ γ…Žγ…Ž,,,)

κ·Έλž˜μ„œ Deploymentλ‚˜ Replicaset으둜 PODλ₯Ό λ„μš°λŠ” 것이 μ•„λ‹Œ Statefule둜 PODλ₯Ό λ„μš°κ²Œ λ˜μ—ˆμ—ˆλŠ”λ°, κ·Έλ•Œ 곡유 μŠ€ν† λ¦¬μ§€ λ³Όλ₯¨μ΄ ν•„μš”ν•˜μ˜€μ—ˆμŠ΅λ‹ˆλ‹€. μ—¬λŸ¬ 자료λ₯Ό 찾던 쀑 AWSμ—μ„œ μ œκ³΅λ˜λŠ” μ„œλΉ„μŠ€μΈ EBS(Elastic Block Store)와 EFS(Elastic File System) 사이에 고민을 ν•˜μ˜€μ—ˆκ³ , κ²°κ΅­ μ—¬λŸ¬ κ°€μš©μ˜μ—­μ„ μ§€μ›ν•˜λŠ” EFSλ₯Ό μ„ νƒν•˜κ²Œ λ˜μ—ˆμŠ΅λ‹ˆλ‹€.

Volum

pv

kubernetesμ—λŠ” 데이터λ₯Ό μ €μž₯ν•˜λŠ” Storage 즉, Volume을 μ œκ³΅ν•©λ‹ˆλ‹€. Container λ‹¨μœ„κ°€ μ•„λ‹ˆλΌ Pod λ‹¨μœ„μ΄κΈ° λ•Œλ¬Έμ— Pod에 속해 μžˆλŠ” μ—¬λŸ¬κ°œμ˜ μ»¨ν…Œμ΄λ„ˆκ°€ κ³΅μœ ν•΄μ„œ μ‚¬μš©ν•  수 μžˆμŠ΅λ‹ˆλ‹€.

μ—¬λŸ¬ λ³Όλ₯¨μ˜ μ’…λ₯˜κ°€ μžˆμ§€λ§Œ ν•΄λ‹Ή ν¬μŠ€νŠΈμ—μ„œλŠ” PersistentVolume에 λŒ€ν•΄μ„œ λ‹€λ£°λ €κ³  ν•©λ‹ˆλ‹€.

PersistentVolume

PV

PV(PersistenetVolume)μ΄λž€ Kubernetesμ—μ„œ κ΄€λ¦¬λ˜λŠ” μ €μž₯μ†Œλ‘œ Podμ™€λŠ” λ‹€λ₯Έ 수λͺ… 주기둜 κ΄€λ¦¬λ©λ‹ˆλ‹€. Podκ°€ μž¬μ‹€ν–‰ λ˜λ”λΌλ„, PV의 λ°μ΄ν„°λŠ” 정책에 따라 μœ μ§€/μ‚­μ œκ°€ λ©λ‹ˆλ‹€.

PVC

PVC(Persistent Volume Claim)λŠ” PVλ₯Ό μΆ”μƒν™”ν•˜μ—¬ κ°œλ°œμžκ°€ μ†μ‰½κ²Œ PVλ₯Ό μ‚¬μš© κ°€λŠ₯ν•˜κ²Œ λ§Œλ“€μ–΄μ£ΌλŠ” κΈ°λŠ₯μž…λ‹ˆλ‹€. κ°œλ°œμžλŠ” μ‚¬μš©μ— ν•„μš”ν•œ Volume의 크기, Volume의 정책을 μ„ νƒν•˜κ³  μš”μ²­λ§Œ ν•˜λ©΄ λ©λ‹ˆλ‹€. μš΄μ˜μžλŠ” 개발자의 μš”μ²­μ— 맞게 PV λ₯Ό μƒμ„±ν•˜κ²Œ 되고, PVCλŠ” ν•΄λ‹Ή PVλ₯Ό κ°€μ Έκ°€κ²Œ λ©λ‹ˆλ‹€. λ˜ν•œ, PVCλŠ” Namespace Object이기 λ•Œλ¬Έμ— Namespace에 depedencyκ°€ 걸리게 λ©λ‹ˆλ‹€.

AWS EFS

AWS EFS(Amazon Elastic File System)은 AWSAmazon Web Serviceμ—μ„œ μ œκ³΅ν•˜λŠ” λ§€λ‹ˆμ§€λ“œ NFS μ„œλ²„μž…λ‹ˆλ‹€. NFSλŠ” μ—¬λŸ¬ μ„œλ²„μ—μ„œ λ™μ‹œμ— 같은 νŒŒμΌμ„ κ³΅μœ ν•  λ•Œ νŽΈλ¦¬ν•˜κ²Œ μ‚¬μš©ν•  수 μžˆμ§€λ§Œ, 관리가 μ–΄λ ΅λ‹€λŠ” 단점이 μžˆμŠ΅λ‹ˆλ‹€. μ•„λ§ˆμ‘΄ EFSλ₯Ό μ‚¬μš©ν•˜λ©΄ μ’€ 더 μ‰½κ²Œ NFS둜 μ„œλ²„λ“€ 간에 νŒŒμΌμ„ κ³΅μœ ν•  수 μžˆμŠ΅λ‹ˆλ‹€. Kubernetes와 같은 λΆ„μ‚° ν™˜κ²½μ—μ„œλ„ 같은 μš©λ„μ˜ μ„œλ²„λ“€ 간에 곡유 μŠ€ν† λ¦¬μ§€λ‘œ EFSλ₯Ό μ‚¬μš©ν•  수 μžˆμŠ΅λ‹ˆλ‹€.

μ„€μ •ν•˜κΈ°

Create a AWS EFS

AWS console에 μ ‘μ†ν•˜μ—¬ AWS EFS μ„œλΉ„μŠ€μ—μ„œ 파일 μ‹œμŠ€ν…œμ„ ν•˜λ‚˜ μƒμ„±ν•©λ‹ˆλ‹€.

AWS_EFS_SET

Create a AWS EFS AccessPoint

PODλ³„λ‘œ μŒ“λŠ” 데이터λ₯Ό λ‹€ λ‹€λ₯΄κ²Œ μ„€μ •ν•΄μ•Όν•˜λ‹ˆ Access Pointλ₯Ό μ„€μ •ν•©λ‹ˆλ‹€.

AWS_EFS_AP

μ €λŠ” 총 5κ°€μ§€μ˜ Application이 있으며 각각 데이터λ₯Ό λ”°λ‘œ μˆ˜μ§‘ν•΄μ•Όν•˜κΈ° λ•Œλ¬Έμ— AccessPointλ₯Ό 5개 μƒμ„±ν•΄λ‘μ—ˆμŠ΅λ‹ˆλ‹€.

AccessPoint Mount

κ·Έ ν›„ ν—€λ”© 파일 μ‹œμŠ€ν…œκ³Ό 연동할 μ„œλ²„μ— μ ‘μ†ν•˜μ—¬ 폴더λ₯Ό 생성 ν•œ ν›„ Access Point λ₯Ό mount ν•©λ‹ˆλ‹€.

sudo mount -t efs -o tls,accesspoint=${ACCESSPOINT_ID} ${EFS_ID}:/ /${PATH}

Install AWS-CSI-Driver

λ¨Όμ € AWS-CSI-Driverλ₯Ό μ„€μΉ˜ν•©λ‹ˆλ‹€.

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.ap-northeast-2.amazonaws.com/eks/aws-efs-csi-driver \
    --set controller.serviceAccount.create=false \
    --set controller.serviceAccount.name=efs-csi-controller-sa

POD μƒμ„±ν•˜κΈ°

${} 뢀뢄은 직접 μž‘μ„± ν•΄μ•Όν•˜λŠ” λΆ€λΆ„μž…λ‹ˆλ‹€.

storageClass

kind: StorageClass
apiVersion: storage.k8s.io/v1
metadata:
  name: ${STORAGECLASS_NAME}
provisioner: efs.csi.aws.com

μœ„μ˜ ν˜•μ‹μœΌλ‘œ yamlνŒŒμΌμ„ μž‘μ„± ν•œ ν›„ μ μš©ν•©λ‹ˆλ‹€.

result

StorageClass

PersistentVolume

---
apiVersion: v1
kind: PersistentVolume
metadata:
  name: efs-pv-app
spec:
  capacity:
    storage: 5Gi
  volumeMode: Filesystem
  accessModes:
    - ReadWriteMany
  persistentVolumeReclaimPolicy: Retain
  storageClassName: ${STORAGECLASS_NAME}
  csi:
    driver: efs.csi.aws.com
    volumeHandle: ${ACCESSPOINT_ID}
---
...

metadate에 ν•΄λ‹Ή PV의 이름을 μž‘μ„±ν•΄μ£Όμ‹œκ³ , spec.storageClassName에 StorageClass의 이름을 μž‘μ„±ν•©λ‹ˆλ‹€. κ·Έ ν›„ spec.csi에 μ„€μ •ν•΄λ‘μ—ˆλ˜ AWS EFS Access Point에 λŒ€ν•œ λ‚΄μš©μ„ μž‘μ„±ν•©λ‹ˆλ‹€.

result

PV

PersistentVolumeClaim

apiVersion: v1
kind: PersistentVolumeClaim
metadata:
  name: efs-pv-app
  namespaces: ${APP_NAMESPACE}
spec:
  accessModes:
    - ReadWriteMany
  storageClassName: ${STORAGECLASS_NAME}
  resources:
    requests:
      storage: 5Gi
---
...

PVCλŠ” 생성해둔 PV와 맀핑이 λ˜μ–΄μ•Όν•©λ‹ˆλ‹€. κ·Έλ ‡κΈ° λ•Œλ¬Έμ— 이름을 κ°™κ²Œ 섀정해두어야 μžλ™μœΌλ‘œ λ§€ν•‘λ˜μ–΄ μƒμ„±λ©λ‹ˆλ‹€.

result

PVC

POD

...
    spec:
      affinity:
        nodeAffinity:
 ...
        kubernetes.io/os: linux
      volumes:
      - name: data-path
        persistentVolumeClaim:
          claimName: efs-pv-app
---
...

spec.containers.volumeMounts.claimName에 μœ„μ—μ„œ μƒμ„±ν•΄λ‘μ—ˆλ˜ pvc λͺ…을 μ μ–΄μ€λ‹ˆλ‹€.

κ²°κ³Ό

κ·Έ ν›„ mount ν–ˆλ˜ λ””λ ‰ν† λ¦¬λ‘œ μ΄λ™ν•˜μ—¬ 데이터듀이 잘 μŒ“μ—¬μžˆλ‚˜ ν™•μΈν•©λ‹ˆλ‹€.

RESULT

Reference