볼륨 스냅샷
개요
데이터를 보존하는 전략 중 흔히 쓰이는 것 중 하나가 스냅샷, 복제이다.
쿠버네티스에서도 이러한 기능을 제공하는데, 코어 api로 넣어두진 않았고 CRD로 설치할 수 있게 해두었다.
마치 Gateway API와 같은 식이다.
이 기능은 CSI 드라이버를 통한 볼륨에 대해서만 지원된다.
쿠버네티스에서는 CSI 인터페이스에 스냅샷과 관련된 사이드카 인터페이스까지 마련해주고 있기에 각 csi 드라이버가 이를 구현할 수 있다.
다시 정리해 말하자면, 이 기능을 지원하는 csi 드라이버를 설치해야 하고 관련 CRD를 설치해서 이용할 수 있다.
설계
라이프사이클
간단하게 아래의 [[#종류]]에 있는 각 오브젝트를 살짝 훑어보고 오자.
기본적인 흐름은 PV와 판박이다.
VolumeSnapshotContent라는 관리자가 프로비저닝하는 자원이 있고, VolumeSnapshot을 통해 이를 요청한다.
이때 미리 설정 양식을 VolumeSnapshotClass를 통해 지정할 수 있으며 이를 통해 동적으로 프로비저닝을 받을 수 있다.
라이프사이클에 관련된 그림은 아니나, 전체 구조를 잡는 그림으로 보면서 라이프사이클은 간단하게만 훑자.
- 프로비저닝 - VolumeSnapshotContent가 만들어짐
- 정적 - 관리자가 직접 어떤 스냅샷을 클러스터 자원으로서 VolumelSnapshotContent로 만든다.
- 동적 - 유저가 존재하는 PVC에 대해 VolumeSnapshot를 요청한다.
- 이렇든 저렇든 VolumeSnapshotConent가 만들어진다.
- 바인딩 - VolumeSnapshot이 바인딩됨
- VolumeSnapshot과 VolumeSnapshot이 바인딩된다.
- 이 관계는 pv와 pvc처럼 1대1 관계이다.
- 동적의 경우, PVC가 스냅샷의 내용물이 되기 때문에 이 PVC는 스냅샷이 완전히 생성되기까지 보호된다.
- 삭제 - 삭제
- VolumeSnapshot의 삭제 요청이 일어나면 삭제 정책(DeletionPolicy)에 따라 자원의 유지가 결정된다.
- 이건 아래에서 조금 더 다루겠다.
종류
여기에는 세 가지의 오브젝트가 존재한다.
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
관리자에 의해 프로비저닝된 볼륨의 스냅샷이다.
PV와 같다고 할 수 있다.
위 예시는 동적으로 생성된 예시인데, source.volumeHandle
에 CSI 드라이버에서 만들어준 볼륨 식별자가 담긴다.
source:
snapshotHandle: 7bdd0de3-aaeb-11e8-9aae-0242ac110002
정적으로 만들 때는 필드 이름을 다르게 써준다.
volumeSnapshotRef
부분은 연결된 스냅샷이 있을 때 알아서 생성된다.
- snapshot.storage.kubernetes.io/allow-volume-mode-change: "true"
어노테이션을 달아주면, 해당 컨텐트가 filesystem이어도 block으로 스냅샷을 뜬다던가 하는 게 가능해진다.
VolumeSnapshot
apiVersion: snapshot.storage.k8s.io/v1
kind: VolumeSnapshot
metadata:
name: new-snapshot-test
spec:
volumeSnapshotClassName: csi-hostpath-snapclass
source:
persistentVolumeClaimName: pvc-test
유저에 의해 요청된 볼륨 스냅샷이다.
PVC와 같다고 할 수 있다.
위처럼 source
필드를 지정해서 원하는 오브젝트로부터 스냅샷을 뜬다.
...
spec:
source:
volumeSnapshotContentName: test-content
...
이미 만들어져있는 volumeSnapshotContent에 연결할 때는 요렇게 써준다.
스냅샷 오브젝트는 pvc에서 dataSource를 통해 사용할 수 있다.
VolumeSnapshotClass
apiVersion: snapshot.storage.k8s.io/v1
kind: VolumeSnapshotClass
metadata:
name: csi-hostpath-snapclass
annotations:
snapshot.storage.kubernetes.io/is-default-class: "true"
driver: hostpath.csi.k8s.io
deletionPolicy: Delete
parameters:
스냅샷을 요청할 때 사용할 수 있는 설정, 정의를 명시해둔 오브젝트로, 스토리지 클래스와 같다고 할 수 있다.
ㄹㅇ 스클처럼 디폴트로 지정하는 것도 어노테이션으로 지정한다.[1]
사용할 driver
, deletionPolicy
, parameters
를 써주면 된다.
파라미터는 당연히 드라이버마다 다를 테니 각각의 드라이버를 참고해야 한다.
deletionPolicy는 Retain, Delete가 가능하다.
스냅샷이 제거될 때 컨텐트도 같이 없어질지 정하는 옵션이다.
근데 이것도 retain일 때 외부 자원이 남나?
관련 문서
이름 | noteType | created |
---|---|---|
볼륨 스냅샷 | knowledge | 2025-02-20 |
3주차 - 스토리지 | project | 2025-02-16 |