파일공유를 위한 NAS 스토리지 생성과 설정

파일공유를 위한 NAS 스토리지 생성과 설정

여러 서비스간 파일공유를 위한 NFS 생성과 설정

이번 랩에서는 여러 마이크로서비스간 파일 공유를 위해 일반적으로 NAS(Network Attached Storage)로 알려진 NFS 파일시스템을 AWS 클라우드에 생성하고, 이를 주문서비스에서 마운트시켜 스토리지로 활용하는 예제를 실습한다.

StorageClass (Dynamic PV Provisioning) 확인

kubectl get storageclass
  • 아래와 같은 결과가 출력되었는지 확인해 줍니다.
NAME            PROVISIONER             RECLAIMPOLICY   VOLUMEBINDINGMODE      ALLOWVOLUMEEXPANSION   AGE
gp2 (default)   kubernetes.io/aws-ebs   Delete          WaitForFirstConsumer   false                  2d1h

1. 관리콘솔을 통한 파일시스템 생성

NFS 파일시스템은 AWS CLI(https://docs.aws.amazon.com/ko_kr/eks/latest/userguide/efs-csi.html)로도 가능하나 본랩에서는 교재를 참조하여 관리콘솔을 통해 생성해 본다.

파일시스템 생성 후, 아래 순서에 따라 차례대로 EFS 프로비저너를 등록한다.

2. 프로비저너 등록 및 볼륨 생성

EFS 연계를 위한 EKS 계정 생성 및 Role 설정

  • ServerAccount 생성
kubectl apply -f - <<EOF
apiVersion: v1
kind: ServiceAccount
metadata:
  name: efs-provisioner
EOF	

서비스 계정(efs-provisioner)에 권한(rbac) 설정

kubectl apply -f https://raw.githubusercontent.com/event-storming/container-orchestration/master/yaml/volume/aws/efs-rbac.yaml

EKS에 EFS 프로비저너 설치

  • 아래 YAML 을 복사하여 efs-provisioner.yaml로 붙여넣기 한다.
apiVersion: apps/v1
kind: Deployment
metadata:
  name: efs-provisioner
spec:
  replicas: 1
  strategy:
    type: Recreate
  selector:
    matchLabels:
      app: efs-provisioner
  template:
    metadata:
      labels:
        app: efs-provisioner
    spec:
      serviceAccount: efs-provisioner
      containers:
        - name: efs-provisioner
          image: quay.io/external_storage/efs-provisioner:latest
          env:
            - name: FILE_SYSTEM_ID
              value: # {efs system id}
            - name: AWS_REGION
              value: # {region code}
            - name: PROVISIONER_NAME
              value: my-aws.com/aws-efs
          volumeMounts:
            - name: pv-volume
              mountPath: /persistentvolumes
      volumes:
        - name: pv-volume
          nfs:
            server: # {efs dns server name}
            path: /
  • 이 중, FILE_SYSTEM_ID, AWS_REGION, volumes.nfs.server 정보를 커스터마이징한다.

    value: #{efs system id} => 파일 시스템 ID value: # {aws region} => EKS 리전 server: # {file-system-id}.efs.{aws-region}.amazonaws.com

  • NFS 생성을 위한 Provisioner를 설치한다.
kubectl apply -f efs-provisioner.yaml
  • 생성된 Provisioner를 StorageClass에 등록
kubectl apply -f - <<EOF
kind: StorageClass
apiVersion: storage.k8s.io/v1
metadata:
  name: aws-efs
provisioner: my-aws.com/aws-efs
EOF
kubectl get sc
  • 아래와 같은 결과가 출력되었는지 확인해 줍니다.
NAME            PROVISIONER             RECLAIMPOLICY   VOLUMEBINDINGMODE      ALLOWVOLUMEEXPANSION   AGE
aws-efs         my-aws.com/aws-efs      Delete          Immediate              false                  4s
gp2 (default)   kubernetes.io/aws-ebs   Delete          WaitForFirstConsumer   false                  2d2h

EFS Provisioner를 사용하는 pvc 생성

kubectl apply -f - <<EOF
apiVersion: v1
kind: PersistentVolumeClaim
metadata:
  name: aws-efs
  labels:
    app: test-pvc
spec:
  accessModes:
  - ReadWriteMany
  resources:
    requests:
      storage: 1Mi
  storageClassName: aws-efs
	EOF
  • 아래와 같은 결과가 출력되었는지 확인해 줍니다.

    persistentvolumeclaim/aws-efs created

pvc 조회

kubectl get pvc
  • 아래와 같은 결과가 출력되었는지 확인해 줍니다.
NAME      STATUS    VOLUME   CAPACITY   ACCESS MODES   STORAGECLASS   AGE
aws-efs   Bound                                        aws-efs        59s

NFS 볼륨을 가지는 주문마이크로서비스 배포

kubectl apply -f - <<EOF
kind: Pod
apiVersion: v1
metadata:
  name: order
spec:
  containers:
  - name: order
    image: ghcr.io/acmexii/order-liveness:latest
    resources:
      requests:
        cpu: 100m
        memory: 128Mi
      limits:
        cpu: 250m
        memory: 256Mi
    volumeMounts:
    - mountPath: "/mnt/data"
      name: volume
  volumes:
    - name: volume
      persistentVolumeClaim:
        claimName: aws-efs
EOF
  • 배포 후 주문 컨테이너에 접속하여 제대로 파일시스템이 마운트되었는지 확인한다.
kubectl exec -it [ORDER POD 객체] -- /bin/sh
ls /mnt/data