볼륨 스냅샷

개요

데이터를 보존하는 전략 중 흔히 쓰이는 것 중 하나가 스냅샷, 복제이다.
쿠버네티스에서도 이러한 기능을 제공하는데, 코어 api로 넣어두진 않았고 CRD로 설치할 수 있게 해두었다.
마치 Gateway API와 같은 식이다.
이 기능은 CSI 드라이버를 통한 볼륨에 대해서만 지원된다.
쿠버네티스에서는 CSI 인터페이스에 스냅샷과 관련된 사이드카 인터페이스까지 마련해주고 있기에 각 csi 드라이버가 이를 구현할 수 있다.

다시 정리해 말하자면, 이 기능을 지원하는 csi 드라이버를 설치해야 하고 관련 CRD를 설치해서 이용할 수 있다.

설계

라이프사이클

간단하게 아래의 [[#종류]]에 있는 각 오브젝트를 살짝 훑어보고 오자.
기본적인 흐름은 PV와 판박이다.
VolumeSnapshotContent라는 관리자가 프로비저닝하는 자원이 있고, VolumeSnapshot을 통해 이를 요청한다.
이때 미리 설정 양식을 VolumeSnapshotClass를 통해 지정할 수 있으며 이를 통해 동적으로 프로비저닝을 받을 수 있다.

라이프사이클에 관련된 그림은 아니나, 전체 구조를 잡는 그림으로 보면서 라이프사이클은 간단하게만 훑자.

종류

여기에는 세 가지의 오브젝트가 존재한다.

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

참고


  1. https://kubernetes.io/docs/concepts/storage/volume-snapshot-classes/ ↩︎