4.3. CSI 볼륨 스냅샷

이 문서에서는 지원되는 CSI(Container Storage Interface) 드라이버로 볼륨 스냅샷을 사용하여 OpenShift Container Platform의 데이터 손실을 보호하는 방법을 설명합니다. 영구 볼륨에 대한 지식이 있는 것이 좋습니다.

4.3.1. CSI 볼륨 스냅샷 개요

스냅샷은 특정 시점에서 클러스터의 스토리지 볼륨 상태를 나타냅니다. 볼륨 스냅샷을 사용하여 새 볼륨을 프로비저닝할 수 있습니다.

OpenShift Container Platform은 기본적으로 CSI 볼륨 스냅샷을 지원합니다. 그러나 특정 CSI 드라이버가 필요합니다.

CSI 볼륨 스냅샷을 사용하면 클러스터 관리자가 다음을 수행할 수 있습니다.

  • 스냅샷을 지원하는 타사 CSI 드라이버를 배포합니다.
  • 기존 볼륨 스냅샷에서 새 PVC(영구 볼륨 클레임)를 생성합니다.
  • 기존 PVC의 스냅샷을 가져옵니다.
  • 스냅샷을 다른 PVC로 복원합니다.
  • 기존 VM 스냅샷을 삭제합니다.

CSI 볼륨 스냅샷을 사용하면 앱 개발자가 다음을 수행할 수 있습니다.

  • 애플리케이션 또는 클러스터 수준의 스토리지 백업 솔루션을 개발하기 위한 볼륨 스냅샷을 빌드 블록으로 사용할 수 있습니다.
  • 빠르게 이전 개발 버전으로 롤백할 수 있습니다.
  • 시간마다 전체 복사를 하지 않고 스토리지를 보다 효율적으로 사용할 수 있습니다.

볼륨 스냅샷을 사용할 때는 다음에 유의하십시오.

  • CSI 드라이버에서만 지원을 사용할 수 있습니다. In-tree 및 FlexVolumes는 지원되지 않습니다.
  • OpenShift Container Platform은 일부 CSI 드라이버만 제공됩니다. OpenShift Container Platform Driver Operator가 제공하지 않는 CSI 드라이버의 경우 커뮤니티 또는 스토리지 공급 업체에서 제공하는 CSI 드라이버를 사용하는 것이 좋습니다. CSI 드라이버에서 제공하는 설치 지침을 따르십시오.
  • CSI 드라이버는 볼륨 스냅샷 기능을 구현하거나 사용하지 않을 수 있습니다. 볼륨 스냅샷을 지원하는 CSI 드라이버는 csi-external-snapshotter 사이드카를 사용할 수 있습니다. 자세한 내용은 CSI 드라이버에서 제공하는 설명서를 참조하십시오.
  • OpenShift Container Platform 4.8은 CSI 사양의 버전 1.1.0을 지원합니다.

4.3.2. CSI 스냅샷 컨트롤러 및 사이드카

OpenShift Container Platform은 컨트롤 플레인에 배포된 스냅샷 컨트롤러를 제공합니다. 또한, CSI 드라이버 벤더는 CSI 드라이버 설치 중에 설치된 Helper 컨테이너로 CSI 스냅샷 사이드카를 제공합니다.

CSI 스냅샷 컨트롤러 및 사이드카는 OpenShift Container Platform API를 통해 볼륨 스냅샷을 제공합니다. 이러한 외부 구성 요소는 클러스터에서 실행됩니다.

외부 컨트롤러는 CSI Snapshot Controller Operator에 의해 배포됩니다.

4.3.2.1. 외부 컨트롤러

CSI 스냅샷 컨트롤러는 VolumeSnapshotVolumeSnapshotContent 오브젝트를 바인딩합니다. 컨트롤러는 VolumeSnapshotContent 오브젝트를 생성 및 삭제하여 동적 프로비저닝을 관리합니다.

