볼륨 스냅샷 사용

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

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

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

요구사항

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

  • 스냅샷을 지원하는 CSI 드라이버를 사용합니다. 스냅샷은 트리 내 영구 디스크 드라이버에서 지원되지 않습니다.

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

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

시작하기 전에

시작하기 전에 다음 태스크를 수행했는지 확인합니다.

  • Google Kubernetes Engine API가 사용 설정되었는지 확인합니다.
  • Google Kubernetes Engine API 사용 설정
  • Cloud SDK가 설치되었는지 확인합니다.
  • 다음 방법 중 하나를 사용하여 프로젝트의 기본 gcloud 명령줄 도구 설정을 지정합니다.
    • 프로젝트 기본값 설정 방법을 알아보려면 gcloud init를 사용합니다.
    • 프로젝트 ID, 영역, 리전을 개별적으로 설정하려면 gcloud config를 사용합니다.

    gcloud init

    1. gcloud init를 실행하고 다음 안내를 따르세요.

      gcloud init

      원격 서버에서 SSH를 사용하는 경우 --console-only 플래그를 사용하여 다음 명령어로 브라우저를 실행하지 못하게 할 수 있습니다.

      gcloud init --console-only
    2. 안내를 따라 gcloud 도구에서 Google Cloud 계정을 사용하도록 승인합니다.
    3. 새 구성을 만들거나 기존 구성을 선택합니다.
    4. Google Cloud 프로젝트를 선택합니다.
    5. 기본 Compute Engine 영역을 선택합니다.
    6. 기본 Compute Engine 리전을 선택합니다.

    gcloud config

    1. 기본 프로젝트 ID를 설정합니다.
      gcloud config set project PROJECT_ID
    2. 기본 Compute Engine 리전(예: us-central1)을 설정합니다.
      gcloud config set compute/region COMPUTE_REGION
    3. 기본 Compute Engine 영역(예: us-central1-c)을 설정합니다.
      gcloud config set compute/zone COMPUTE_ZONE
    4. gcloud를 최신 버전으로 업데이트합니다.
      gcloud components update

    기본 위치를 설정하면 gcloud 도구에서 One of [--zone, --region] must be supplied: Please specify location과 같은 오류를 방지할 수 있습니다.

볼륨 스냅샷 만들기 및 사용

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

  1. PersistentVolumeClaim 및 배포를 만듭니다.
  2. 배포에서 사용하는 PersistentVolume에 파일을 추가합니다.
  3. 스냅샷을 구성할 VolumeSnapshotClass를 만듭니다.
  4. PersistentVolume의 볼륨 스냅샷을 만듭니다.
  5. 테스트 파일을 삭제합니다.
  6. PersistentVolume을 만든 스냅샷으로 복원합니다.
  7. 복원이 완료되었는지 확인합니다.

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

  1. VolumeSnapshotClass 객체를 만들어 스냅샷의 CSI 드라이버 및 삭제 정책을 지정합니다.
  2. VolumeSnapshot 객체를 만들어 기존 PersistentVolumeClaim의 스냅샷을 요청합니다.
  3. PersistentVolumeClaim에서 VolumeSnapshot을 참조하여 볼륨을 해당 스냅샷으로 복원하거나 스냅샷을 사용하여 새 볼륨을 만듭니다.

PersistentVolumeClaim 및 배포 만들기

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

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

    spec.storageClassName에는 지원되는 CSI 드라이버를 사용하는 모든 스토리지 클래스를 지정할 수 있습니다. 이 예시에서는 Compute Engine 영구 디스크 CSI 드라이버와 함께 기본적으로 설치된 standard-rwo 스토리지 클래스를 사용합니다. 자세한 내용은 Compute Engine 영구 디스크 CSI 드라이버 사용을 참조하세요.

  2. 매니페스트를 적용합니다.

    kubectl apply -f my-pvc.yaml
    
  3. 배포를 만들려면 다음 매니페스트를 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
    
  4. 매니페스트를 적용합니다.

    kubectl apply -f my-deployment.yaml
    
  5. 배포 상태를 확인합니다.

    kubectl get deployment hello-app
    

볼륨에 테스트 파일 추가

  1. 배포의 pod를 나열합니다.

    kubectl get pods -l app=hello-app
    

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

    NAME                         READY   STATUS    RESTARTS   AGE
    hello-app-6d7b457c7d-vl4jr   1/1     Running   0          2m56s
    
  2. pod에서 테스트 파일을 만듭니다.

    kubectl exec POD_NAME -- sh -c 'echo "Hello World!" > /usr/share/hello/hello.txt'
    

    POD_NAME을 Pod의 이름으로 바꿉니다.

  3. 파일이 있는지 확인합니다.

    kubectl exec POD_NAME -- sh -c 'cat /usr/share/hello/hello.txt'
    

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

    Hello World!
    

VolumeSnapshotClass 객체를 만듭니다.

