PersistentVolume 스냅샷 만들기

GKE 클러스터의 영구 볼륨 및 동적 프로비저닝에 Kubernetes 볼륨 스냅샷 기능을 사용할 수 있습니다.

볼륨 스냅샷을 사용하면 특정 시점의 볼륨 사본을 만들 수 있습니다. 이 복사본을 사용하여 볼륨을 이전 상태로 되돌리거나 대체 볼륨을 프로비저닝할 수 있습니다.

다음 구성요소로 볼륨 스냅샷을 프로비저닝하고 연결할 수 있습니다.

요구사항

AWS용 GKE에서 볼륨 스냅샷을 사용하려면 다음이 필요합니다.

  • 스냅샷을 지원하는 컨테이너 스토리지 인터페이스(CSI) 드라이버를 사용하는 볼륨 AWS용 GKE가 기본적으로 사용하는 Elastic Block Store(EBS) 드라이버는 스냅샷을 지원합니다.

    스냅샷을 지원하는 모든 CSI 드라이버의 목록은 Kubernetes 문서의 드라이버에서 '기타 기능' 열을 참조하세요.

  • 스냅샷에 사용할 기존 PersistentVolumeClaim이 있어야 합니다. 스냅샷 소스에 사용하는 PersistentVolume은 CSI 드라이버로 관리되어야 합니다. PersistentVolume 사양의 driver: ebs.csi.aws.comcsi 섹션이 있는지 확인하여 CSI 드라이버를 사용 중인지 확인할 수 있습니다. 다음 섹션의 설명대로 클러스터가 CSI 드라이버에서 동적으로 PersistentVolumes를 프로비저닝하면 CSI 드라이버로 관리됩니다.

시작하기 전에

볼륨 스냅샷 만들기 및 사용

이 문서의 예시에서는 다음 작업을 수행하는 방법을 보여줍니다.

  1. PersistentVolumeClaimPod 예시 만들기
  2. VolumeSnapshot 만들기
  3. 볼륨 스냅샷 복원하기
  4. 복원이 완료되었는지 확인하기

볼륨 스냅샷을 사용하려면 다음 단계를 완료해야 합니다.

  1. VolumeSnapshot 객체를 만들어 기존 PersistentVolumeClaim의 스냅샷을 요청합니다.
  2. PersistentVolumeClaim에서 VolumeSnapshot을 참조하여 볼륨을 해당 스냅샷으로 복원하거나 스냅샷을 사용하여 새 볼륨을 만듭니다.

PersistentVolumeClaimPod 예시 만들기

  1. PersistentVolumeClaim 객체를 만들려면 다음 매니페스트를 example-pvc.yaml로 저장합니다.

    apiVersion: v1
    kind: PersistentVolumeClaim
    metadata:
      name: example-pvc
    spec:
      storageClassName: standard-rwo
      accessModes:
      - ReadWriteOnce
      resources:
        requests:
          storage: 1Gi
    

    spec.storageClassName에는 지원되는 CSI 드라이버를 사용하는 모든 스토리지 클래스를 지정할 수 있습니다. 이 예시에서는 기본 standard-rwo 스토리지 클래스를 사용합니다.

  2. 매니페스트 적용

    kubectl apply -f example-pvc.yaml
    
  3. 현재 날짜와 시간을 볼륨에 쓰는 포드를 만듭니다. 포드를 만들려면 다음 매니페스트를 snapshot-shell.yaml로 저장합니다.

    apiVersion: v1
    kind: Pod
    metadata:
      name: snapshot-shell
    spec:
      terminationGracePeriodSeconds: 10
      containers:
      - name: linux
        image: ubuntu:bionic
        command: ["/bin/sh"]
        args: ["-c", "echo $(date -u) >> /data/out.txt"]
        volumeMounts:
        - name: snapshot-volume
          mountPath: /data
      restartPolicy: Never
      volumes:
      - name: snapshot-volume
        persistentVolumeClaim:
          claimName: example-pvc
    
  4. 매니페스트 적용

    kubectl apply -f snapshot-shell.yaml
    
  5. 포드 상태를 확인합니다.

    kubectl get pod snapshot-shell
    

    포드가 실행 및 완료되는 데 다소 시간이 걸릴 수 있습니다. 다음과 비슷한 출력이 표시될 때까지 위의 명령어를 실행하면 됩니다.

    NAME             READY   STATUS      RESTARTS   AGE
    snapshot-shell   0/1     Completed   0          24s
    

VolumeSnapshot 만들기

