EKS에 프로비져닝된 ebs 볼륨 유형 마이그레이션하기

Hoonkii·2024년 7월 14일
0

개요

처음 EKS 를 셋업했을 때 기본 스토리지 클래스(gp2) 로 볼륨을 프로비져닝 하였다. ebs 볼륨 유형에 대해서 공부해보니 gp3가 gp2 보다 기본 용량 대비 iops 성능도 좋고 비용도 20% 정도 저렴한 것을 알게 되었다.

default 스토리지 클래스를 gp3 로 변경하였지만, 기존에 프로비져닝 된 볼륨의 유형은 따로 바꿔주어야 했다.

ebs는 볼륨 스냅샷을 생성할 수 있는 기능을 지원하고, 쿠버네티스에서는 볼륨스냅샷을 바탕으로 PV와 PVC 를 프로비져닝할 수 있는 기능을 지원한다.
오늘은 이 기능들을 활용해서 기존에 gp2 로 프로비져닝 된 볼륨을 gp3 로 마이그레이션하는 방법에 대해 다루려고 한다.

Prerequisite

본격 적인 마이그레이션 전에 VolumeSnapshot 관련 CRD 및 Deployment 를 설치해야 한다.

[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

그 다음 aws 에 생성한 snapshot 을 프로비져닝할 수 있게 도와주는 SnapshotController 를 설치해야 한다.

[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

설치하면 kube-system 네임스페이스에 snapshot controller pod이 생성되어야 한다.

마지막으로 VolumeSnapshotClass를 설치한다.

[VolumeSnapshotClass 설치]

apiVersion: snapshot.storage.k8s.io/v1
kind: VolumeSnapshotClass
metadata:
  name: ebs-csi-aws
driver: ebs.csi.aws.com
deletionPolicy: Delete
kubectl apply -f volumesnapshot.yaml

볼륨 유형 마이그레이션 방법

gp2 로 생성한 볼륨의 스냅샷을 떠서 gp3 유형으로 마이그레이션하는 것이 목적이다.

  1. 마이그레이션 대상 PVC 로 부터 볼륨 ID를 구한다.
 kubectl get pv `pv 이름` -o jsonpath='{.spec.awsElasticBlockStore.volumeID}'
  1. aws cli 를 통해 스냅샷을 생성한다.
aws ec2 create-snapshot --volume-id [볼륨id] --tag-specifications 'ResourceType=snapshot,Tags=[{Key="ec2:ResourceTag/ebs.csi.aws.com/cluster",Value="true"}]'

커맨드를 통해 얻은 snapshot id 를 복사해놓자.

  1. VolumeSnapshotContent를 생성한다.
apiVersion: snapshot.storage.k8s.io/v1
kind: VolumeSnapshotContent
metadata:
  name: imported-aws-snapshot-content
spec:
  volumeSnapshotRef: # VolumeSnapshot 은 아직 만들지 않았지만 상관 없다. 다음 step에 만들 것이다. 
    kind: VolumeSnapshot
    name: imported-aws-snapshot
    namespace: prometheus
  source:
    snapshotHandle: [생성한 볼륨 snapshot id]
  driver: ebs.csi.aws.com
  deletionPolicy: Delete
  volumeSnapshotClassName: ebs-csi-aws # 처음에 만든 VolumeSnapshotClass 이름

중간 volumeSnapshotRef 에 보면 나는 아직 VolumeSnapshot 을 생성하지 않았는데? 라는 의문이 들 수 있지만 상관 없다. 다음 Step에서 명시된 대로 만들면 된다.

  1. VolumeSnapshot을 생성한다.

여기서 주의할 점은 3에서 명시한 Ref 랑 똑같이 맞춰주어야 한다.

apiVersion: snapshot.storage.k8s.io/v1
kind: VolumeSnapshot
metadata:
  name: imported-aws-snapshot
  namespace: prometheus
spec:
  volumeSnapshotClassName: ebs-csi-aws # 처음에 만든 VolumeSnapshotClass 이름
  source:
    volumeSnapshotContentName: imported-aws-snapshot-content # step 3 에서 만든 VolumeSnapshotContent 이름
  1. PVC 교체

볼륨을 교체하려면 pod이 사용하고 있는 persistentVolumeClaim 항목을 바꿔야 한다. 나의 경우 helm chart 로 구성된 grafana 의 볼륨을 교체해야 했기 때문에 PVC 이름은 동일하게 가져가야 했다. 그래서 grafana deployment 의 replica를 잠시 0으로 조정한 후 기존 pvc를 삭제하였고, 동일한 이름의 pvc 를 VolumeSnapshot 으로부터 생성하였다.

apiVersion: v1
kind: PersistentVolumeClaim
metadata:
  name: prometheus-stack-grafana
spec:
  accessModes:
  - ReadWriteOnce
  storageClassName: gp3
  resources:
    requests:
      storage: 10Gi
  dataSource:
    name: imported-aws-snapshot
    kind: VolumeSnapshot
    apiGroup: snapshot.storage.k8s.io

이후 replica 를 다시 1로 조정하면 gp3 스토리지 클래스가 스냅샷으로 부터 gp3 유형의 볼륨을 프로비져닝 해준다.

grafana 볼륨이 gp3 로 마이그레이션 된 것을 확인할 수 있다.

grafana 접속 후 대시보드 데이터가 그대로 남아 있는 것을 확인하였다.

Reference

profile
개발 공부 내용 정리

0개의 댓글