볼륨 스냅샷
볼륨 스냅샷 (Volume Snapshots)
Kubernetes에서 VolumeSnapshot은 스토리지 시스템의 볼륨 스냅샷을 나타냅니다. 이 문서는 이미 Kubernetes 영구 볼륨(persistent volumes)에 익숙하다고 가정합니다.
출처: 문서
소개 (Introduction)
API 리소스 PersistentVolume과 PersistentVolumeClaim이 사용자와 관리자를 위한 볼륨을 프로비저닝하는 데 사용되는 것과 유사하게, VolumeSnapshotContent와 VolumeSnapshot API 리소스는 사용자와 관리자를 위한 볼륨 스냅샷을 만들기 위해 제공됩니다.
VolumeSnapshotContent는 관리자가 프로비저닝한 클러스터의 볼륨에서 가져온 스냅샷입니다. PersistentVolume이 클러스터 리소스인 것처럼 이것도 클러스터의 리소스입니다.
VolumeSnapshot은 사용자가 볼륨 스냅샷을 요청하는 것입니다. PersistentVolumeClaim과 유사합니다.
VolumeSnapshotClass를 사용하면 VolumeSnapshot에 속하는 다양한 속성을 지정할 수 있어요. 이 속성들은 같은 볼륨에서 가져온 스냅샷 간에도 스토리지 시스템에서 다를 수 있으므로, PersistentVolumeClaim의 동일한 StorageClass로 표현할 수 없습니다.
볼륨 스냅샷은 Kubernetes 사용자에게 완전히 새로운 볼륨을 만들지 않고도 특정 시점에 볼륨의 내용을 복사하는 표준화된 방법을 제공합니다. 이 기능은 예를 들어 데이터베이스 관리자가 편집이나 삭제 수정을 하기 전에 데이터베이스를 백업할 수 있게 해줍니다.
이 기능을 사용할 때 다음 사항을 알아야 합니다.
- API 객체
VolumeSnapshot,VolumeSnapshotContent,VolumeSnapshotClass는 CRD이며, 코어 API의 일부가 아닙니다. - VolumeSnapshot 지원은 CSI 드라이버에서만 사용할 수 있습니다.
- VolumeSnapshot 배포 과정의 일부로 Kubernetes 팀은 스냅샷 컨트롤러를 컨트롤 플레인에 배포하고,
csi-snapshotter라는 사이드카 헬퍼 컨테이너를 CSI 드라이버와 함께 배포하도록 제공합니다. 스냅샷 컨트롤러는 VolumeSnapshot과 VolumeSnapshotContent 객체를 감시하며 VolumeSnapshotContent 객체의 생성과 삭제를 담당합니다. 사이드카csi-snapshotter는 VolumeSnapshotContent 객체를 감시하고 CSI 엔드포인트에 대해CreateSnapshot과DeleteSnapshot연산을 촉발합니다. - 스냅샷 객체에 대한 강화된 검증을 제공하는 검증 웹훅 서버도 있습니다. 이것은 CSI 드라이버가 아니라 Kubernetes 배포가 스냅샷 컨트롤러와 CRD와 함께 설치해야 합니다. 스냅샷 기능이 활성화된 모든 Kubernetes 클러스터에 설치해야 해요.
- CSI 드라이버가 볼륨 스냅샷 기능을 구현했을 수도 있고 아닐 수도 있습니다. 볼륨 스냅샷 지원을 제공한 CSI 드라이버는 아마도
csi-snapshotter를 사용할 것입니다. 자세한 내용은 CSI 드라이버 문서를 참고하세요. - CRD와 스냅샷 컨트롤러 설치의 책임은 Kubernetes 배포(distribution)에 있습니다.
여러 볼륨의 그룹 스냅샷을 만드는 것 같은 고급 사용 사례는 외부 CSI Volume Group Snapshot 문서를 참고하세요.
스냅샷이 클러스터의 일부에서만 사용 가능한 클러스터(예: 공유 스토리지가 없는 멀티-존 클러스터의 한 존에 있는 볼륨의 스냅샷)에서 스냅샷의 토폴로지를 기록하고 복원 시 존중할 수 있습니다. 자세한 내용은 외부 CSI Documentation을 참고하세요.
볼륨 스냅샷과 볼륨 스냅샷 콘텐츠의 수명 주기 (Lifecycle of a volume snapshot and volume snapshot content)
VolumeSnapshotContent는 클러스터의 리소스입니다. VolumeSnapshot은 그 리소스에 대한 요청입니다. VolumeSnapshotContent와 VolumeSnapshot 간의 상호작용은 다음 수명 주기를 따릅니다.
볼륨 스냅샷 프로비저닝 (Provisioning Volume Snapshot)
스냅샷이 프로비저닝될 수 있는 방법은 두 가지입니다: 사전-프로비저닝(pre-provisioned) 또는 동적 프로비저닝(dynamically provisioned).
사전-프로비저닝 (Pre-provisioned)
클러스터 관리자는 여러 개의 VolumeSnapshotContent를 만듭니다. 이들은 클러스터 사용자가 사용할 수 있는 스토리지 시스템의 실제 볼륨 스냅샷 세부 정보를 담고 있습니다. 이들은 Kubernetes API에 존재하며 소비에 사용할 수 있습니다.
동적 (Dynamic)
기존 스냅샷을 사용하는 대신, PersistentVolumeClaim에서 스냅샷을 동적으로 가져오도록 요청할 수 있어요. VolumeSnapshotClass는 스냅샷을 가져올 때 사용할 스토리지 제공자별 매개변수를 지정합니다.
바인딩 (Binding)
스냅샷 컨트롤러는 사전-프로비저닝과 동적 프로비저닝 시나리오 모두에서 VolumeSnapshot 객체를 적절한 VolumeSnapshotContent 객체와 바인딩하는 것을 처리합니다. 바인딩은 일대일 매핑입니다.
사전-프로비저닝 바인딩의 경우, 요청된 VolumeSnapshotContent 객체가 생성될 때까지 VolumeSnapshot은 바인딩되지 않은 상태로 유지됩니다.
스냅샷 소스 보호로서의 영구 볼륨 클레임 (Persistent Volume Claim as Snapshot Source Protection)
이 보호의 목적은 스냅샷이 만들어지는 동안 사용 중인 PersistentVolumeClaim API 객체가 시스템에서 제거되지 않도록 보장하는 것입니다(데이터 손실로 이어질 수 있으므로).
PersistentVolumeClaim의 스냅샷을 만드는 동안 그 PersistentVolumeClaim은 사용 중입니다. 스냅샷 소스로 활발히 사용 중인 PersistentVolumeClaim API 객체를 삭제하면 PersistentVolumeClaim 객체는 즉시 제거되지 않습니다. 대신 스냅샷이 readyToUse가 되거나 중단될 때까지 PersistentVolumeClaim 객체의 제거가 연기됩니다.
삭제 (Delete)
삭제는 VolumeSnapshot 객체를 삭제함으로써 촉발되며, DeletionPolicy를 따릅니다. DeletionPolicy가 Delete이면 기저 스토리지 스냅샷이 VolumeSnapshotContent 객체와 함께 삭제됩니다. DeletionPolicy가 Retain이면 기저 스냅샷과 VolumeSnapshotContent가 모두 유지됩니다.
VolumeSnapshots
각 VolumeSnapshot은 spec과 status를 포함합니다.
apiVersion: snapshot.storage.k8s.io/v1
kind: VolumeSnapshot
metadata:
name: new-snapshot-test
spec:
volumeSnapshotClassName: csi-hostpath-snapclass
source:
persistentVolumeClaimName: pvc-test
persistentVolumeClaimName은 스냅샷의 PersistentVolumeClaim 데이터 소스의 이름입니다. 이 필드는 스냅샷을 동적으로 프로비저닝하는 데 반드시 필요합니다.
볼륨 스냅샷은 volumeSnapshotClassName 속성을 사용해 VolumeSnapshotClass의 이름을 지정해 특정 클래스를 요청할 수 있어요. 아무것도 설정하지 않으면 사용 가능하다면 기본 클래스가 사용됩니다.
사전-프로비저닝 스냅샷의 경우 다음 예시와 같이 스냅샷의 소스로 volumeSnapshotContentName을 지정해야 합니다. volumeSnapshotContentName 소스 필드는 사전-프로비저닝 스냅샷에 반드시 필요합니다.
apiVersion: snapshot.storage.k8s.io/v1
kind: VolumeSnapshot
metadata:
name: test-snapshot
spec:
source:
volumeSnapshotContentName: test-content
Volume Snapshot Contents
각 VolumeSnapshotContent는 spec과 status를 포함합니다. 동적 프로비저닝에서 스냅샷 공통 컨트롤러가 VolumeSnapshotContent 객체를 만듭니다. 예시입니다.
apiVersion: snapshot.storage.k8s.io/v1
kind: VolumeSnapshotContent
metadata:
name: snapcontent-72d9a349-aacd-42d2-a240-d775650d2455
spec:
deletionPolicy: Delete
driver: hostpath.csi.k8s.io
source:
volumeHandle: ee0cfb94-f8d4-11e9-b2d8-0242ac110002
sourceVolumeMode: Filesystem
volumeSnapshotClassName: csi-hostpath-snapclass
volumeSnapshotRef:
name: new-snapshot-test
namespace: default
uid: 72d9a349-aacd-42d2-a240-d775650d2455
volumeHandle은 스토리지 백엔드에서 생성되고 볼륨 생성 중 CSI 드라이버가 반환하는 볼륨의 고유 식별자입니다. 이 필드는 스냅샷을 동적으로 프로비저닝하는 데 반드시 필요합니다. 스냅샷의 볼륨 소스를 지정합니다.
사전-프로비저닝 스냅샷의 경우 사용자(클러스터 관리자)가 다음과 같이 VolumeSnapshotContent 객체를 만들 책임이 있습니다.
apiVersion: snapshot.storage.k8s.io/v1
kind: VolumeSnapshotContent
metadata:
name: new-snapshot-content-test
spec:
deletionPolicy: Delete
driver: hostpath.csi.k8s.io
source:
snapshotHandle: 7bdd0de3-aaeb-11e8-9aae-0242ac110002
sourceVolumeMode: Filesystem
volumeSnapshotRef:
name: new-snapshot-test
namespace: default
snapshotHandle은 스토리지 백엔드에서 생성된 볼륨 스냅샷의 고유 식별자입니다. 이 필드는 사전-프로비저닝 스냅샷에 반드시 필요합니다. 이 VolumeSnapshotContent가 나타내는 스토리지 시스템의 CSI 스냅샷 id를 지정합니다.
sourceVolumeMode는 스냅샷이 찍힌 볼륨의 모드입니다. sourceVolumeMode 필드의 값은 Filesystem 또는 Block일 수 있습니다. 소스 볼륨 모드가 지정되지 않으면 Kubernetes는 스냅샷을 소스 볼륨의 모드가 알려지지 않은 것으로 취급합니다.
volumeSnapshotRef는 해당 VolumeSnapshot의 참조입니다. VolumeSnapshotContent가 사전-프로비저닝 스냅샷으로 생성될 때 volumeSnapshotRef가 참조하는 VolumeSnapshot은 아직 존재하지 않을 수 있다는 점에 유의하세요.
스냅샷의 볼륨 모드 변환 (Converting the volume mode of a Snapshot)
클러스터에 설치된 VolumeSnapshots API가 sourceVolumeMode 필드를 지원하면, 그 API는 권한 없는 사용자가 볼륨의 모드를 변환하는 것을 방지할 수 있는 능력이 있습니다.
클러스터가 이 기능에 대한 능력이 있는지 확인하려면 다음 명령을 실행하세요.
$ kubectl get crd volumesnapshotcontent -o yaml
사용자가 기존 VolumeSnapshot에서 PersistentVolumeClaim을 만들되 소스와 다른 볼륨 모드로 만들 수 있게 하려면, VolumeSnapshot에 해당하는 VolumeSnapshotContent에 어노테이션 snapshot.storage.kubernetes.io/allow-volume-mode-change: "true"를 추가해야 합니다.
사전-프로비저닝 스냅샷의 경우 spec.sourceVolumeMode를 클러스터 관리자가 채워야 합니다.
이 기능이 활성화된 VolumeSnapshotContent 리소스 예시는 다음과 같습니다.
apiVersion: snapshot.storage.k8s.io/v1
kind: VolumeSnapshotContent
metadata:
name: new-snapshot-content-test
annotations:
- snapshot.storage.kubernetes.io/allow-volume-mode-change: "true"
spec:
deletionPolicy: Delete
driver: hostpath.csi.k8s.io
source:
snapshotHandle: 7bdd0de3-aaeb-11e8-9aae-0242ac110002
sourceVolumeMode: Filesystem
volumeSnapshotRef:
name: new-snapshot-test
namespace: default
볼륨 스냅샷 토폴로지 (Volume Snapshot Topology)
일부 클러스터에서 스냅샷은 클러스터의 일부에서만 사용할 수 있습니다. 예를 들어 존 간에 스토리지가 공유되지 않는 멀티-존 클러스터에서 한 존의 볼륨 스냅샷은 그 존에서만 사용할 수 있습니다: 스냅샷에서 복원된 볼륨은 스냅샷 데이터가 있는 곳에서만 생성될 수 있어요.
VolumeSnapshotTopology 기능이 활성화되면 이 토폴로지가 기록되고 존중됩니다.
- 클러스터 관리자는 VolumeSnapshotClass에
allowedTopologies를 설정해 동적으로 생성된 스냅샷이 어디서 사용 가능해야 하는지 요청할 수 있습니다. - CSI 드라이버는 스냅샷이 어디서 사용 가능한지 보고하고,
csi-snapshotter사이드카가 이를VolumeSnapshotContent.spec.nodeAffinity에 기록합니다. - 스냅샷에서 볼륨을 프로비저닝할 때 이 토폴로지를 사용해 복원된 볼륨을 스냅샷 데이터에 접근 가능한 곳에 배치합니다.
이것은 CSI 사이드카의 알파 기능이며, csi-snapshotter와 external-provisioner의 VolumeSnapshotTopology 기능 게이트로 활성화됩니다. 자세한 내용은 외부 CSI Documentation을 참고하세요.
스냅샷에서 볼륨 프로비저닝 (Provisioning Volumes from Snapshots)
PersistentVolumeClaim 객체의 dataSource 필드를 사용해 스냅샷의 데이터로 미리 채워진 새 볼륨을 프로비저닝할 수 있어요.
자세한 내용은 Volume Snapshot and Restore Volume from Snapshot을 참고하세요.