본문 바로가기
Tech/Kubernetes

[AEWS_1기] 3주차 - Amazon EKS Storage (3/5) - AWS Volume Snapshots Controller

by 구름_쟁이 2023. 5. 14.

본 시리즈는 가시다님의 AEWS(AWS EKS Workshop) 1기 진행 내용입니다. (가시다님 노션)

스터디에 사용되는 링크 (AWS EKS Workshop) 

 

목차

1. 스토리지의 이해 (링크)
2. AWS EBS Controller (링크)
3. AWS Volume Snapshots Controller
4. AWS EFS Controller
5. AWS Persistent Volume for Instance Store & Add Node Group

 

 

 

 


3. AWS Volume Snapshots Controller

 

이번에는 EBS를 백업하는 기능인 스냅샷을 k8s에서 관리하는 방법에 대한 내용이다.

스터디장님께서 알려주신 바로는 kOps는 AddOn으로 쉽게 controller 구성이 가능한 반면, EKS는 아직 AddOn방식이 제대로 반영되지 않은 듯 하다.

그래서 CRD부터 하나하나 다 배포한다.

 

Volumesnapshots 컨트롤러 설치 - 링크 VolumeSnapshot example Blog

(매번 느끼는 거지만 이런 것들도 다 찾아서 준비해주시는 스터디장님께 따봉, 따따봉을 ...)

# Install Snapshot CRDs
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
kubectl api-resources  | grep snapshot

# Install Common Snapshot Controller
curl -s -O https://raw.githubusercontent.com/kubernetes-csi/external-snapshotter/master/deploy/kubernetes/snapshot-controller/rbac-snapshot-controller.yaml
curl -s -O https://raw.githubusercontent.com/kubernetes-csi/external-snapshotter/master/deploy/kubernetes/snapshot-controller/setup-snapshot-controller.yaml
kubectl apply -f rbac-snapshot-controller.yaml,setup-snapshot-controller.yaml
kubectl get deploy -n kube-system snapshot-controller
kubectl get pod -n kube-system -l app=snapshot-controller

# Install Snapshotclass
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 # 혹은 volumesnapshotclasses

 

사용 example Blog

# PVC 생성
kubectl apply -f awsebs-pvc.yaml

# 파드 생성
kubectl apply -f awsebs-pod.yaml

# 파일 내용 추가 저장 확인
kubectl exec app -- tail -f /data/out.txt

# VolumeSnapshot 생성 : Create a VolumeSnapshot referencing the PersistentVolumeClaim name >> EBS 스냅샷 확인
curl -s -O https://raw.githubusercontent.com/gasida/PKOS/main/3/ebs-volume-snapshot.yaml
cat ebs-volume-snapshot.yaml | yh
kubectl apply -f ebs-volume-snapshot.yaml

# VolumeSnapshot 확인
kubectl get volumesnapshot
kubectl get volumesnapshot ebs-volume-snapshot -o jsonpath={.status.boundVolumeSnapshotContentName} ; echo
kubectl describe volumesnapshot.snapshot.storage.k8s.io ebs-volume-snapshot
kubectl get volumesnapshotcontents

# VolumeSnapshot ID 확인 
kubectl get volumesnapshotcontents -o jsonpath='{.items[*].status.snapshotHandle}' ; echo

# AWS EBS 스냅샷 확인
aws ec2 describe-snapshots --owner-ids self | jq
aws ec2 describe-snapshots --owner-ids self --query 'Snapshots[]' --output table

# app & pvc 제거 : 강제로 장애 재현
kubectl delete pod app && kubectl delete pvc ebs-claim

 

 

스냅샷으로 복원

# 스냅샷에서 PVC 로 복원
kubectl get pvc,pv
cat <<EOT > ebs-snapshot-restored-claim.yaml
apiVersion: v1
kind: PersistentVolumeClaim
metadata:
  name: ebs-snapshot-restored-claim
spec:
  storageClassName: gp3
  accessModes:
    - ReadWriteOnce
  resources:
    requests:
      storage: 10Gi
  dataSource:
    name: ebs-volume-snapshot
    kind: VolumeSnapshot
    apiGroup: snapshot.storage.k8s.io
EOT
cat ebs-snapshot-restored-claim.yaml | yh
kubectl apply -f ebs-snapshot-restored-claim.yaml

# 확인
kubectl get pvc,pv

# 파드 생성
curl -s -O https://raw.githubusercontent.com/gasida/PKOS/main/3/ebs-snapshot-restored-pod.yaml
cat ebs-snapshot-restored-pod.yaml | yh
kubectl apply -f ebs-snapshot-restored-pod.yaml

# 파일 내용 저장 확인 : 파드 삭제 전까지의 저장 기록이 남아 있다. 이후 파드 재생성 후 기록도 잘 저장되고 있다
kubectl exec app -- cat /data/out.txt
...
Sat Dec 24 15:12:24 UTC 2022
Sat Dec 24 15:12:24 UTC 2022
Sat Dec 24 15:24:23 UTC 2022
Sat Dec 24 15:24:23 UTC 2022
...

# 삭제
kubectl delete pod app && kubectl delete pvc ebs-snapshot-restored-claim && kubectl delete volumesnapshots ebs-volume-snapshot

 

 

실습

volumesnapshots만 namespace에 귀속

 

snapshot 생성

스냅샷 확인

 

스냅샷을 이용한 복원

확인

스냅샷 사용 준비 상태 확인

 

스냅샷 기반으로 PVC 생성

voumesnapshot에 대한 정보를 기입하기 위해 dataSource라는 파라미터가 추가

Pod 재생성

 

데이터 확인

로그 데이터 712개 라인 확인

 

실습 때는 편의를 위해 스냅샷 기반 PVC 신규 생성하고 새로운 pod(app) 배포하였다. (app pod에 대한 pv도 없는 상태)

일반적인 시나리오에서도 pv,pvc 가 모두 사라진 상황에서도 복원이 가능하다.

 

 

 

결론

쿠버네티스 상에서 볼륨의 스냅샷까지 관리할 수 있다는 점은 엄청난 장점으로 보인다.

AWS Console 상에서만 관리되었다면, 이 스냅샷을 기반으로 볼륨을 만들고 pod에 마운트하는 과정이 굉장히 번거로웠으리라..

쿠버네티스 환경을 운영하는 입장에서 이런 기능이 있다는 자각만으로도 업무 효율이 많이 상승하게 됨을 느낀다.

 

 

댓글