728x90
반응형
VolumeSnapshot을 주기적으로 생성할 수 있는 방법을 검색하던 도중 snapscheduler라는 프로젝트를 발견했습니다.
helm으로 간단하게 설치가 가능해서 실제로 잘 동작하는지 실습을 통해 알아봤습니다.
해당 실습 전에 Volume Snapshots Controller가 클러스터에 설치가 되어 있어야 합니다.
설치 과정은 이전 포스팅에 정리해 두었습니다.
설치
$ helm repo add backube https://backube.github.io/helm-charts/
$ kubectl create namespace backube-snapscheduler
$ helm install -n backube-snapscheduler snapscheduler backube/snapscheduler
예제
먼저 복구 테스트용 pod와 pvc를 생성하겠습니다.
---
apiVersion: v1
kind: PersistentVolumeClaim
metadata:
name: ebs-claim
spec:
accessModes:
- ReadWriteOnce
resources:
requests:
storage: 4Gi
storageClassName: gp3
---
apiVersion: v1
kind: Pod
metadata:
name: app
spec:
terminationGracePeriodSeconds: 3
containers:
- name: app
image: centos
command: ["/bin/sh"]
args: ["-c", "while true; do echo $(date -u) >> /data/out.txt; sleep 5; done"]
volumeMounts:
- name: persistent-storage
mountPath: /data
volumes:
- name: persistent-storage
persistentVolumeClaim:
claimName: ebs-claim
참고로 pod에서는 /data/out.txt 파일에 시간을 남기고 있습니다.
kubectl exec app -- tail -f /data/out.txt
Tue May 9 14:18:34 UTC 2023
Tue May 9 14:18:39 UTC 2023
Tue May 9 14:18:44 UTC 2023
Tue May 9 14:18:49 UTC 2023
이제 default namespace에 있는 pv에 대해서 5분마다 snapshot을 생성하는 scheduler를 생성해보겠습니다.
snapshotClassName은 실제 클러스터 내 vsclass 명과 일치시키면 됩니다.
apiVersion: snapscheduler.backube/v1
kind: SnapshotSchedule
metadata:
# The name for this schedule. It is also used as a part
# of the template for naming the snapshots.
name: every-5min
# Schedules are namespaced objects
namespace: default
spec:
# A LabelSelector to control which PVCs should be snapshotted
claimSelector: # optional
# Set to true to make the schedule inactive
disabled: false # optional
retention:
# The length of time a given snapshot should be
# retained, specified in hours. (168h = 1 week)
expires: "168h" # optional
# The maximum number of snapshots per PVC to keep
maxCount: 10 # optional
# The cronspec (https://en.wikipedia.org/wiki/Cron#Overview)
# that defines the schedule. It is interpreted with
# respect to the UTC timezone. The following pre-defined
# shortcuts are also supported: @hourly, @daily, @weekly,
# @monthly, and @yearly
schedule: "*/5 * * * *"
snapshotTemplate:
# A set of labels can be added to each
# VolumeSnapshot object
labels: # optional
mylabel: myvalue
# The SnapshotClassName to use when creating the
# snapshots. If omitted, the cluster default will
# be used.
snapshotClassName: csi-aws-vsc # optional
snapshotschedules이 정상적으로 생성된 것을 볼 수 있습니다.
$ kubectl get snapshotschedules
NAME SCHEDULE MAX AGE MAX NUM DISABLED NEXT SNAPSHOT
every-5min */5 * * * * 168h 10 false 2023-05-09T14:25:00Z
설정한 시간이 되면 volumesnapshot이 생성된 것을 볼 수 있습니다.
$ k get volumesnapshot
NAME READYTOUSE SOURCEPVC SOURCESNAPSHOTCONTENT RESTORESIZE SNAPSHOTCLASS SNAPSHOTCONTENT CREATIONTIME AGE
ebs-claim-every-5min-202305091425 true ebs-claim 4Gi csi-aws-vsc snapcontent-712c0559-a2f5-4513-8141-29f5519fd313 43s 43s
이제 pod와 pvc를 삭제하겠습니다.
$ k get po,pvc,pv
No resources found
그리고 snapshot을 사용해서 pvc를 만듭니다.
apiVersion: v1
kind: PersistentVolumeClaim
metadata:
name: ebs-snapshot-restored-claim
spec:
storageClassName: gp3
accessModes:
- ReadWriteOnce
resources:
requests:
storage: 4Gi
dataSource:
name: ebs-claim-every-5min-202305091425
kind: VolumeSnapshot
apiGroup: snapshot.storage.k8s.io
pvc가 연결된 pod도 새로 만듭니다.
apiVersion: v1
kind: Pod
metadata:
name: app
spec:
containers:
- name: app
image: centos
command: ["/bin/sh"]
args: ["-c", "while true; do echo $(date -u) >> /data/out.txt; sleep 5; done"]
volumeMounts:
- name: persistent-storage
mountPath: /data
volumes:
- name: persistent-storage
persistentVolumeClaim:
claimName: ebs-snapshot-restored-claim
$ k get po,pvc,pv
NAME READY STATUS RESTARTS AGE
pod/app 1/1 Running 0 21s
NAME STATUS VOLUME CAPACITY ACCESS MODES STORAGECLASS AGE
persistentvolumeclaim/ebs-snapshot-restored-claim Bound pvc-39872e70-b384-4821-a7f8-ee2297c97117 4Gi RWO gp3 39s
NAME CAPACITY ACCESS MODES RECLAIM POLICY STATUS CLAIM STORAGECLASS REASON AGE
persistentvolume/pvc-39872e70-b384-4821-a7f8-ee2297c97117 4Gi RWO Delete Bound default/ebs-snapshot-restored-claim gp3 17s
이제 생성된 pod에 이전 데이터가 남아있는지 확인해보겠습니다.
25분 이전 데이터가 있는 것을 확인 했고 복구 이후인 29분 이후 새로운 로그가 남은 것을 볼 수 있습니다.
$ kubectl exec app -- cat /data/out.txt
...
Tue May 9 14:23:54 UTC 2023
Tue May 9 14:23:59 UTC 2023
Tue May 9 14:24:04 UTC 2023
Tue May 9 14:24:09 UTC 2023
Tue May 9 14:24:14 UTC 2023
Tue May 9 14:24:19 UTC 2023
Tue May 9 14:24:24 UTC 2023
Tue May 9 14:24:29 UTC 2023
Tue May 9 14:24:34 UTC 2023
Tue May 9 14:24:39 UTC 2023
Tue May 9 14:24:44 UTC 2023
Tue May 9 14:24:49 UTC 2023
Tue May 9 14:24:54 UTC 2023
Tue May 9 14:29:36 UTC 2023
Tue May 9 14:29:41 UTC 2023
Tue May 9 14:29:46 UTC 2023
...
이상으로 snapshot scheduler 실습을 마치겠습니다.
참고 문서
728x90
'Kubernetes > EKS Study' 카테고리의 다른 글
[4주차] EKS Observability (0) | 2023.05.21 |
---|---|
[3주차] EKS Storage (0) | 2023.05.09 |
EKS에서 pvc로 생성한 ebs에 태그 추가하기 (0) | 2023.05.09 |
[2주차] EKS Networking (0) | 2023.05.01 |
[1주차] EKS 설치 및 기본 사용 (2) | 2023.04.24 |