ㅡ.ㅡ

[AWS] EFS 본문

ETC

[AWS] EFS

ekwkqk12 2021. 10. 21. 23:38

EKS VPC CIDR 추출

CLUSTER_NAME=클러스터 이름
VPC_ID=$(aws eks describe-cluster --name $CLUSTER_NAME --query "cluster.resourcesVpcConfig.vpcId" --output text)
CIDR_BLOCK=$(aws ec2 describe-vpcs --vpc-ids $VPC_ID --query "Vpcs[].CidrBlock" --output text)

EFS 보안그룹 생성

MOUNT_TARGET_GROUP_NAME="보안그룹 이름"
MOUNT_TARGET_GROUP_DESC="보안그룹 설명"
MOUNT_TARGET_GROUP_ID=$(aws ec2 create-security-group --group-name $MOUNT_TARGET_GROUP_NAME --description "$MOUNT_TARGET_GROUP_DESC" --vpc-id $VPC_ID | jq --raw-output '.GroupId')
aws ec2 authorize-security-group-ingress --group-id $MOUNT_TARGET_GROUP_ID --protocol tcp --port 2049 --cidr $CIDR_BLOCK

# 생성 및 확인
FILE_SYSTEM_ID=$(aws efs create-file-system | jq --raw-output '.FileSystemId')
aws efs describe-file-systems --file-system-id $FILE_SYSTEM_ID

EFS 탑재 대상 등록

EFS 탑재 대상에 EKS 퍼블릭 서브넷에 EFS 보안그룹을 적용하여 등록, 서브넷에 TAG1/2 값이 있어야됨

TAG1=tag:alpha.eksctl.io/cluster-name
TAG2=tag:kubernetes.io/role/elb
subnets=($(aws ec2 describe-subnets --filters "Name=$TAG1,Values=$CLUSTER_NAME" "Name=$TAG2,Values=1" | jq --raw-output '.Subnets[].SubnetId'))
for subnet in ${subnets[@]}
do
    echo "creating mount target in " $subnet
    aws efs create-mount-target --file-system-id $FILE_SYSTEM_ID --subnet-id $subnet --security-groups $MOUNT_TARGET_GROUP_ID
done

# 확인
aws efs describe-mount-targets --file-system-id $FILE_SYSTEM_ID | jq --raw-output '.MountTargets[].LifeCycleState'

EFS-CSI DRIVER 설치

kubectl kustomize \
    "github.com/kubernetes-sigs/aws-efs-csi-driver/deploy/kubernetes/overlays/stable/ecr?ref=release-1.3" > efs-csi-driver.yaml

# 이미지 변경(deployment.apps/efs-csi-controller, daemonset.apps/efs-csi-node)
image: 602401143452.dkr.ecr.ap-northeast-2.amazonaws.com/~~~~

# 설치
kubectl apply -f efs-csi-driver.yaml

Dynamic

EFS Access Point를 통해 볼륨을 공유하는 방식으로 볼륨을 요청시 자동으로 PVC에 정의된 값으로 볼륨이 생성됨
PersistentVolumeClaim

apiVersion: v1
kind: PersistentVolumeClaim
metadata:
  name: {{ .Values.app_name }}-pvc
spec:
  accessModes:
    - ReadWriteMany
  storageClassName: {{ .Values.app_name }}-sc
  resources:
    requests:
      storage: 5Gi

StorageClass

apiVersion: v1
kind: StorageClass
apiVersion: storage.k8s.io/v1
metadata:
  name: {{ .Values.app_name }}-sc
provisioner: efs.csi.aws.com
reclaimPolicy: Retain
parameters:
  provisioningMode: efs-ap
  fileSystemId: EFS 파일시스템 ID
  directoryPerms: "700"
  gidRangeStart: "1000"
  gidRangeEnd: "2000"
  basePath: AP에서의 경로, 미설정시 /로 지정

APP

volumeMounts:
  - name: persistent-storage
    mountPath: /aa
volumes:
  - name: persistent-storage
    persistentVolumeClaim:
      claimName: {{ .Values.app_name }}-pvc

Static

사용하려는 볼륨(EFS)를 미리 지정하여 요청시 PVC를 통해 파드와 볼륨을 연결
StorageClass

apiVersion: v1
kind: StorageClass
apiVersion: storage.k8s.io/v1
metadata:
  name: static-efs-stc
provisioner: efs.csi.aws.com

PersistentVolume

apiVersion: v1
kind: PersistentVolume
metadata:
  name: static-efs-pv
spec:
  capacity:
    storage: 5Gi
  volumeMode: Filesystem
  accessModes:
    - ReadWriteMany
  persistentVolumeReclaimPolicy: Retain
  storageClassName: static-efs-stc
  csi:
    driver: efs.csi.aws.com
    volumeHandle: EFS 파일시스템 ID

PersistentVolumeClaim

apiVersion: v1
kind: PersistentVolumeClaim
metadata:
  name: static-efs-pvc
spec:
  accessModes:
    - ReadWriteMany
  storageClassName: static-efs-stc
  resources:
    requests:
      storage: 5Gi

APP

volumeMounts:
  - name: static-efs-storage
    mountPath: /bb
volumes:
- name: static-efs-storage
    persistentVolumeClaim:
      claimName: static-efs-pvc

아래 이미지와 같이 2개의 파드에서 EFS를 통해 볼륨이 공유된것을 확인할 수 있다.

'ETC' 카테고리의 다른 글

[K8S Resource] ClusterAutoScaler  (0) 2023.10.22
[K8S Resource] Goldilocks  (0) 2023.10.22
[K8S Resource] Descheduler  (0) 2023.10.22
[Kubernetes Management] Rancher  (0) 2021.09.29
[Kubernetes Package Manager] Helm  (0) 2020.12.15