CloudNet@ 팀의 가시다님께서 Leading 하시는 AEWS Study 3주차 스터디 내용 정리
이번 포스팅에서는 EKS Storage 를 Snapshot 으로 생성해주는 EBS Volume Snapshot Controller 에 대해 알아보겠습니다.
1. EBS Volume Snapshot Controller
PV 로 사용하고 있는 중요한 EBS 를 EKS 에서 바로 Snapshot 으로 백업할 수 있도록 하는 서비스입니다.
현재 Snapshot Controller 는 EKS Addon으로 추가되지 않았습니다.
그렇기 때문에 직접 Snapshot Controller 설치가 필요합니다.
- Snapshot Controller 설치 순서
1. kubernetes crd 설치
2. Snapshot Controller 설치
1.1. CRD 설치
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
CRD 리소스 확인
kubectl get crd | grep snapshot
kubectl api-resources | grep snapshot
1.2. 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
1.3. Test Pod 배포
cat << EOT > awsebs-vpc.yaml
apiVersion: v1
kind: PersistentVolumeClaim
metadata:
name: ebs-claim
spec:
accessModes:
- ReadWriteOnce
resources:
requests:
storage: 4Gi
storageClassName: gp3
EOT
cat << EOT > awsebs-pod.yaml
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
EOT
1.4. Volume Snapshot CRD 생성
apiVersion: snapshot.storage.k8s.io/v1
kind: VolumeSnapshot
metadata:
name: ebs-volume-snapshot
spec:
volumeSnapshotClassName: csi-aws-vsc
source:
persistentVolumeClaimName: ebs-claim
- CRD 를 생성하면 AWS 콘솔에서 Snapshot 이 생성된 것을 확인할 수 있습니다.
2. Snapshot 복원
강제적인 상황 설정을 위해 Pod , VPC, PVC 를 모두 삭제해보겠습니다.
해당 리소스를 삭제하면 AWS EBS 볼륨 또한 삭제됩니다. (Delete PV Reclaim Policy)
kubectl delete pod app && kubectl delete pvc ebs-claim
2.1. Snapshot Restore
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: 4Gi
dataSource:
name: ebs-volume-snapshot
kind: VolumeSnapshot
apiGroup: snapshot.storage.k8s.io
EOT
kubectl apply -f ebs-snapshot-restored-claim.yaml
- PVC 를 생성하되, 기존에 있던 Snapshot 으로 생성하도록 기능 추가
2.2. Pod 배포
cat << EOT > ebs-snapshot-restored-pod.yaml
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
EOT
kubectl apply -f ebs-snapshot-restored-pod.yaml
AWS 볼륨 콘솔에서 확인해보면 Snapshot 을 이용하여 PV에 사용할 EBS 를 생성한 후 EKS Node 에 Attach 된 것을 알 수 있습니다.