[AWS] EKS 스냅샷 생성 및 장애 복구 방법

JEONG SUJIN·2025년 1월 22일
0

스냅샷(Snapshot) 은 현재 상태를 저장하여 나중에 해당 상태로 복원할 수 있는 일종의 백업 파일이다

환경설정

external-snapshotter CRD 다운로드 및 설치

curl -s -O https://raw.githubusercontent.com/kubernetes-csi/external-snapshotter/master/client/config/crd/snapshot.storage.k8s.io_volumesnapshots.yaml
curl -s -O https://raw.githubusercontent.com/kubernetes-csi/external-snapshotter/master/client/config/crd/snapshot.storage.k8s.io_volumesnapshotclasses.yaml
curl -s -O https://raw.githubusercontent.com/kubernetes-csi/external-snapshotter/master/client/config/crd/snapshot.storage.k8s.io_volumesnapshotcontents.yaml

kubectl apply -f snapshot.storage.k8s.io_volumesnapshots.yaml,snapshot.storage.k8s.io_volumesnapshotclasses.yaml,snapshot.storage.k8s.io_volumesnapshotcontents.yaml
kubectl get crd | grep snapshot

VolumeSnapshot 리소스를 사용하려면 먼저 Kubernetes 클러스터에 필요한 Custom Resource Definitions(CRDs)을 등록

  • volumesnapshots는 스냅샷을 생성하고 관리할 수 있게 해줍니다.
  • volumesnapshotclasses는 스냅샷 클래스(어떤 스토리지 시스템에서 스냅샷을 생성할지 설정)를 정의합니다.
  • volumesnapshotcontents는 스냅샷의 내용을 설명합니다.

Snapshot Controller 설치 및 배포

# rbac-snapshot-controller.yaml 파일을 다운로드
curl -s -O https://raw.githubusercontent.com/kubernetes-csi/external-snapshotter/master/deploy/kubernetes/snapshot-controller/rbac-snapshot-controller.yaml
# setup-snapshot-controller.yaml 파일 다운로드
curl -s -O https://raw.githubusercontent.com/kubernetes-csi/external-snapshotter/master/deploy/kubernetes/snapshot-controller/setup-snapshot-controller.yaml

# 두 개의 YAML 파일을 Kubernetes 클러스터에 적용하는 명령어
kubectl apply -f rbac-snapshot-controller.yaml,setup-snapshot-controller.yaml

# 배포 상태 확인
kubectl get deploy -n kube-system snapshot-controller
  • snapshot-controller가 실행되는 데 필요한 RBAC (Role-Based Access Control) 권한을 설정하는 데 사용
  • snapshot-controller를 배포하는 Kubernetes 매니페스트 파일
# VolumeSnapshotClass 생성
curl -s -O https://raw.githubusercontent.com/kubernetes-sigs/aws-ebs-csi-driver/master/examples/kubernetes/snapshot/manifests/classes/snapshotclass.yaml
kubectl apply -f snapshotclass.yaml
kubectl get vsclass 
  • AWS EBS에서 스냅샷을 생성하기 위한 VolumeSnapshotClass 리소스의 YAML 파일을 다운로드
  • 다운로드되는 파일은 snapshotclass.yaml로, 이 파일은 EBS에서 스냅샷을 관리하는 설정

EBS 볼륨의 Kubernetes 스냅샷 생성

apiVersion: snapshot.storage.k8s.io/v1
kind: VolumeSnapshot # EBS 볼륨의 스냅샷을 생성
metadata:
  name: ebs-volume-snapshot # VolumeSnapshot의 이름을 ebs-volume-snapshot
spec:
  volumeSnapshotClassName: csi-aws-vsc
  source:
    persistentVolumeClaimName: my-pvc-claim

스냅샷이 생성된걸 확인할 수 있다.

장애발생, 복구가능한지 테스트

만들었던 ebs-my-app[pod] 와 my-pvc-claim[pvc] 를 삭제
이름은 변경해서 지금 코드와 캡쳐본이 다름.!

🔖 볼륨이 삭제되는지는 ReclaimPolicy 설정에 따라 다른데.
Retain: PVC를 삭제해도 EBS 볼륨은 삭제되지 않고 남아있다.
Delete: PVC를 삭제하면 자동으로 EBS 볼륨도 삭제됨

❗️❗️ 동적 프로비저닝을 사용하면 Kubernetes가 PersistentVolume (PV) 리소스를 자동으로 생성되기 때문에, ReclaimPolicy가 기본값인 Delete로 설정된다. ❗️ ❗️

다시 pvc,pod를 생성해주면 볼륨이 다시 생긴다.!
pvc 생성

apiVersion: v1
kind: PersistentVolumeClaim
metadata:
  name: ebs-snapshot-restored-claim
spec:
  storageClassName: my-storage-class 
  accessModes:
    - ReadWriteOnce
  resources:
    requests:
      storage: 4Gi
  dataSource:
    name: ebs-volume-snapshot # 복원할 스냅샷의 이름을 적어줘야함.
    kind: VolumeSnapshot
    apiGroup: snapshot.storage.k8s.io

pod생성

apiVersion: v1
kind: Pod
metadata:
  name: ebs-my-app
spec:
  containers:
  - name: app
    image: centos
    command: ["/bin/sh"]
    args: ["-c", "while true; do echo $(date -u) >> /data/out.txt; sleep 10; done"]
    volumeMounts:
    - name: persistent-storage
      mountPath: /data
  volumes:
  - name: persistent-storage
    persistentVolumeClaim:
      claimName: ebs-snapshot-restored-claim

profile
기록하기

0개의 댓글