5.4. CSI 볼륨 스냅샷
이 문서에서는 지원되는 CSI(Container Storage Interface) 드라이버로 볼륨 스냅샷을 사용하여 OpenShift Container Platform의 데이터 손실을 보호하는 방법을 설명합니다. 영구 볼륨에 대해 숙지하는 것이 좋습니다.
5.4.1. CSI 볼륨 스냅샷 개요
스냅샷은 특정 시점에서 클러스터의 스토리지 볼륨 상태를 나타냅니다. 볼륨 스냅샷을 사용하여 새 볼륨을 프로비저닝할 수 있습니다.
OpenShift Container Platform은 기본적으로 CSI(Container Storage Interface) 볼륨 스냅샷을 지원합니다. 그러나 특정 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 드라이버에서 제공하는 설명서를 참조하십시오.
5.4.2. CSI 스냅샷 컨트롤러 및 사이드카
OpenShift Container Platform은 컨트롤 플레인에 배포된 스냅샷 컨트롤러를 제공합니다. 또한, CSI 드라이버 벤더는 CSI 드라이버 설치 중에 설치된 Helper 컨테이너로 CSI 스냅샷 사이드카를 제공합니다.
CSI 스냅샷 컨트롤러 및 사이드카는 OpenShift Container Platform API를 통해 볼륨 스냅샷을 제공합니다. 이러한 외부 구성 요소는 클러스터에서 실행됩니다.
외부 컨트롤러는 CSI Snapshot Controller Operator에 의해 배포됩니다.
5.4.2.1. 외부 컨트롤러
CSI 스냅샷 컨트롤러는 VolumeSnapshot
및 VolumeSnapshotContent
오브젝트를 바인딩합니다. 컨트롤러는 VolumeSnapshotContent
오브젝트를 생성 및 삭제하여 동적 프로비저닝을 관리합니다.
5.4.2.2. 외부 사이드카
CSI 드라이버 벤더는 csi-external-snapshotter
사이드카를 제공합니다. 이 컨테이너는 CSI 드라이버와 함께 배포된 별도의 Helper 컨테이너입니다. 사이드카는 CreateSnapshot
및 DeleteSnapshot
작업을 트리거하여 스냅샷을 관리합니다. 벤더가 제공하는 설치 지침을 따르십시오.
5.4.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 스냅샷 컨트롤러를 설치합니다.
5.4.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에는 네임스페이스가 지정되지 않으며, 클러스터 관리자가 사용하여 스토리지 백엔드에 대한 글로벌 구성 옵션을 활성화하기 위한 용도입니다.
5.4.4. 볼륨 스냅샷 프로비저닝
스냅샷을 프로비저닝하는 방법은 동적으로 수동의 두 가지가 있습니다.
5.4.4.1. 동적 프로비저닝
기존 스냅샷을 사용하는 대신 영구 볼륨 클레임에서 스냅샷을 동적으로 수락하도록 요청할 수 있습니다. 매개변수는 VolumeSnapshotClass
CRD를 사용하여 지정됩니다.
5.4.4.2. 수동 프로비저닝
클러스터 관리자는 여러 VolumeSnapshotContent
오브젝트를 수동으로 사전 프로비저닝할 수 있습니다. 이를 통해 클러스터 사용자가 사용할 수 있는 실제 볼륨 스냅샷 세부 정보가 제공됩니다.
5.4.5. 볼륨 스냅샷 생성
VolumeSnapshot
오브젝트를 생성할 때 OpenShift Container Platform은 볼륨 스냅샷을 생성합니다.
사전 요구 사항
- 실행 중인 OpenShift Container Platform 클러스터에 로그인합니다.
-
VolumeSnapshot
오브젝트를 지원하는 CSI 드라이버를 사용하여 생성된 PVC입니다. - 스토리지 백엔드를 프로비저닝하는 스토리지 클래스입니다.
스냅샷을 사용하려는 PVC(영구 볼륨 클레임)를 사용하는 Pod가 없습니다.
주의Pod에서 사용 중인 PVC의 볼륨 스냅샷을 생성하면 기록되지 않은 데이터와 캐시된 데이터가 스냅샷에서 제외될 수 있습니다. 모든 데이터가 디스크에 기록되도록 하려면 스냅샷을 생성하기 전에 PVC를 사용하는 Pod를 삭제합니다.
프로세스
볼륨 스냅샷을 동적으로 생성하려면 다음을 수행합니다.
다음 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
필드와 동일해야 합니다.
참고영구 스토리지를 구성하는 데 사용한 드라이버에 따라 추가 매개변수가 필요할 수 있습니다. 기존
VolumeSnapshotClass
오브젝트를 사용할 수도 있습니다.다음 명령을 입력하여 이전 단계에서 저장한 오브젝트를 생성합니다.
$ oc create -f volumesnapshotclass.yaml
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
다음 명령을 입력하여 이전 단계에서 저장한 오브젝트를 생성합니다.
$ oc create -f volumesnapshot-dynamic.yaml
스냅샷을 수동으로 프로비저닝하려면 다음을 수행합니다.
위에서 설명한 볼륨 스냅샷 클래스를 정의하는 것 외에도
volumeSnapshotContentName
매개변수 값을 스냅샷의 소스로 제공해야 합니다.volumesnapshot-manual.yaml
apiVersion: snapshot.storage.k8s.io/v1 kind: VolumeSnapshot metadata: name: snapshot-demo spec: source: volumeSnapshotContentName: mycontent 1
- 1
- 사전 프로비저닝된 스냅샷에는
volumeSnapshotContentName
매개변수가 필요합니다.
다음 명령을 입력하여 이전 단계에서 저장한 오브젝트를 생성합니다.
$ oc create -f volumesnapshot-manual.yaml
검증
클러스터에서 스냅샷을 생성한 후 스냅샷에 대한 추가 세부 정보를 사용할 수 있습니다.
생성된 볼륨 스냅샷에 대한 세부 정보를 표시하려면 다음 명령을 입력합니다.
$ 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 데이터를 다른 저렴한 위치로 이동할 수 있으며, 이 작업에는 몇 분이 걸릴 수 있습니다.
볼륨 스냅샷이 생성되었는지 확인하려면 다음 명령을 입력합니다.
$ oc get volumesnapshotcontent
실제 컨텐츠에 대한 포인터가 표시됩니다.
boundVolumeSnapshotContentName
필드가 입력된 경우VolumeSnapshotContent
오브젝트가 존재하고 스냅샷이 생성된 것입니다.-
스냅샷이 준비되었는지 확인하려면
VolumeSnapshot
오브젝트에readyToUse: true
가 있는지 확인합니다.
5.4.6. 볼륨 스냅샷 삭제
OpenShift Container Platform이 볼륨 스냅샷을 삭제하는 방법을 구성할 수 있습니다.
절차
다음 예와 같이
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
오브젝트가 삭제되면 해당 콘텐츠는 그대로 유지됩니다. 스냅샷 자체는 스토리지 백엔드에서도 유지됩니다.
다음 명령을 입력하여 볼륨 스냅샷을 삭제합니다.
$ oc delete volumesnapshot <volumesnapshot_name>
출력 예
volumesnapshot.snapshot.storage.k8s.io "mysnapshot" deleted
삭제 정책이
Retain
으로 설정된 경우 다음 명령을 입력하여 볼륨 스냅샷 콘텐츠를 삭제합니다.$ oc delete volumesnapshotcontent <volumesnapshotcontent_name>
선택 사항:
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
종료자가 제거되고 볼륨 스냅샷이 삭제됩니다.
5.4.7. 볼륨 스냅샷 복원
VolumeSnapshot
CRD 콘텐츠를 사용하여 기존 볼륨을 이전 상태로 복원할 수 있습니다.
VolumeSnapshot
CRD가 바인딩되고 readyToUse
값이 true
로 설정된 후 해당 리소스를 사용하여 스냅샷의 데이터로 미리 채워진 새 볼륨을 프로비저닝할 수 있습니다.
사전 요구 사항
- 실행 중인 OpenShift Container Platform 클러스터에 로그인합니다.
- 볼륨 스냅샷을 지원하는 CSI(Container Storage Interface) 드라이버를 사용하여 생성된 PVC(영구 볼륨 클레임)입니다.
- 스토리지 백엔드를 프로비저닝하는 스토리지 클래스입니다.
- 볼륨 스냅샷이 생성되어 사용할 준비가 되었습니다.
프로세스
다음과 같이 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
다음 명령을 입력하여 PVC를 생성합니다.
$ oc create -f pvc-restore.yaml
다음 명령을 입력하여 복원된 PVC가 생성되었는지 확인합니다.
$ oc get pvc
myclaim-restore
와 같은 새 PVC가 표시됩니다.
5.4.8. vSphere의 최대 스냅샷 수 변경
vSphere CSI(Container Storage Interface)의 볼륨당 기본 최대 스냅샷 수는 3입니다. 볼륨당 최대 32개까지 변경할 수 있습니다.
그러나 스냅샷 최대값을 늘리려면 성능 장단점이 필요하므로 볼륨당 2~3개의 스냅샷만 사용할 수 있습니다.
자세한 VMware 스냅샷 성능 권장 사항은 추가 리소스를 참조하십시오.
사전 요구 사항
- 관리자 권한으로 클러스터에 액세스합니다.
절차
다음 명령을 실행하여 현재 구성 맵을 확인합니다.
$ oc -n openshift-cluster-csi-drivers get cm/vsphere-csi-config -o yaml
출력 예
apiVersion: v1 data: cloud.conf: |+ # Labels with topology values are added dynamically via operator [Global] cluster-id = vsphere-01-cwv8p [VirtualCenter "vcenter.openshift.com"] insecure-flag = true datacenters = DEVQEdatacenter migration-datastore-url = ds:///vmfs/volumes/vsan:527320283a8c3163-2faa6dc5949a3a28/ kind: ConfigMap metadata: creationTimestamp: "2024-03-06T09:46:40Z" name: vsphere-csi-config namespace: openshift-cluster-csi-drivers resourceVersion: "126687"
이 예에서는 글로벌 최대 스냅샷 수가 구성되지 않았으므로 기본값 3이 적용됩니다.
다음 명령을 실행하여 스냅샷 제한을 변경합니다.
글로벌 스냅샷 제한을 설정합니다.
$ oc patch clustercsidriver/csi.vsphere.vmware.com --type=merge -p '{"spec":{"driverConfig":{"vSphere":{"globalMaxSnapshotsPerBlockVolume": 10}}}}' clustercsidriver.operator.openshift.io/csi.vsphere.vmware.com patched
이 예에서 글로벌 제한이 10(
globalMaxSnapshotsPerBlockVolume
으로 설정)으로 변경됩니다.가상 볼륨 스냅샷 제한을 설정합니다.
이 매개변수는 가상 볼륨 데이터 저장소에만 제한을 설정합니다. 가상 볼륨 최대 스냅샷 제한은 전역 제약 조건을 재정의하지만 설정되지 않은 경우 기본값은 글로벌 제한입니다.
$ oc patch clustercsidriver/csi.vsphere.vmware.com --type=merge -p '{"spec":{"driverConfig":{"vSphere":{"granularMaxSnapshotsPerBlockVolumeInVVOL": 5}}}}' clustercsidriver.operator.openshift.io/csi.vsphere.vmware.com patched
이 예에서는 가상 볼륨 제한이 5로 변경되고 있습니다(
granularMaxSnapshotsPerBlockVolumeInVVOL
을 5)로 설정합니다.vSAN 스냅샷 제한을 설정합니다.
이 매개변수는 vSAN 데이터 저장소에만 제한을 설정합니다. 설정된 경우 vSAN 최대 스냅샷 제한이 전역 제약 조건을 덮어씁니다. 그러나 설정되지 않은 경우 기본값은 글로벌 제한입니다. vSAN ESA 설정에서 최대 32 값을 설정할 수 있습니다.
$ oc patch clustercsidriver/csi.vsphere.vmware.com --type=merge -p '{"spec":{"driverConfig":{"vSphere":{"granularMaxSnapshotsPerBlockVolumeInVSAN": 7}}}}' clustercsidriver.operator.openshift.io/csi.vsphere.vmware.com patched
이 예에서 vSAN 제한이 7로 변경되었습니다 (
granularMaxSnapshotsPerBlockVolumeInVSAN
을 7로 설정).
검증
다음 명령을 실행하여 구성 맵에 변경 사항이 반영되었는지 확인합니다.
$ oc -n openshift-cluster-csi-drivers get cm/vsphere-csi-config -o yaml
출력 예
apiVersion: v1 data: cloud.conf: |+ # Labels with topology values are added dynamically via operator [Global] cluster-id = vsphere-01-cwv8p [VirtualCenter "vcenter.openshift.com"] insecure-flag = true datacenters = DEVQEdatacenter migration-datastore-url = ds:///vmfs/volumes/vsan:527320283a8c3163-2faa6dc5949a3a28/ [Snapshot] global-max-snapshots-per-block-volume = 10 1 kind: ConfigMap metadata: creationTimestamp: "2024-03-06T09:46:40Z" name: vsphere-csi-config namespace: openshift-cluster-csi-drivers resourceVersion: "127118" uid: f6968303-81d8-4048-99c1-d8211363d0fa
- 1
global-max-snapshots-per-block-volume
이 이제 10으로 설정됩니다.