4.3.2.2. 외부 사이드카

CSI 드라이버 벤더는 csi-external-snapshotter 사이드카를 제공합니다. 이 컨테이너는 CSI 드라이버와 함께 배포된 별도의 Helper 컨테이너입니다. 사이드카는 CreateSnapshotDeleteSnapshot 작업을 트리거하여 스냅샷을 관리합니다. 벤더가 제공하는 설치 지침을 따르십시오.

4.3.3. CSI Snapshot Controller Operator 정보

CSI Snapshot Controller Operator는 openshift-cluster-storage-operator 네임스페이스에서 실행됩니다. 기본적으로 모든 클러스터에 CVO(Cluster Version Operator)에 의해 설치됩니다.

CSI Snapshot Controller Operator는 openshift-cluster-storage-operator 네임스페이스에서 실행되는 CSI 스냅샷 컨트롤러를 설치합니다.

4.3.3.1. 볼륨 스냅샷 CRD

OpenShift Container Platform을 설치하는 동안 CSI Snapshot Controller Operator는 snapshot.storage.k8s.io/v1 API 그룹에 다음 스냅샷 CRD(사용자 정의 리소스 정의)를 생성합니다.

VolumeSnapshotContent

클러스터 관리자가 프로비저닝한 클러스터의 볼륨으로 가져온 스냅샷입니다.

PersistentVolume 오브젝트와 유사하게 VolumeSnapshotContent CRD는 스토리지 백엔드의 실제 스냅샷을 가리키는 클러스터 리소스입니다.

수동으로 프로비저닝된 스냅샷의 경우 클러스터 관리자는 여러 VolumeSnapshotContent CRD를 생성합니다. 이는 스토리지 시스템의 실제 볼륨 스냅샷에 대한 세부 정보를 제공합니다.

VolumeSnapshotContent CRD는 네임스페이스가 제공되지 않으며 클러스터 관리자가 사용합니다.

VolumeSnapshot

PersistentVolumeClaim 오브젝트와 유사하게 VolumeSnapshot CRD는 스냅샷에 대한 개발자 요청을 정의합니다. CSI Snapshot Controller Operator는 CSI 스냅샷 컨트롤러를 실행하여 VolumeSnapshot CRD의 바인딩을 적절한 VolumeSnapshotContent CRD로 처리합니다. 바인딩은 일대일 매핑입니다.

VolumeSnapshot CRD에는 네임스페이스가 지정됩니다. 개발자는 CRD를 스냅샷에 대한 개별 요청으로 사용합니다.

VolumeSnapshotClass

클러스터 관리자는 VolumeSnapshot 오브젝트에 속한 다른 속성을 지정할 수 있습니다. 이러한 속성은 스토리지 시스템에서 동일한 볼륨에서 가져온 스냅샷과 다를 수 있으며, 이 경우 영구 볼륨 클레임의 동일한 스토리지 클래스를 사용하여 표시하지 않을 수 있습니다.

VolumeSnapshotClass CRD는 스냅샷을 생성할 때 사용할 csi-external-snapshotter 사이드카에 대한 매개변수를 정의합니다. 이를 통해 여러 옵션이 지원되는 경우 스토리지 백엔드가 어떤 종류의 스냅샷을 동적으로 생성할지 알 수 있습니다.

동적으로 프로비저닝된 스냅샷은 VolumeSnapshotClass CRD를 사용하여 스냅샷을 생성할 때 사용할 스토리지에서 제공되는 특정 매개변수를 지정합니다.

VolumeSnapshotContentClass CRD에는 네임스페이스가 지정되지 않으며, 클러스터 관리자가 사용하여 스토리지 백엔드에 대한 글로벌 구성 옵션을 활성화하기 위한 용도입니다.

4.3.4. 볼륨 스냅샷 프로비저닝

스냅샷을 프로비저닝하는 방법은 동적으로 수동의 두 가지가 있습니다.

