λ€μ΄κ°λ©°
μ¬λ΄μμ PODλ₯Ό μμ±ν λμ EFK StackμΌλ‘ ꡬμ±νκΈ°μ , PODλ³λ‘ logλ₯Ό μ μ₯ν΄μΌν μ΄μκ° μμμ΅λλ€. (λ¬Όλ‘ νλλ statelessνκ² κ΄λ¦¬λμ΄μΌνμ§λ§ μ΄λ€ μ΄μ λλ¬Έμ Statefulνκ² κ΄λ¦¬κ° λμμμ΅λλ€ γ
γ
,,,)
κ·Έλμ Deploymentλ ReplicasetμΌλ‘ PODλ₯Ό λμ°λ κ²μ΄ μλ Statefuleλ‘ PODλ₯Ό λμ°κ² λμμλλ°, κ·Έλ 곡μ μ€ν λ¦¬μ§ λ³Όλ₯¨μ΄ νμνμμμ΅λλ€. μ¬λ¬ μλ£λ₯Ό μ°Ύλ μ€ AWSμμ μ 곡λλ μλΉμ€μΈ EBS(Elastic Block Store)μ EFS(Elastic File System) μ¬μ΄μ κ³ λ―Όμ νμμκ³ , κ²°κ΅ μ¬λ¬ κ°μ©μμμ μ§μνλ EFSλ₯Ό μ ννκ² λμμ΅λλ€.
Volum
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 μλΉμ€μμ νμΌ μμ€ν
μ νλ μμ±ν©λλ€.
Create a AWS EFS AccessPoint
PODλ³λ‘ μλ λ°μ΄ν°λ₯Ό λ€ λ€λ₯΄κ² μ€μ ν΄μΌνλ Access Pointλ₯Ό μ€μ ν©λλ€.
μ λ μ΄ 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-saPOD μμ±νκΈ°
${} λΆλΆμ μ§μ μμ± ν΄μΌνλ λΆλΆμ λλ€.
storageClass
kind: StorageClass
apiVersion: storage.k8s.io/v1
metadata:
name: ${STORAGECLASS_NAME}
provisioner: efs.csi.aws.comμμ νμμΌλ‘ yamlνμΌμ μμ± ν ν μ μ©ν©λλ€.
result
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
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
POD
...
spec:
affinity:
nodeAffinity:
...
kubernetes.io/os: linux
volumes:
- name: data-path
persistentVolumeClaim:
claimName: efs-pv-app
---
...spec.containers.volumeMounts.claimNameμ μμμ μμ±ν΄λμλ pvc λͺ
μ μ μ΄μ€λλ€.
κ²°κ³Ό
κ·Έ ν mount νλ λλ ν λ¦¬λ‘ μ΄λνμ¬ λ°μ΄ν°λ€μ΄ μ μμ¬μλ νμΈν©λλ€.