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
). 기본 스토리지 클래스에 바인딩하려면 비워 둡니다.
YAML을 클러스터에 적용합니다.
kubectl apply -f efs-claim.yaml
출력에서 PersistentVolumeClaim의 생성을 확인합니다.
persistentvolumeclaim/CLAIM_NAME created
동적
이 안내에서는 클러스터 관리자가 동적 프로비저닝을 위해 이미 하나 이상의 StorageClass를 프로비저닝했다고 가정합니다. 이 StorageClass를 사용하여 동적으로 프로비저닝된 PersistentVolume을 만들고 워크로드에서 기본 EFS 액세스 포인트를 사용하려면 PersistentVolumeClaim을 만듭니다.
PersistentVolumeClaim을 만들려면 다음 단계를 수행합니다. EFS CSI 드라이버는 표시된 StorageClass와 함께 이 PersistentVolumeClaim을 사용해서 PersistentVolume을 동적으로 프로비저닝합니다.
- 다음 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의 이름입니다. 기본 스토리지 클래스에 바인딩하려면 이 필드를 비워 두세요.
YAML을 클러스터에 적용합니다.
kubectl apply -f efs-claim.yaml
출력에서 PersistentVolumeClaim의 생성을 확인합니다.
persistentvolumeclaim/CLAIM_NAME created
StatefulSet 만들기
PersistentVolumeClaim을 만든 후 워크로드에서 사용할 수 있습니다.
이 섹션에서는 PersistentVolumeClaim을 사용하는 샘플 StatefulSet를 만듭니다.
spec.volumes
에서 클레임을 참조하여 포드 및 배포와 같은 다른 워크로드 유형과 함께 PersistentVolumeClaim을 사용할 수도 있습니다.
PersistentVolumeClaim에서 참조되는 EFS 리소스를 마운트하는 StatefulSet를 만들려면 다음 단계를 수행합니다.
다음 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
)으로 바꿉니다.YAML을 클러스터에 적용합니다.
kubectl apply -f efs-statefulset.yaml
출력에서 StatefulSet의 생성을 확인합니다.
statefulset.apps/efs-shell created
StatefulSet는 컨테이너 이미지를 다운로드하고 실행하는 데 몇 분 정도 걸릴 수 있습니다.
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
포드가 실행 중 상태가 되면
kubectl exec
를 사용하여 StatefulSet를 호스팅하는 포드에 연결합니다.kubectl exec -it efs-shell-0 -- bash
kubectl
명령어는 포드에서 셸을 실행합니다.EFS 리소스가 마운트되었는지 확인하려면
tail
명령어를 사용하여out.txt
파일의 콘텐츠를 확인합니다.tail /efs-data/out.txt
출력에 UTC의 최근 시간이 포함됩니다.
exit
명령어로 포드 연결을 해제합니다.exit
셸이 로컬 머신으로 돌아갑니다.
삭제
StatefulSet를 삭제하려면 kubectl delete
를 사용합니다.
kubectl delete -f efs-statefulset.yaml
다음 단계
- EFS 리소스 구성 방법 알아보기
- 워크로드에서 StorageClass를 사용하는 방법 알아보기