스냅샷에서 볼륨 복원

이 문서에서는 볼륨 스냅샷을 만든 후 스냅샷을 사용하여 볼륨을 복원하는 방법을 보여줍니다. 이러한 안내는 vSphere CSI 드라이버를 사용하는 클러스터에 적용됩니다.

시작하기 전에

vSphere 컨테이너 스토리지 인터페이스 드라이버 사용을 읽습니다.

클러스터에 standard-rwo라는 StorageClass가 있고 vSphere CSI 드라이버가 설치되었는지 확인합니다.

vSphere 버전, ESXi, vCenter Server가 7.0 업데이트 3 이상이어야 합니다. 자세한 내용은 스토리지 문제 해결을 참조하세요.

단계 개요

이 문서에 제공된 연습의 기본 단계는 다음과 같습니다.

  1. PersistentVolumeClaim을 만듭니다.
    standard-rwo 스토리지 클래스를 요청하는 PersistentVolumeClaim을 만듭니다. 그런 후 클러스터가 PersistentVolume을 동적으로 프로비저닝하고 이를 PersistentVolumeClaim에 연결합니다.
  2. 배포를 만듭니다.
    포드가 하나 있는 배포를 만듭니다. 포드는 PersistentVolumeClaim을 기준으로 볼륨을 지정합니다. 포드의 한 컨테이너가 /hello/에서 볼륨을 마운트합니다.
  3. 파일을 포드 볼륨에 기록합니다.
    포드 볼륨에 hello.txt라는 파일을 만듭니다. 이 파일의 콘텐츠는 'Hello World!'입니다.
  4. VolumeSnapshot을 만듭니다.
    포드 볼륨 상태를 캡처하는 VolumeSnapshot을 만듭니다.
  5. 파일을 손상시킵니다.
    손상된 파일처럼 보이도록 hello.txt 파일을 수정합니다. 이제 파일 콘텐츠는 'Hello W-corrupted-file-orld!'입니다.
  6. 스냅샷을 사용하여 볼륨을 복원합니다.
    VolumeSnapshot을 데이터 소스로 사용하는 보조 PersistentVolumeClaim을 만듭니다. 볼륨이 새 PersistentVolumeClaim과 연결되도록 배포를 수정합니다. 그런 후 hello.txt 파일이 복원되었는지 확인합니다.

PersistentVolumeClaim 만들기

PersistentVolumeClaim의 매니페스트는 다음과 같습니다.

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

앞의 매니페스트에서는 storageClassNamestandard-rwo로 설정된 것을 볼 수 있습니다. 이것은 vSphere CSI 드라이버와 연관된 스토리지 클래스입니다.

my-pvc.yaml이라는 파일에 매니페스트를 저장합니다. PersistentVolumeClaim을 만들고 확인합니다.

kubectl --kubeconfig CLUSTER_KUBECONFIG apply -f my-pvc.yaml

kubectl --kubeconfig CLUSTER_KUBECONFIG get pvc my-pvc

출력에서 PersistentVolumeClaim이 동적으로 프로비저닝된 PersistentVolume에 바인딩된 것을 볼 수 있습니다. 예를 들어 다음 출력은 my-pvc라는 PersistentVolumeClaim이 pvc-467d211c-26e4-4d69-aaa5-42219aee6fd5라는 PersistentVolume에 바인딩된 것을 보여줍니다.

my-pvc   Bound    pvc-467d211c-26e4-4d69-aaa5-42219aee6fd5  …  standard-rwo   100s

배포 만들기

배포 매니페스트는 다음과 같습니다.

apiVersion: apps/v1
kind: Deployment
metadata:
  name: my-deployment
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: my-volume
          mountPath: /hello/
      volumes:
      - name: my-volume
        persistentVolumeClaim:
          claimName: my-pvc

이 연습에서는 이전 배포 매니페스트에 대해 다음 항목을 이해하는 것이 중요합니다.

  • 이전에 만든 my-pvc PersistentVolumeClaim을 지정하여 포드가 스토리지를 요청합니다.

  • 포드에 컨테이너 하나가 포함되고 이 컨테이너가 볼륨을 /hello/에 마운트합니다.

