이 문서에서는 볼륨 스냅샷을 만든 후 스냅샷을 사용하여 볼륨을 복원하는 방법을 보여줍니다. 이러한 안내는 vSphere CSI 드라이버를 사용하는 클러스터에 적용됩니다.
시작하기 전에
vSphere 컨테이너 스토리지 인터페이스 드라이버 사용을 읽습니다.
클러스터에 standard-rwo
라는 StorageClass가 있고 vSphere CSI 드라이버가 설치되었는지 확인합니다.
vSphere 버전, ESXi, vCenter Server가 7.0 업데이트 3 이상이어야 합니다. 자세한 내용은 스토리지 문제 해결을 참조하세요.
단계 개요
이 문서에 제공된 연습의 기본 단계는 다음과 같습니다.
- PersistentVolumeClaim을 만듭니다.
standard-rwo
스토리지 클래스를 요청하는 PersistentVolumeClaim을 만듭니다. 그런 후 클러스터가 PersistentVolume을 동적으로 프로비저닝하고 이를 PersistentVolumeClaim에 연결합니다.
- 배포를 만듭니다.
- 포드가 하나 있는 배포를 만듭니다. 포드는 PersistentVolumeClaim을 기준으로 볼륨을 지정합니다. 포드의 한 컨테이너가
/hello/
에서 볼륨을 마운트합니다.
- 파일을 포드 볼륨에 기록합니다.
- 포드 볼륨에
hello.txt
라는 파일을 만듭니다. 이 파일의 콘텐츠는 'Hello World!'입니다.
- VolumeSnapshot을 만듭니다.
- 포드 볼륨 상태를 캡처하는 VolumeSnapshot을 만듭니다.
- 파일을 손상시킵니다.
- 손상된 파일처럼 보이도록
hello.txt
파일을 수정합니다. 이제 파일 콘텐츠는 'Hello W-corrupted-file-orld!'입니다.
- 스냅샷을 사용하여 볼륨을 복원합니다.
- 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
앞의 매니페스트에서는 storageClassName
이 standard-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-pvc
를 my-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!
문제 해결
문제 해결 안내는 스토리지 문제 해결을 참조하세요.