볼륨 스냅샷 사용

Google Kubernetes Engine(GKE)에서는 GKE 클러스터의 영구 볼륨에 Kubernetes 볼륨 스냅샷 기능을 사용할 수 있습니다.

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

버전 1.17 이상에서는 다음 구성요소로 볼륨 스냅샷을 프로비저닝하고 연결할 수 있습니다.

요구사항

GKE에서 볼륨 스냅샷을 사용하려면 다음 요구사항을 충족해야 합니다.

  • 스냅샷을 지원하는 CSI 드라이버를 설치해야 합니다. 스냅샷은 트리 내 영구 디스크 드라이버에서 지원되지 않습니다. Compute Engine 영구 디스크 CSI 드라이버를 사용 중인 경우 자동으로 드라이버를 배포하여 관리 오버헤드를 줄이는 것이 좋습니다. 스냅샷을 지원하는 모든 CSI 드라이버의 목록은 Kubernetes 문서의 드라이버에서 '기타 기능' 열을 참조하세요.

  • GKE 버전 1.17 이상인 제어 영역(마스터) 버전을 사용해야 합니다. VolumeSnapshot에서 Compute Engine 영구 디스크 CSI 드라이버를 사용하려면 GKE 버전 1.17.6-gke.4 이상을 사용합니다.

  • 스냅샷을 만들 기존 PersistentVolumeClaim이 있어야 하고, 스냅샷 소스에 사용되는 PersistentVolume은 CSI 드라이버로 관리되어야 합니다. PersistentVolume 사양의 driver: pd.csi.storage.gke.iocsi 섹션이 있는지 확인하여 CSI 드라이버를 사용 중인지 확인할 수 있습니다. 다음 섹션에 설명된 대로 CSI 드라이버로 PersistentVolume이 동적으로 프로비저닝된 경우 CSI 드라이버로 관리됩니다.

VolumeSnapshotClass 만들기

VolumeSnapshotClass를 만들어 CSI 드라이버와 VolumeSnapshot의 deletionPolicy를 확인합니다. VolumeSnapshot에서 VolumeSnapshotClass를 참조할 수 있습니다.

snapshot-class-example.yaml이라는 다음 매니페스트는 VolumeSnapshotClass의 예시입니다.

v1beta1

버전 1.23 이하를 실행하는 클러스터에는 v1beta1 API 버전을 사용합니다.

# snapshot-class-example.yaml
apiVersion: snapshot.storage.k8s.io/v1beta1
kind: VolumeSnapshotClass
metadata:
  name: snapshot-class
driver: csi-driver
deletionPolicy: Delete

v1

버전 1.21 이상을 실행하는 클러스터에 v1 API 버전을 사용합니다.

# snapshot-class-example.yaml
apiVersion: snapshot.storage.k8s.io/v1
kind: VolumeSnapshotClass
metadata:
  name: snapshot-class
driver: csi-driver
deletionPolicy: Delete

다음을 바꿉니다.

  • snapshot-class는 VolumeSnapshotClass의 이름입니다.
  • csi-driver는 스냅샷을 프로비저닝하는 데 사용할 CSI 드라이버를 지정합니다. 예를 들어 pd.csi.storage.gke.io를 추가하여 Compute Engine 영구 디스크 CSI 드라이버를 사용할 수 있습니다.
  • Delete는 바인딩된 VolumeSnapshot이 삭제될 때 VolumeSnapshotContent 객체가 삭제되도록 합니다. 또한 기본 스토리지 시스템의 스냅샷도 삭제합니다. VolumeSnapshotContent를 유지하려면 이 값을 Retain으로 설정하세요.

VolumeSnapshotClass를 만들려면 파일을 만든 후 다음 명령어를 실행합니다.

kubectl apply -f snapshot-class-example.yaml

VolumeSnapshot 만들기

VolumeSnapshot은 기존 PersistentVolumeClaim의 스냅샷에 대한 요청입니다.

snapshot-example.yaml이라는 다음 매니페스트는 VolumeSnapshot의 예시입니다.

v1beta1

버전 1.23 이하를 실행하는 클러스터에는 v1beta1 API 버전을 사용합니다.

#snapshot-example.yaml
apiVersion: snapshot.storage.k8s.io/v1beta1
kind: VolumeSnapshot
metadata:
  name: snapshot
spec:
  volumeSnapshotClassName: snapshot-class
  source:
    persistentVolumeClaimName: pvc

v1

버전 1.21 이상을 실행하는 클러스터에 v1 API 버전을 사용합니다.

#snapshot-example.yaml
apiVersion: snapshot.storage.k8s.io/v1
kind: VolumeSnapshot
metadata:
  name: snapshot
spec:
  volumeSnapshotClassName: snapshot-class
  source:
    persistentVolumeClaimName: pvc

다음을 바꿉니다.

  • snapshot은 VolumeSnapshot의 이름입니다.
  • snapshot-class는 참조하려는 VolumeSnapshotClass의 이름을 지정합니다. 값을 지정하지 않으면 기본 VolumeSnapshotClass가 사용됩니다(사용 가능한 경우).
  • pvc는 스냅샷을 만들려는 기존 PersistentVolumeClaim의 이름입니다.

VolumeSnapshot을 만들려면 파일을 만든 후 다음 명령어를 실행합니다.

kubectl apply -f snapshot-example.yaml

VolumeSnapshot 생성 확인

볼륨 스냅샷을 만든 후 해당 VolumeSnapshotContent 객체가 클러스터에 생성됩니다. 이 객체는 VolumeSnapshot 객체의 스냅샷과 결합을 저장합니다. VolumeSnapshotContents 객체와는 직접 상호작용하지 않습니다.

VolumeSnapshotContents가 생성되었는지 확인하려면 다음 명령어를 실행합니다.

kubectl get volumesnapshotcontents

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

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

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

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

사용할 준비가 되면 다음과 비슷한 출력이 표시됩니다.

NAME               READY
snapshot-example   true

VolumeSnapshot을 사용하여 볼륨 프로비저닝 및 복원

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

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

pvc-demo.yaml이라는 다음 매니페스트는 dataSource 필드를 추가하는 방법의 예시입니다.

# pvc-demo.yaml
apiVersion: v1
kind: PersistentVolumeClaim
metadata:
  name: pvc-demo
spec:
  dataSource:
    name: snapshot-name
    kind: VolumeSnapshot
    apiGroup: snapshot.storage.k8s.io
  accessModes:
    - ReadWriteOnce
  resources:
    requests:
      storage: 30Gi

dataSource에 다음 필드가 있는지 확인합니다.

  • snapshot-name은 사용할 VolumeSnapshot의 이름입니다.
  • kindVolumeSnapshot이어야 합니다.
  • apiGroupsnapshot.storage.k8s.io여야 합니다.

PersistentVolumeClaim에 변경사항을 적용하려면 다음 명령어를 실행합니다.

kubectl apply -f pvc-demo.yaml

VolumeSnapshot 삭제

VolumeSnapshot을 삭제하려면 다음 명령어를 실행합니다.

kubectl delete volumesnapshot snapshot-example

볼륨 스냅샷의 VolumeSnapshotClassdeletionPolicy:Delete가 있으면 스토리지 시스템의 해당 VolumeSnapshotContent와 물리적 스냅샷도 삭제됩니다. deletionPolicy:Retain이 있으면 GKE가 물리적 스냅샷을 유지합니다.

다음 단계