4.3.4.1. 동적 프로비저닝

기존 스냅샷을 사용하는 대신 영구 볼륨 클레임에서 스냅샷을 동적으로 수락하도록 요청할 수 있습니다. 매개변수는 VolumeSnapshotClass CRD를 사용하여 지정됩니다.

4.3.4.2. 수동 프로비저닝

클러스터 관리자는 여러 VolumeSnapshotContent 오브젝트를 수동으로 사전 프로비저닝할 수 있습니다. 이를 통해 클러스터 사용자가 사용할 수 있는 실제 볼륨 스냅샷 세부 정보가 제공됩니다.

4.3.5. 볼륨 스냅샷 생성

VolumeSnapshot 오브젝트를 생성할 때 OpenShift Container Platform은 볼륨 스냅샷을 생성합니다.

사전 요구 사항

  • 실행 중인 OpenShift Container Platform 클러스터에 로그인합니다.
  • VolumeSnapshot 오브젝트를 지원하는 CSI 드라이버를 사용하여 생성된 PVC입니다.
  • 스토리지 백엔드를 프로비저닝하는 스토리지 클래스입니다.
  • 스냅샷을 사용하려는 PVC(영구 볼륨 클레임)를 사용하는 Pod가 없습니다.

    참고

    Pod가 이를 사용하는 경우 PVC의 볼륨 스냅샷을 생성하지 마십시오. 그러면 PVC가 quiesced(일시 중지됨)되지 않기 때문에 데이터 손상이 발생할 수 있습니다. 일관된 스냅샷을 유지하기 위해 실행 중인 Pod를 먼저 제거해야 합니다.

절차

볼륨 스냅샷을 동적으로 생성하려면 다음을 수행합니다.

  1. 다음 YAML로 설명된 VolumeSnapshotClass 오브젝트로 파일을 생성합니다.

    volumesnapshotclass.yaml

    apiVersion: snapshot.storage.k8s.io/v1
    kind: VolumeSnapshotClass
    metadata:
      name: csi-hostpath-snap
    driver: hostpath.csi.k8s.io 1
    deletionPolicy: Delete

    1
    VolumeSnapshotClass 오브젝트의 스냅샷을 생성하는 데 사용되는 CSI 드라이버의 이름입니다. 이름은 스냅샷을 수행 중인 PVC를 담당하는 스토리지 클래스의 Provisioner 필드와 동일해야 합니다.
  2. 다음 명령을 입력하여 이전 단계에서 저장한 오브젝트를 생성합니다.

    $ oc create -f volumesnapshotclass.yaml
  3. VolumeSnapshot 오브젝트를 생성합니다.

    volumesnapshot-dynamic.yaml

    apiVersion: snapshot.storage.k8s.io/v1
    kind: VolumeSnapshot
    metadata:
      name: mysnap
    spec:
      volumeSnapshotClassName: csi-hostpath-snap 1
      source:
        persistentVolumeClaimName: myclaim 2

    1
    볼륨 스냅샷의 특정 클래스에 대한 요청입니다. volumeSnapshotClassName 설정이 없으며 기본 볼륨 스냅샷 클래스가 있는 경우 기본 볼륨 스냅샷 클래스 이름을 사용하여 스냅샷이 생성됩니다. 그러나 필드가 없으며 기본 볼륨 스냅샷 클래스가 없는 경우에는 스냅샷이 생성되지 않습니다.
    2
    영구 볼륨에 바인딩된 PersistentVolumeClaim 오브젝트의 이름입니다. 이 명령은 스냅샷을 생성할 대상을 정의합니다. 스냅샷을 동적으로 프로비저닝하는 데 필요합니다.
  4. 다음 명령을 입력하여 이전 단계에서 저장한 오브젝트를 생성합니다.

    $ oc create -f volumesnapshot-dynamic.yaml

