[DIAMANTI] K8S Volume Snapshot
오늘은 Diamanti Snapshot 테스트 내역을 공유 하겠습니다. Diamanti는 자체 snapshot 기능을 제공하여 kube 표준 snapshot API 환경에서 Kube PVC 기준 snapshot 생성, 복구 가능합니다. 아마도 다른 3rd Party Kube 지원 Storage에서도 유사한 기능을 제공하니 참고하시면 도움이 될 것 같습니다.
TL;DR
- Kubernetes 표준 CRD snapshot 기능 이용하여 Kube PVC 기준 데이터 백업, 복구 가능
- Diamanti 이용 시 추가 백업 솔루션 구매 필요 없음 ^^
먼저, Kube에 제공하는 snapshot 관련 표준 CRD를 확인해 보겠습니다.
Snapshot 관련 표준 CRD [spkr@erdia22 22.Snapshot (sp01:default)]$ k get crd|grep snapshot
volumesnapshotclasses.snapshot.storage.k8s.io 2021-02-16T05:50:57Z
volumesnapshotcontents.snapshot.storage.k8s.io 2021-02-16T05:50:57Z
volumesnapshots.snapshot.storage.k8s.io 2021-02-16T05:50:57Z
volumesnapshots 이 snapshot 리스트(일종의 PVC) 이며 contents는 실제 data(PV), class가 Storage Class 정도 됩니다. (정확한지는…)
Snapshot에 사용할 PVC 와 Deploy를 생성합니다.
POD 접속하면 정상적으로 data가 생성되고 있습니다. (date 명령어로 현재 시간을 기록하고 있습니다.)
[spkr@erdia22 ~ (spkcluster:default)]$ k exec -it date-deploy-fd7664b44-qqxln -- sh
/ # cat /data/
lost+found/ pod-out.txt
/ # cat /data/pod-out.txt
Fri Mar 5 19:49:34 UTC 2021
Fri Mar 5 19:49:44 UTC 2021
Fri Mar 5 19:49:54 UTC 2021
Fri Mar 5 19:50:04 UTC 2021
그럼, date-pvc 대상으로 Snapshot을 생성하겠습니다. 다른 k8s Object와 동일하게 snapshot 역시 VolumeSnapshot 이름을 사용합니다.
apiVersion: snapshot.storage.k8s.io/v1beta1
kind: VolumeSnapshot
metadata:
name: date-snapshot
spec:
volumeSnapshotClassName: default-snapclass
source:
persistentVolumeClaimName: date-pvc
SnapshotClass 이름은 volumesnapshotClass 이름을 사용합니다.
[spkr@erdia22 22.Snapshot (spkcluster:default)]$ k get volumesnapshotclasses.snapshot.storage.k8s.io
NAME DRIVER DELETIONPOLICY AGE
default-snapclass dcx.csi.diamanti.com Delete 36h
생성한 snapshot 확인해 보겠습니다.
[spkr@erdia22 22.Snapshot (spkcluster:default)]$ k get volumesnapshots.snapshot.storage.k8s.io
NAME READYTOUSE SOURCEPVC SOURCESNAPSHOTCONTENT RESTORESIZE SNAPSHOTCLASS SNAPSHOTCONTENT CREATIONTIME AGE
date-snapshot true date-pvc 10Gi default-snapclass snapcontent-441ec7b4-16f5-4df7-8b78-49fbe0a86861 88s 2m3s
snapshotcontents로도 확인 가능합니다.
[spkr@erdia22 22.Snapshot (spkcluster:default)]$ k get volumesnapshotcontents.snapshot.storage.k8s.io
NAME READYTOUSE RESTORESIZE DELETIONPOLICY DRIVER VOLUMESNAPSHOTCLASS VOLUMESNAPSHOT AGE
snapcontent-441ec7b4-16f5-4df7-8b78-49fbe0a86861 true 10737418240 Delete dcx.csi.diamanti.com default-snapclass date-snapshot 2m29s
그럼, 해당 snapshot 복구를 위해서 먼저 해당 snapshot 으로 PVC를 만들어 보겠습니다.
apiVersion: v1
kind: PersistentVolumeClaim
metadata:
name: restore-date-pvc
spec:
storageClassName: high
dataSource:
name: date-snapshot
kind: VolumeSnapshot
apiGroup: snapshot.storage.k8s.io
accessModes:
- ReadWriteOnce
resources:
requests:
storage: 10Gi
snapshot 이름과 동일하게 하고 용량 또한 처음 생성한 PVC 용량과 같게합니다. 적용하면 정상적으로 PVC 생성됩니다.
[spkr@erdia22 22.Snapshot (spkcluster:default)]$ ka crd-pvc-from-snap.yml
persistentvolumeclaim/restore-date-pvc created[spkr@erdia22 22.Snapshot (spkcluster:default)]$ k get pvc
NAME STATUS VOLUME CAPACITY ACCESS MODES STORAGECLASS AGE
date-pvc Bound pvc-aa1553d0-9c59-44e4-bd33-23039bfd066b 10Gi RWO high 14m
restore-date-pvc Bound pvc-0427e383-fee8-4851-9a37-bc7987892441 10Gi RWO high 18s
해당 PVC를 다른 pod에서 불러와서 기존에 있는 Data가 정상적으로 복구되는지 확인해 보겠습니다.
POD 실행 명령어만 기존 date 결과를 찍는 거에서 sleep inf 으로 변경하고 PVC 이름을 snapshot 복구한 pvc로 지정 하였습니다.
[spkr@erdia22 22.Snapshot (spkcluster:default)]$ kgp
NAME READY STATUS RESTARTS AGE IP NODE NOMINATED NODE READINESS GATES
restore-date-deploy-56b9f9f887-zh2mx 1/1 Running 0 36s 10.10.100.65 dia03 <none> <none>[spkr@erdia22 22.Snapshot (spkcluster:default)]$ k exec -it restore-date-deploy-56b9f9f887-zh2mx -- sh
/ # cd /data/
/data # ls
lost+found pod-out.txt
/data # cat pod-out.txt
Fri Mar 5 19:49:34 UTC 2021
Fri Mar 5 19:49:44 UTC 2021
Fri Mar 5 19:49:54 UTC 2021
(생략)
Fri Mar 5 19:58:18 UTC 2021
Fri Mar 5 19:58:28 UTC 2021
/data # date
Fri Mar 5 20:11:43 UTC 2021
기존 데이터 그대로 복원된 걸 확인 가능 합니다. 한가지 유의할 것은 snapshot으로 복구하여 별도의 볼륨을 따로 생성한 것이 아니라 기존 볼륨을 그대로 공유한다는 사실입니다. (LCV, Linked Clone Volume)
본 포스팅은 Diamanti 내에서 snapshot을 이용 하였고 Diamanti가 아닌 외장 3rd Party NFS(or NAS) 이용한 Cronjob 기반 scheduled snapshot은 다른 포스팅으로 소개 하겠습니다.