VolumeSnapshot 객체는 기존 PersistentVolumeClaim 객체의 스냅샷에 대한 요청입니다. VolumeSnapshot 객체를 만드는 경우 클러스터는 PersistentVolume 객체와 같은 클러스터의 리소스인 VolumeSnapshotContent 객체를 사용하여 자동으로 만들고 바인딩합니다.

  1. 다음 매니페스트를 volumesnapshot.yaml로 저장합니다.

    apiVersion: snapshot.storage.k8s.io/v1
    kind: VolumeSnapshot
    metadata:
      name: example-snapshot
    spec:
      source:
        persistentVolumeClaimName: example-pvc
    
  2. 매니페스트 적용

    kubectl apply -f volumesnapshot.yaml
    

    볼륨 스냅샷을 만들면 클러스터에서 해당 VolumeSnapshotContent 객체를 만듭니다. 이 객체는 VolumeSnapshot 객체의 스냅샷과 바인딩을 저장합니다. VolumeSnapshotContents 객체와는 직접 상호작용하지 않습니다.

  3. 클러스터에서 VolumeSnapshotContents 객체를 만들었는지 확인합니다.

    kubectl get volumesnapshotcontents
    

    출력은 다음과 비슷합니다.

    NAME                                               AGE
    snapcontent-cee5fb1f-5427-11ea-a53c-42010a1000da   55s
    

볼륨 스냅샷이 준비되었는지 확인

볼륨 스냅샷 콘텐츠가 생성되면 VolumeSnapshotClass에서 지정한 CSI 드라이버가 해당 스토리지 시스템에 스냅샷을 만듭니다. 클러스터가 스토리지 시스템에 스냅샷을 만들고 VolumeSnapshot 객체에 바인딩하면 스냅샷을 사용할 수 있습니다. 다음 명령어를 실행하여 상태를 확인할 수 있습니다.

kubectl get volumesnapshot \
  -o custom-columns='NAME:.metadata.name,READY:.status.readyToUse'

스냅샷을 사용할 수 있으면 다음과 비슷한 출력이 표시됩니다.

NAME                    READY
example-snapshot        true

볼륨 스냅샷 복원

PersistentVolumeClaimVolumeSnapshot을 참조하여 기존 볼륨의 데이터가 포함된 새 볼륨을 프로비저닝하거나 스냅샷으로 캡처한 상태로 볼륨을 복원할 수 있습니다.

PersistentVolumeClaimVolumeSnapshot을 참조하려면 dataSource 필드를 PersistentVolumeClaim에 추가합니다.

이 예시에서는 새 PersistentVolumeClaim에서 만든 VolumeSnapshot을 참조하고 PersistentVolumeClaim을 마운트하는 포드를 만듭니다.

  1. 다음 매니페스트를 pvc-restore.yaml로 저장합니다.

    apiVersion: v1
    kind: PersistentVolumeClaim
    metadata:
     name: pvc-restore
    spec:
     dataSource:
       name: example-snapshot
       kind: VolumeSnapshot
       apiGroup: snapshot.storage.k8s.io
     storageClassName: standard-rwo
     accessModes:
       - ReadWriteOnce
     resources:
       requests:
         storage: 1Gi
    
  2. 매니페스트 적용

    kubectl apply -f pvc-restore.yaml
    
  3. PVC를 포드에 마운트하고 out.txt 콘텐츠를 로그로 출력하는 임시 포드를 시작합니다.

    다음 매니페스트를 restore-log.yaml로 저장합니다.

    apiVersion: v1
    kind: Pod
    metadata:
      name: restore-verify
    spec:
      volumes:
        - name: restore-data
          persistentVolumeClaim:
            claimName: pvc-restore
      containers:
        - name: shell-container
          image: ubuntu:bionic
          volumeMounts:
            - mountPath: "/data"
              name: restore-data
          command: [ "/bin/sh" ]
          args: ["-c", "cat /data/out.txt", "exit", "1"]
      restartPolicy: Never
    
  4. 매니페스트 적용

    kubectl apply -f restore-log.yaml
    

스냅샷 복원 여부 확인

이전 단계에서 만든 포드가 스냅샷에서 읽습니다. 스냅샷에서 데이터를 보려면 kubectl logs 명령어를 사용합니다.

kubectl logs restore-verify

출력에는 스냅샷의 타임스탬프가 포함되어야 합니다.

삭제

이 페이지에서 사용한 리소스에 대한 비용이 발생하지 않도록 하려면 다음 단계를 수행합니다.

  1. VolumeSnapshot을 삭제합니다.

    kubectl delete volumesnapshot example-snapshot
    

  2. 임시 포드를 삭제합니다.

    kubectl delete -f restore-log.yaml
    
  3. 포드를 삭제합니다.

    kubectl delete -f snapshot-shell.yaml
    
  4. PersistentVolumeClaim 객체를 삭제합니다.

    kubectl delete pvc example-pvc pvc-restore
    

다음 단계