매니페스트를 my-deployment.yaml이라는 파일에 저장하고 배포를 만듭니다.

kubectl --kubeconfig CLUSTER_KUBECONFIG apply -f my-deployment.yaml

배포에 하나의 포드가 포함되어 있습니다. 이 포드의 이름을 가져옵니다.

kubectl --kubeconfig CLUSTER_KUBECONFIG get pods

포드 이름을 기록해 둡니다. 예를 들어 다음 출력에서 포드 이름은 my-deployment-7575c4f5bf-r59nt입니다.

my-deployment-7575c4f5bf-r59nt   1/1     Running   0          65s

포드 볼륨에 파일을 만들고 파일을 확인합니다.

kubectl --kubeconfig CLUSTER_KUBECONFIG \
    exec POD_NAME \
    -- sh -c 'echo "Hello World!" > /hello/hello.txt'

kubectl --kubeconfig CLUSTER_KUBECONFIG \
    exec POD_NAME \
    -- sh -c 'cat /hello/hello.txt'

출력에 /hello/hello.txt 파일의 콘텐츠가 표시됩니다.

Hello World!

스냅샷 만들기

VolumeSnapshot의 매니페스트는 다음과 같습니다.

apiVersion: snapshot.storage.k8s.io/v1
kind: VolumeSnapshot
metadata:
  name: my-snapshot
spec:
  volumeSnapshotClassName: csi-vsphere-snapshot-class
  source:
    persistentVolumeClaimName: my-pvc

매니페스트를 my-snapshot.yaml이라는 파일에 저장하고 VolumeSnapshot을 만듭니다.

kubectl --kubeconfig CLUSTER_KUBECONFIG apply -f my-snapshot.yaml

볼륨의 파일 손상시키기

손상된 것처럼 보이도록 hello.txt의 콘텐츠를 변경합니다.

kubectl --kubeconfig CLUSTER_KUBECONFIG \
    exec POD_NAME \
    -- sh -c 'echo "Hello W-corrupted-file-orld!" > /hello/hello.txt'

kubectl --kubeconfig CLUSTER_KUBECONFIG \
    exec POD_NAME \
    -- sh -c 'cat /hello/hello.txt'

출력에서 파일이 변경된 것을 볼 수 있습니다.

Hello W-corrupted-file-orld!

복원

보조 PersistentVolumeClaim의 매니페스트는 다음과 같습니다.

apiVersion: v1
kind: PersistentVolumeClaim
metadata:
  name: my-pvc-2
spec:
  storageClassName: standard-rwo
  dataSource:
    name: my-snapshot
    kind: VolumeSnapshot
    apiGroup: snapshot.storage.k8s.io
  accessModes:
    - ReadWriteOnce
  resources:
    requests:
      storage: 5Gi

앞의 매니페스트에서는 새 PersistentVolume 클레임의 데이터 소스가 이전에 만든 VolumeSnapshot임을 알 수 있습니다.

my-pvc-2.yaml이라는 파일에 매니페스트를 저장합니다. PersistentVolumeClaim을 만들고 확인합니다.

kubectl --kubeconfig CLUSTER_KUBECONFIG apply -f my-pvc-2.yaml

kubectl --kubeconfig CLUSTER_KUBECONFIG get pvc my-pvc-2

수정할 배포를 엽니다.

kubectl --kubeconfig CLUSTER_KUBECONFIG edit deployment my-deployment

my-pvcmy-pvc-2로 변경하고 편집기를 닫습니다.

…
  volumes:
  - name: my-volume
    persistentVolumeClaim:
    claimName: my-pvc-2

배포하면 포드가 삭제되고 새 PersistentVolumeClaim을 사용하는 새 포드가 생성됩니다.

몇 분 정도 기다린 후 새 포드 이름을 가져옵니다.

kubectl --kubeconfig CLUSTER_KUBECONFIG get pods

포드 볼륨이 복원되었는지 확인합니다.

kubectl --kubeconfig CLUSTER_KUBECONFIG \
   exec NEW_POD_NAME \
   -- sh -c 'cat /hello/hello.txt'

출력에 볼륨이 복원된 것으로 표시됩니다.

Hello World!

문제 해결

문제 해결 안내는 스토리지 문제 해결을 참조하세요.