볼륨 스냅샷의 CSI 드라이버와 deletionPolicy를 지정하는 VolumeSnapshotClass 객체를 만듭니다. VolumeSnapshot 객체를 만들 때 VolumeSnapshotClass 객체를 참조할 수 있습니다.

  1. 다음 매니페스트를 volumesnapshotclass.yaml로 저장합니다. 클러스터의 GKE 버전에 따라 API 버전 v1beta1 또는 v1을 사용할 수 있습니다.

    v1beta1

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

    apiVersion: snapshot.storage.k8s.io/v1beta1
    kind: VolumeSnapshotClass
    metadata:
      name: my-snapshotclass
    driver: pd.csi.storage.gke.io
    deletionPolicy: Delete
    

    v1

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

    apiVersion: snapshot.storage.k8s.io/v1
    kind: VolumeSnapshotClass
    metadata:
      name: my-snapshotclass
    driver: pd.csi.storage.gke.io
    deletionPolicy: Delete
    

    예를 들면 다음과 같습니다.

    • driver 필드는 스냅샷을 프로비저닝하는 데 사용할 CSI 드라이버입니다. pd.csi.storage.gke.ioCompute Engine 영구 디스크 CSI 드라이버를 사용합니다.

    • deletionPolicy 필드는 바인드된 VolumeSnapshot 객체가 삭제될 때 VolumeSnapshotContent 객체와 기본 스냅샷으로 수행할 작업을 GKE에 알려줍니다. VolumeSnapshotContent 객체 및 기본 스냅샷을 삭제하려면 Delete를 지정합니다. 또한 VolumeSnapshotContent 및 기본 스냅샷을 보관하려면 Retain을 지정하면 됩니다.

    커스텀 스토리지 위치를 사용하려면 스냅샷 클래스에 storage-locations 매개변수를 추가합니다(클러스터 버전 1.21 이상 필요).

    apiVersion: snapshot.storage.k8s.io/v1
    kind: VolumeSnapshotClass
    metadata:
      name: my-snapshotclass
    parameters:
      storage-locations: us-east2
    driver: pd.csi.storage.gke.io
    deletionPolicy: Delete
    
  2. 매니페스트 적용

    kubectl apply -f volumesnapshotclass.yaml
    

VolumeSnapshot 만들기

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

  1. 다음 매니페스트를 volumesnapshot.yaml로 저장합니다. API 버전 v1beta1 또는 v1을 사용할 수 있습니다.

    v1beta1

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

    apiVersion: snapshot.storage.k8s.io/v1beta1
    kind: VolumeSnapshot
    metadata:
      name: my-snapshot
    spec:
      volumeSnapshotClassName: my-snapshotclass
      source:
        persistentVolumeClaimName: my-pvc
    

    v1

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

    apiVersion: snapshot.storage.k8s.io/v1
    kind: VolumeSnapshot
    metadata:
      name: my-snapshot
    spec:
      volumeSnapshotClassName: my-snapshotclass
      source:
        persistentVolumeClaimName: my-pvc
    
  2. 매니페스트를 적용합니다.

    kubectl apply -f volumesnapshot.yaml
    

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

  3. GKE가 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
my-snapshot        true

테스트 파일 삭제

  1. 생성한 테스트 파일을 삭제합니다.

    kubectl exec POD_NAME -- sh -c 'rm /usr/share/hello/hello.txt'
    
  2. 파일이 더 이상 존재하지 않는지 확인합니다.

    kubectl exec POD_NAME -- sh -c 'cat /usr/share/hello/hello.txt'
    

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

    cat: /usr/share/hello/hello.txt: No such file or directory
    

볼륨 스냅샷 복원

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

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

이 예시에서는 새 PersistentVolumeClaim에서 만든 VolumeSnapshot을 참조하고 새 클레임을 사용하도록 배포를 업데이트합니다.

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

    apiVersion: v1
    kind: PersistentVolumeClaim
    metadata:
      name: pvc-restore
    spec:
      dataSource:
        name: my-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. PersistentVolumeClaim을 사용하도록 my-deployment.yaml을 업데이트합니다.

    ...
    volumes:
    - name: my-volume
      persistentVolumeClaim:
        claimName: pvc-restore
    
  4. 업데이트된 매니페스트를 적용합니다.

    kubectl apply -f my-deployment.yaml
    

스냅샷 복원 여부 확인

스냅샷이 성공적으로 복원되었는지 확인하려면 업데이트된 배포를 위해 GKE가 만드는 새 pod의 이름을 가져옵니다.

kubectl get pods -l app=hello-app

테스트 파일이 있는지 확인합니다.

kubectl exec NEW_POD_NAME -- sh -c 'cat /usr/share/hello/hello.txt'

NEW_POD_NAME을 생성된 새 pod GKE의 이름으로 바꿉니다.

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

Hello World!

삭제

  1. VolumeSnapshot을 삭제합니다.

    kubectl delete volumesnapshot my-snapshot
    
  2. VolumeSnapshotClass를 삭제합니다.

    kubectl delete volumesnapshotclass my-snapshotclass
    
  3. 배포를 삭제합니다.

    kubectl delete deployments hello-app
    
  4. PersistentVolumeClaim 객체를 삭제합니다.

    kubectl delete pvc my-pvc pvc-restore
    

다음 단계