스냅샷을 수동으로 프로비저닝하려면 다음을 수행합니다.

  1. 위에서 설명한 볼륨 스냅샷 클래스를 정의하는 것 외에도 volumeSnapshotContentName 매개변수 값을 스냅샷의 소스로 제공해야 합니다.

    volumesnapshot-manual.yaml

    apiVersion: snapshot.storage.k8s.io/v1
    kind: VolumeSnapshot
    metadata:
      name: snapshot-demo
    spec:
      source:
        volumeSnapshotContentName: mycontent 1

    1
    사전 프로비저닝된 스냅샷에는 volumeSnapshotContentName 매개변수가 필요합니다.
  2. 다음 명령을 입력하여 이전 단계에서 저장한 오브젝트를 생성합니다.

    $ oc create -f volumesnapshot-manual.yaml

검증

클러스터에서 스냅샷을 생성한 후 스냅샷에 대한 추가 세부 정보를 사용할 수 있습니다.

  1. 생성된 볼륨 스냅샷에 대한 세부 정보를 표시하려면 다음 명령을 입력합니다.

    $ oc describe volumesnapshot mysnap

    다음 예시는 mysnap 볼륨 스냅샷에 대한 세부 정보를 표시합니다.

    volumesnapshot.yaml

    apiVersion: snapshot.storage.k8s.io/v1
    kind: VolumeSnapshot
    metadata:
      name: mysnap
    spec:
      source:
        persistentVolumeClaimName: myclaim
      volumeSnapshotClassName: csi-hostpath-snap
    status:
      boundVolumeSnapshotContentName: snapcontent-1af4989e-a365-4286-96f8-d5dcd65d78d6 1
      creationTime: "2020-01-29T12:24:30Z" 2
      readyToUse: true 3
      restoreSize: 500Mi

    1
    컨트롤러가 생성한 실제 스토리지 콘텐츠의 포인터입니다.
    2
    스냅샷이 생성된 시간입니다. 스냅샷에는 이 표시된 시점에서 사용 가능한 볼륨 내용이 포함되어 있습니다.
    3
    값을 true로 설정하면 스냅샷을 사용하여 새 PVC로 복원할 수 있습니다.
    값을 false로 설정하면 스냅샷이 생성됩니다. 하지만 스토리지 백엔드는 스냅샷을 사용할 수 있도록 추가 작업을 수행하여 새 볼륨으로 복원해야 합니다. 예를 들어, Amazon Elastic Block Store 데이터를 다른 저렴한 위치로 이동할 수 있으며, 이 작업에는 몇 분이 걸릴 수 있습니다.
  2. 볼륨 스냅샷이 생성되었는지 확인하려면 다음 명령을 입력합니다.

    $ oc get volumesnapshotcontent

    실제 컨텐츠에 대한 포인터가 표시됩니다. boundVolumeSnapshotContentName 필드가 입력된 경우 VolumeSnapshotContent 오브젝트가 존재하고 스냅샷이 생성된 것입니다.

  3. 스냅샷이 준비되었는지 확인하려면 VolumeSnapshot 오브젝트에 readyToUse: true가 있는지 확인합니다.

4.3.6. 볼륨 스냅샷 삭제

OpenShift Container Platform이 볼륨 스냅샷을 삭제하는 방법을 구성할 수 있습니다.

