이 페이지에서는 Kubernetes 볼륨 스냅샷을 사용하여 Filestore 스토리지를 백업 및 복원하는 방법을 설명합니다.
Kubernetes 볼륨 스냅샷을 만드는 것은 Filestore 백업을 만드는 것과 동일합니다. 자세한 내용은 Kubernetes 볼륨 스냅샷 정보를 참조하세요.
요구사항
GKE에서 볼륨 스냅샷을 사용하려면 다음 요구사항을 충족해야 합니다.
Filestore CSI 드라이버를 배포해야 합니다. 다음 Filestore 서비스 등급만 지원됩니다.
- GKE 버전 1.21 이상을 사용하는 기본 HDD
- GKE 버전 1.21 이상을 사용하는 기본 SSD
- GKE 버전 1.27 이상을 사용하는 Zonal(10TiB~100TiB)
- GKE 버전 1.25 이상을 사용하는 엔터프라이즈
컨트롤 플레인 버전 1.17 이상을 사용합니다.
VolumeSnapshot
에서 Filestore CSI 드라이버를 사용하려면 서비스 등급에 해당하는 GKE 버전 번호를 사용합니다.
- 스냅샷에 사용할 기존
PersistentVolumeClaim
이 있어야 합니다. 스냅샷 소스에 사용하는PersistentVolume
은 CSI 드라이버로 관리되어야 합니다.PersistentVolume
사양의driver: pd.csi.storage.gke.io
또는filestore.csi.storage.gke.io
에csi
섹션이 있는지 확인하여 CSI 드라이버를 사용 중인지 확인할 수 있습니다. 다음 섹션에 설명된 대로 CSI 드라이버로PersistentVolume
이 동적으로 프로비저닝된 경우 CSI 드라이버로 관리됩니다.
제한사항
스냅샷 볼륨의 크기 제한은 일반 볼륨과 동일합니다. 예를 들어 Filestore 스냅샷은 기본 HDD 등급의 크기가 1TiB보다 크거나 같아야 합니다.
Filestore CSI 드라이버는 다음 Filestore 서비스 등급에 대한 동적 프로비저닝 또는 백업 워크플로를 지원하지 않습니다.
- 영역(1TiB~9.75TiB)
- 리전
한 번에 인스턴스당 하나의 공유만 백업할 수 있습니다. 스토리지 풀의 경우에는 두 개의 서로 다른 Filestore 인스턴스의 두 개의 서로 다른 공유에서 실행된 백업 요청이 동시에 실행됩니다.
단일 공유 백업은 단일 공유 볼륨으로만 복원할 수 있습니다. Filestore CSI 드라이버를 사용하면 단일 공유 볼륨을 새 Filestore 인스턴스로만 복원할 수 있습니다.
- 새 인스턴스는 백업과 동일한 서비스 등급을 사용해야 합니다.
- 새 인스턴스는 최소 용량이 백업과 동일하게 일치해야 합니다.
소스 또는 기존 Filestore 인스턴스에 대한 Filestore
backup restore
작업은 지원되지 않습니다. 기능 제한사항의 전체 목록은 Filestore 백업 기능 제한사항을 참조하세요.다중 공유 백업은 지원되지 않습니다.
시작하기 전에
시작하기 전에 다음 태스크를 수행했는지 확인합니다.
- Google Kubernetes Engine API를 사용 설정합니다. Google Kubernetes Engine API 사용 설정
- 이 태스크에 Google Cloud CLI를 사용하려면 gcloud CLI를 설치한 후 초기화합니다. 이전에 gcloud CLI를 설치한 경우
gcloud components update
를 실행하여 최신 버전을 가져옵니다.
볼륨 스냅샷 만들기 및 사용
이 문서의 예시에서는 다음 태스크를 수행하는 방법을 보여줍니다.
PersistentVolumeClaim
및Deployment
를 만듭니다.Deployment
에 사용되는PersistentVolume
에 파일을 추가합니다.- 스냅샷을 구성할
VolumeSnapshotClass
를 만듭니다. PersistentVolume
의 볼륨 스냅샷을 만듭니다.- 테스트 파일을 삭제합니다.
PersistentVolume
을 만든 스냅샷으로 복원합니다.- 복원이 완료되었는지 확인합니다.
볼륨 스냅샷을 사용하려면 다음 단계를 완료해야 합니다.
VolumeSnapshotClass
객체를 만들어 스냅샷의 CSI 드라이버 및 삭제 정책을 지정합니다.VolumeSnapshot
객체를 만들어 기존PersistentVolumeClaim
의 스냅샷을 요청합니다.PersistentVolumeClaim
에서VolumeSnapshot
을 참조하여 볼륨을 해당 스냅샷으로 복원하거나 스냅샷을 사용하여 새 볼륨을 만듭니다.
PersistentVolumeClaim
및 Deployment
만들기
PersistentVolumeClaim
객체를 만들려면 다음 매니페스트를my-pvc.yaml
로 저장합니다.Filestore
apiVersion: v1 kind: PersistentVolumeClaim metadata: name: my-pvc spec: storageClassName: enterprise-rwx accessModes: - ReadWriteMany resources: requests: storage: 1Ti
이 예시에서는 엔터프라이즈 등급 Filestore PVC를 만듭니다. 자세한 내용은 Filestore CSI 드라이버로 Filestore 인스턴스에 액세스를 참조하세요.
spec.storageClassName
에는 지원되는 CSI 드라이버를 사용하는 모든 스토리지 클래스를 지정할 수 있습니다.매니페스트를 적용합니다.
kubectl apply -f my-pvc.yaml
Deployment
를 만들려면 다음 매니페스트를my-deployment.yaml
로 저장합니다.apiVersion: apps/v1 kind: Deployment metadata: name: hello-app spec: selector: matchLabels: app: hello-app template: metadata: labels: app: hello-app spec: containers: - name: hello-app image: google/cloud-sdk:slim args: [ "sleep", "3600" ] volumeMounts: - name: sdk-volume mountPath: /usr/share/hello/ volumes: - name: sdk-volume persistentVolumeClaim: claimName: my-pvc
매니페스트를 적용합니다.
kubectl apply -f my-deployment.yaml
Deployment
의 상태를 확인합니다.kubectl get deployment hello-app
Deployment
를 준비하는 데 다소 시간이 걸릴 수 있습니다. 다음과 비슷한 출력이 표시될 때까지 위의 명령어를 실행하면 됩니다.NAME READY UP-TO-DATE AVAILABLE AGE hello-app 1/1 1 1 2m55s
볼륨에 테스트 파일 추가
Deployment
의Pods
를 나열합니다.kubectl get pods -l app=hello-app
출력은 다음과 비슷합니다.
NAME READY STATUS RESTARTS AGE hello-app-6d7b457c7d-vl4jr 1/1 Running 0 2m56s
Pod
에 테스트 파일을 만듭니다.kubectl exec POD_NAME \ -- sh -c 'echo "Hello World!" > /usr/share/hello/hello.txt'
POD_NAME
을Pod
이름으로 바꿉니다.파일이 있는지 확인합니다.
kubectl exec POD_NAME \ -- sh -c 'cat /usr/share/hello/hello.txt'
출력은 다음과 비슷합니다.
Hello World!
VolumeSnapshotClass
객체를 만듭니다.
볼륨 스냅샷의 CSI 드라이버와 deletionPolicy
를 지정하는 VolumeSnapshotClass
객체를 만듭니다. VolumeSnapshot
객체를 만들 때 VolumeSnapshotClass
객체를 참조할 수 있습니다.
다음 매니페스트를
volumesnapshotclass.yaml
로 저장합니다.Filestore
apiVersion: snapshot.storage.k8s.io/v1 kind: VolumeSnapshotClass metadata: name: my-snapshotclass driver: filestore.csi.storage.gke.io parameters: type: backup deletionPolicy: Delete
예를 들면 다음과 같습니다.
driver
필드는 CSI 드라이버에서 스냅샷을 프로비저닝하는 데 사용됩니다. 이 예시에서filestore.csi.storage.gke.io
에는 Filestore CSI 드라이버가 사용됩니다.deletionPolicy
필드는 바인딩된VolumeSnapshot
객체가 삭제될 때VolumeSnapshotContent
객체와 기본 스냅샷으로 수행할 작업을 GKE에 알려줍니다.VolumeSnapshotContent
객체 및 기본 스냅샷을 삭제하려면Delete
를 지정합니다.VolumeSnapshotContent
및 기본 스냅샷을 보존하려면Retain
을 지정합니다.
매니페스트를 적용합니다.
kubectl apply -f volumesnapshotclass.yaml
VolumeSnapshot
만들기
VolumeSnapshot
객체는 기존 PersistentVolumeClaim
객체의 스냅샷에 대한 요청입니다. VolumeSnapshot
객체를 만드는 경우 GKE는 PersistentVolume
객체와 같은 클러스터의 리소스인 VolumeSnapshotContent
객체를 사용하여 자동으로 만들고 바인딩합니다.
다음 매니페스트를
volumesnapshot.yaml
로 저장합니다.apiVersion: snapshot.storage.k8s.io/v1 kind: VolumeSnapshot metadata: name: my-snapshot spec: volumeSnapshotClassName: my-snapshotclass source: persistentVolumeClaimName: my-pvc
매니페스트를 적용합니다.
kubectl apply -f volumesnapshot.yaml
Volume
스냅샷을 만들면 GKE가 클러스터에 해당VolumeSnapshotContent
객체를 만듭니다. 이 객체는VolumeSnapshot
객체의 스냅샷과 바인딩을 저장합니다.VolumeSnapshotContents
객체와는 직접 상호작용하지 않습니다.GKE에서
VolumeSnapshotContents
객체를 만들었는지 확인합니다.kubectl get volumesnapshotcontents
출력은 다음과 비슷합니다.
NAME AGE snapcontent-cee5fb1f-5427-11ea-a53c-42010a1000da 55s
Volume
스냅샷 콘텐츠가 생성되면 VolumeSnapshotClass
가 지정한 CSI 드라이버가 해당 스토리지 시스템에 스냅샷을 만듭니다. GKE가 스토리지 시스템에서 스냅샷을 만들어 클러스터의 VolumeSnapshot
객체에 결합하면 스냅샷을 사용할 준비가 된 것입니다. 다음 명령어를 실행하여 상태를 확인할 수 있습니다.
kubectl get volumesnapshot \
-o custom-columns='NAME:.metadata.name,READY:.status.readyToUse'
스냅샷을 사용할 수 있으면 다음과 비슷한 출력이 표시됩니다.
NAME READY
my-snapshot true
테스트 파일 삭제
만든 테스트 파일을 삭제합니다.
kubectl exec POD_NAME \ -- sh -c 'rm /usr/share/hello/hello.txt'
파일이 더 이상 존재하지 않는지 확인합니다.
kubectl exec POD_NAME \ -- sh -c 'cat /usr/share/hello/hello.txt'
출력은 다음과 비슷합니다.
cat: /usr/share/hello/hello.txt: No such file or directory
볼륨 스냅샷 복원
PersistentVolumeClaim
의 VolumeSnapshot
을 참조하여 기존 볼륨의 데이터로 새 볼륨을 프로비저닝할 수 있습니다.
PersistentVolumeClaim
의 VolumeSnapshot
을 참조하려면 dataSource
필드를 PersistentVolumeClaim
에 추가합니다.
이 예시에서는 새 PersistentVolumeClaim
에서 만든 VolumeSnapshot
을 참조하고 새 클레임을 사용하도록 Deployment
를 업데이트합니다.
다음 매니페스트를
pvc-restore.yaml
로 저장합니다.Filestore
apiVersion: v1 kind: PersistentVolumeClaim metadata: name: pvc-restore spec: dataSource: name: my-snapshot kind: VolumeSnapshot apiGroup: snapshot.storage.k8s.io storageClassName: enterprise-rwx accessModes: - ReadWriteMany resources: requests: storage: 1Ti
매니페스트를 적용합니다.
kubectl apply -f pvc-restore.yaml
새
PersistentVolumeClaim
을 사용하도록my-deployment.yaml
파일을 업데이트합니다.... volumes: - name: my-volume persistentVolumeClaim: claimName: pvc-restore
업데이트된 매니페스트를 적용합니다.
kubectl apply -f my-deployment.yaml
스냅샷 복원 여부 확인
GKE가 업데이트된
Deployment
에 대해 만드는 새Pod
의 이름을 가져옵니다.kubectl get pods -l app=hello-app
테스트 파일이 있는지 확인합니다.
kubectl exec NEW_POD_NAME \
-- sh -c 'cat /usr/share/hello/hello.txt'
NEW_POD_NAME
을 GKE가 만든 새 Pod
의 이름으로 바꿉니다.
출력은 다음과 비슷합니다.
Hello World!
기존 스냅샷 가져오기
현재 클러스터 외부에서 만든 기존 볼륨 스냅샷을 사용하여 VolumeSnapshotContents
객체를 수동으로 프로비저닝할 수 있습니다. 예를 들어 다른 클러스터에서 만든 다른 Google Cloud 리소스의 스냅샷으로 GKE의 볼륨을 채울 수 있습니다.
스냅샷 이름을 찾습니다.
Google Cloud 콘솔
Google Cloud CLI
다음 명령어를 실행합니다.
gcloud compute snapshots list
출력은 다음과 비슷합니다.
NAME DISK_SIZE_GB SRC_DISK STATUS snapshot-5e6af474-cbcc-49ed-b53f-32262959a0a0 1 us-central1-b/disks/pvc-69f80fca-bb06-4519-9e7d-b26f45c1f4aa READY
다음
VolumeSnapshot
매니페스트를restored-snapshot.yaml
로 저장합니다.apiVersion: snapshot.storage.k8s.io/v1 kind: VolumeSnapshot metadata: name: restored-snapshot spec: volumeSnapshotClassName: my-snapshotclass source: volumeSnapshotContentName: restored-snapshot-content
매니페스트를 적용합니다.
kubectl apply -f restored-snapshot.yaml
다음
VolumeSnapshotContent
매니페스트를restored-snapshot-content.yaml
로 저장합니다.snapshotHandle
필드를 프로젝트 ID 및 스냅샷 이름으로 바꿉니다. 양방향 바인딩이 유효하려면volumeSnapshotRef.name
과volumeSnapshotRef.namespace
가 모두 이전에 만든VolumeSnapshot
를 가리켜야 합니다.apiVersion: snapshot.storage.k8s.io/v1 kind: VolumeSnapshotContent metadata: name: restored-snapshot-content spec: deletionPolicy: Retain driver: filestore.csi.storage.gke.io source: snapshotHandle: projects/PROJECT_ID/global/snapshots/SNAPSHOT_NAME volumeSnapshotRef: kind: VolumeSnapshot name: restored-snapshot namespace: default
매니페스트를 적용합니다.
kubectl apply -f restored-snapshot-content.yaml
다음
PersistentVolumeClaim
매니페스트를restored-pvc.yaml
로 저장합니다. Kubernetes 스토리지 컨트롤러는restored-snapshot
이라는VolumeSnapshot
을 찾은 다음PersistentVolume
을 데이터 소스로 찾거나 동적으로 만들려고 시도합니다. 그런 다음 이 PVC를 포드에서 활용하여 복원된 데이터에 액세스할 수 있습니다.apiVersion: v1 kind: PersistentVolumeClaim metadata: name: restored-pvc spec: dataSource: name: restored-snapshot kind: VolumeSnapshot apiGroup: snapshot.storage.k8s.io storageClassName: enterprise-rwx accessModes: - ReadWriteOnce resources: requests: storage: 1Gi
매니페스트를 적용합니다.
kubectl apply -f restored-pvc.yaml
PersistentVolumeClaim
을 참조하여 다음Pod
매니페스트를restored-pod.yaml
로 저장합니다. CSI 드라이버는PersistentVolume
을 프로비저닝하고 스냅샷에서 이를 채웁니다.apiVersion: v1 kind: Pod metadata: name: restored-pod spec: containers: - name: busybox image: busybox args: - sleep - "3600" volumeMounts: - name: source-data mountPath: /demo/data volumes: - name: source-data persistentVolumeClaim: claimName: restored-pvc readOnly: false
매니페스트를 적용합니다.
kubectl apply -f restored-pod.yaml
파일이 복원되었는지 확인합니다.
kubectl exec restored-pod -- sh -c 'cat /demo/data/hello.txt'
삭제
이 페이지에서 사용한 리소스 비용이 Google Cloud 계정에 청구되지 않도록 하려면 다음 단계를 수행합니다.
VolumeSnapshot
을 삭제합니다.kubectl delete volumesnapshot my-snapshot
VolumeSnapshotClass
를 삭제합니다.kubectl delete volumesnapshotclass my-snapshotclass
Deployment
를 삭제합니다.kubectl delete deployments hello-app
PersistentVolumeClaim
객체를 삭제합니다.kubectl delete pvc my-pvc pvc-restore
다음 단계
- Kubernetes 볼륨 스냅샷 문서 읽어보기
- 볼륨 확장에 대해 알아보기
- CSI 드라이버 수동 설치 방법 알아보기
- GKE용 파일 스토리지 옵션인 Filestore에 대해 알아보기