EFS 리소스 사용

Elastic File System(EFS)은 클러스터에 스토리지(디스크 공간)를 제공하기 위한 기본 AWS 메커니즘입니다. PersistentVolume은 EFS 스토리지를 워크로드에 제공하고 연결된 워크로드가 없을 경우에도 지속되도록 보장하는 클러스터 리소스입니다. 이 주제에서는 워크로드가 PersistentVolumeClaim으로 PersistentVolume에 액세스하는 방법을 설명합니다.

AWS용 GKE는 지원되는 모든 Kubernetes 버전에서 PersistentVolume의 정적 프로비저닝을 지원합니다. Kubernetes 버전 1.24 이상의 클러스터의 경우 AWS용 GKE는 동적 프로비저닝도 지원합니다. 동적 프로비저닝을 사용하려면 클러스터 관리자가 이를 구성해야 합니다. 자세한 내용은 PersistentVolume 구성을 참조하세요.

PersistentVolumeClaim 만들기

워크로드를 정적 또는 동적으로 프로비저닝된 영구 볼륨에 연결할지 여부에 따라 아래에서 적절한 탭을 선택하세요.

정적

이 안내에서는 클러스터 관리자가 이미 하나 이상의 PersistentVolume을 프로비저닝했다고 가정합니다. 이 PersistentVolume에 액세스하고 워크로드에 기본 EFS를 사용하려면 PersistentVolumeClaim을 만듭니다.

정적으로 프로비저닝된 PersistentVolume에 대해 PersistentVolumeClaim을 만들려면 다음 YAML 매니페스트를 efs-claim.yaml이라는 파일에 복사합니다.

apiVersion: v1
kind: PersistentVolumeClaim
metadata:
  name: CLAIM_NAME
spec:
  accessModes:
    - ReadWriteMany
  storageClassName: "" # Leave as empty string for static provisioning
  resources:
    requests:
      storage: 5Gi

다음과 같이 바꿉니다.

  • CLAIM_NAME: PersistentVolumeClaim에 바인딩할 이름입니다(예: efs-claim1). 기본 스토리지 클래스에 바인딩하려면 비워 둡니다.
  1. YAML을 클러스터에 적용합니다.

      kubectl apply -f efs-claim.yaml
    

    출력에서 PersistentVolumeClaim의 생성을 확인합니다.

    persistentvolumeclaim/CLAIM_NAME created
    

동적

이 안내에서는 클러스터 관리자가 동적 프로비저닝을 위해 이미 하나 이상의 StorageClass를 프로비저닝했다고 가정합니다. 이 StorageClass를 사용하여 동적으로 프로비저닝된 PersistentVolume을 만들고 워크로드에서 기본 EFS 액세스 포인트를 사용하려면 PersistentVolumeClaim을 만듭니다.

PersistentVolumeClaim을 만들려면 다음 단계를 수행합니다. EFS CSI 드라이버는 표시된 StorageClass와 함께 이 PersistentVolumeClaim을 사용해서 PersistentVolume을 동적으로 프로비저닝합니다.

  1. 다음 YAML 매니페스트를 efs-claim.yaml이라는 파일에 복사합니다.
apiVersion: v1
kind: PersistentVolumeClaim
metadata:
  name: CLAIM_NAME
spec:
  accessModes:
    - ReadWriteMany
  storageClassName: "EFS_STORAGE_CLASS_NAME"
  resources:
    requests:
      storage: 5Gi

다음과 같이 바꿉니다.

  • CLAIM_NAME: PersistentVolumeClaim에 대해 선택한 이름(예: efs-claim1)입니다.
  • EFS_STORAGE_CLASS_NAME: PersistentVolumeClaim을 바인딩하려는 StorageClass의 이름입니다. 기본 스토리지 클래스에 바인딩하려면 이 필드를 비워 두세요.
  1. YAML을 클러스터에 적용합니다.

      kubectl apply -f efs-claim.yaml
    

    출력에서 PersistentVolumeClaim의 생성을 확인합니다.

    persistentvolumeclaim/CLAIM_NAME created
    

StatefulSet 만들기

PersistentVolumeClaim을 만든 후 워크로드에서 사용할 수 있습니다. 이 섹션에서는 PersistentVolumeClaim을 사용하는 샘플 StatefulSet를 만듭니다. spec.volumes에서 클레임을 참조하여 포드 및 배포와 같은 다른 워크로드 유형과 함께 PersistentVolumeClaim을 사용할 수도 있습니다.

PersistentVolumeClaim에서 참조되는 EFS 리소스를 마운트하는 StatefulSet를 만들려면 다음 단계를 수행합니다.

  1. 다음 YAML 매니페스트를 efs-statefulset.yaml이라는 파일에 복사합니다. 이 예시 매니페스트는 /efs-data에 EFS 리소스를 마운트하는 Ubuntu Linux 컨테이너를 실행합니다. 컨테이너는 5초마다 out.txt라는 EFS 리소스의 파일에 씁니다.

    apiVersion: apps/v1
    kind: StatefulSet
    metadata:
      name: efs-shell
    spec:
      selector:
        matchLabels:
          app: test-efs
      serviceName: efs-app
      replicas: 1
      template:
        metadata:
          labels:
            app: test-efs
        spec:
          terminationGracePeriodSeconds: 10
          containers:
          - name: linux
            image: ubuntu:bionic
            command: ["/bin/sh"]
            args: ["-c", "while true; do echo $(date -u) >> /efs-data/out.txt; sleep 5; done"]
            volumeMounts:
            - name: efs-volume
              mountPath: /efs-data
          volumes:
          - name: efs-volume
            persistentVolumeClaim:
              claimName: CLAIM_NAME
    

    CLAIM_NAME을 이전에 지정한 PersistentVolumeClaim 이름(예: efs-claim1)으로 바꿉니다.

  2. YAML을 클러스터에 적용합니다.

     kubectl apply -f efs-statefulset.yaml
    

    출력에서 StatefulSet의 생성을 확인합니다.

    statefulset.apps/efs-shell created
    

    StatefulSet는 컨테이너 이미지를 다운로드하고 실행하는 데 몇 분 정도 걸릴 수 있습니다.

  3. kubectl get pods로 StatefulSet의 포드가 Running 상태인지 확인합니다.

      kubectl get pods -l app=test-efs
    

    출력에는 포드 이름과 포드 상태가 포함됩니다. 다음 응답에서 포드의 이름은 efs-shell-0입니다.

    NAME          READY   STATUS    RESTARTS   AGE
    efs-shell-0   1/1     Running   0          1m
    
  4. 포드가 실행 중 상태가 되면 kubectl exec를 사용하여 StatefulSet를 호스팅하는 포드에 연결합니다.

      kubectl exec -it efs-shell-0 -- bash
    

    kubectl 명령어는 포드에서 셸을 실행합니다.

  5. EFS 리소스가 마운트되었는지 확인하려면 tail 명령어를 사용하여 out.txt 파일의 콘텐츠를 확인합니다.

    tail /efs-data/out.txt
    

    출력에 UTC의 최근 시간이 포함됩니다.

  6. exit 명령어로 포드 연결을 해제합니다.

      exit
    

    셸이 로컬 머신으로 돌아갑니다.

삭제

StatefulSet를 삭제하려면 kubectl delete를 사용합니다.

  kubectl delete -f efs-statefulset.yaml

다음 단계