절차

  1. 다음 예와 같이 VolumeSnapshotClass 오브젝트에 필요한 삭제 정책을 지정합니다.

    volumesnapshotclass.yaml

    apiVersion: snapshot.storage.k8s.io/v1
    kind: VolumeSnapshotClass
    metadata:
      name: csi-hostpath-snap
    driver: hostpath.csi.k8s.io
    deletionPolicy: Delete 1

    1
    볼륨 스냅샷을 삭제할 때 Delete 값이 설정되면 VolumeSnapshotContent 오브젝트와 함께 기본 스냅샷이 삭제됩니다. Retain 값이 설정된 경우 기본 스냅샷 및 VolumeSnapshotContent 오브젝트다 모두 유지됩니다.
    Retain 값이 설정되고 해당 VolumeSnapshotContent 오브젝트를 삭제하지 않고 VolumeSnapshot 오브젝트가 삭제되면 해당 콘텐츠는 그대로 유지됩니다. 스냅샷 자체는 스토리지 백엔드에서도 유지됩니다.
  2. 다음 명령을 입력하여 볼륨 스냅샷을 삭제합니다.

    $ oc delete volumesnapshot <volumesnapshot_name>

    출력 예

    volumesnapshot.snapshot.storage.k8s.io "mysnapshot" deleted

  3. 삭제 정책이 Retain으로 설정된 경우 다음 명령을 입력하여 볼륨 스냅샷 콘텐츠를 삭제합니다.

    $ oc delete volumesnapshotcontent <volumesnapshotcontent_name>
  4. 선택 사항: VolumeSnapshot 오브젝트가 성공적으로 삭제되지 않으면 삭제 작업이 계속될 수 있도록 다음 명령을 입력하여 남은 리소스의 종료자를 제거합니다.

    중요

    VolumeSnapshot 오브젝트에 대한 영구 볼륨 클레임 또는 볼륨 스냅샷 콘텐츠에서 기존 참조가 없음을 확신할 수 있는 경우에만 종료자를 제거하십시오. --force 옵션을 사용하면 모든 종료자가 제거될 때까지 삭제 작업에서 스냅샷 오브젝트를 삭제하지 않습니다.

    $ oc patch -n $PROJECT volumesnapshot/$NAME --type=merge -p '{"metadata": {"finalizers":null}}'

    출력 예

    volumesnapshotclass.snapshot.storage.k8s.io "csi-ocs-rbd-snapclass" deleted

    종료자가 제거되고 볼륨 스냅샷이 삭제됩니다.

4.3.7. 볼륨 스냅샷 복원

VolumeSnapshot CRD 콘텐츠를 사용하여 기존 볼륨을 이전 상태로 복원할 수 있습니다.

VolumeSnapshot CRD가 바인딩되고 readyToUse 값이 true로 설정된 후 해당 리소스를 사용하여 스냅샷에서 데이터를 미리 입력한 새 볼륨을 프로비저닝할 수 있습니다. .사전 요구 사항* 실행 중인 OpenShift Container Platform 클러스터에 로그인되어 있어야 합니다. * 볼륨 스냅샷을 지원하는 CSI(Container Storage Interface) 드라이버를 사용하여 생성된 PVC(영구 볼륨 클레임)입니다. * 스토리지 백엔드를 프로비저닝할 스토리지 클래스입니다. * 볼륨 스냅샷이 생성되어 사용할 준비가 되어 있습니다.

절차

  1. 다음과 같이 PVC에서 VolumeSnapshot 데이터 소스를 지정합니다.

    pvc-restore.yaml

    apiVersion: v1
    kind: PersistentVolumeClaim
    metadata:
      name: myclaim-restore
    spec:
      storageClassName: csi-hostpath-sc
      dataSource:
        name: mysnap 1
        kind: VolumeSnapshot 2
        apiGroup: snapshot.storage.k8s.io 3
      accessModes:
        - ReadWriteOnce
      resources:
        requests:
          storage: 1Gi

    1
    소스로 사용할 스냅샷을 나타내는 VolumeSnapshot 오브젝트의 이름입니다.
    2
    VolumeSnapshot 값으로 설정해야 합니다.
    3
    snapshot.storage.k8s.io 값으로 설정해야 합니다.
  2. 다음 명령을 입력하여 PVC를 생성합니다.

    $ oc create -f pvc-restore.yaml
  3. 다음 명령을 입력하여 복원된 PVC가 생성되었는지 확인합니다.

    $ oc get pvc

    myclaim-restore와 같은 새 PVC가 표시됩니다.