Ssoon

[2주차] CHAPTER-11 스토리지 볼륨 스냅샷 사용하기 본문

Production Kubernetes Online Study

[2주차] CHAPTER-11 스토리지 볼륨 스냅샷 사용하기

구구달스 2023. 3. 14. 20:21
이정훈님이 집필하신 "24단계 실습으로 정복하는 쿠버네티스" 로 진행하는 CloudNet@ 팀의 PKOS 2주차 정리입니다.

 쿠버네티스는 CSI (Container Storage Interface) 라는 추가 리소스를 이용 쿠버네티스 코어 코드에서 분리되어 스토리지를 독립적으로 사용할 수 있습니다.

🚩 Ceph 

✔ 오픈소스 소프트웨어(Software Defined Storage) 스토리지 플랫폼으로 단일 분산 컴퓨터 클러스터에 object 스토리지를 구현하고 object, block 및 file Level 의 스토리지 기능을 제공

✔ ROOK 사에서 제공하는 오퍼레이터를 이용해서 설치 할 수 있습니다.

rook-ceph 를 이용한 ceph 설치

✔ 각 node에 2개 이상의 디스크가 필요하며 각 node의 디스크로 분산 파일 시스템을 생성합니다.

 

💠 rook-ceph 오퍼레이터를 설치합니다. 

https://rook.io/docs/rook/v1.11/Getting-Started/quickstart/#prerequisites

 

Quickstart - Rook Ceph Documentation

Quickstart Welcome to Rook! We hope you have a great experience installing the Rook cloud-native storage orchestrator platform to enable highly available, durable Ceph storage in your Kubernetes cluster. If you have any questions along the way, please don'

rook.io

💠 ceph 클러스터를 기본 CephCluster 설정으로 설치합니다.

💠 ceph 툴박스를 설치하고 클러스터의 상태를 확인합니다.

health: HEALTH_WARN/mon c is low on available space

이 경고는 일반적으로 /var/lib/ceph/mon에 저장되는 모니터 디스크 공간에 대한 경고입니다. 이 경로는 OSD 블록 장치와 관련이 없는 루트 FS에 저장됩니다. 이 경고는 이 경로의 사용 가능한 공간이 30% 미만일 때 발생합니다(기본값은 30인 mon_data_avail_warn 참조). 경고를 무시하도록 변경하거나 해당 경로의 크기를 조정하여 RocksDB 데이터에 더 많은 공간을 확보할 수 있습니다.

 

💠 Ceph 블록 스토리지 용 storageclass 를 설치합니다.

💠 스냅샷을 사용하기 위해 external-snapshotter 와 스냅샷 클래스를 설치합니다.

https://github.com/kubernetes-csi/external-snapshotter/tree/master/client/config/crd

 

GitHub - kubernetes-csi/external-snapshotter: Sidecar container that watches Kubernetes Snapshot CRD objects and triggers Create

Sidecar container that watches Kubernetes Snapshot CRD objects and triggers CreateSnapshot/DeleteSnapshot against a CSI endpoint. - GitHub - kubernetes-csi/external-snapshotter: Sidecar container t...

github.com

💠 Snapshot Controller 를 설치합니다.

https://github.com/kubernetes-csi/external-snapshotter/tree/master/deploy/kubernetes/snapshot-controller

 

GitHub - kubernetes-csi/external-snapshotter: Sidecar container that watches Kubernetes Snapshot CRD objects and triggers Create

Sidecar container that watches Kubernetes Snapshot CRD objects and triggers CreateSnapshot/DeleteSnapshot against a CSI endpoint. - GitHub - kubernetes-csi/external-snapshotter: Sidecar container t...

github.com

💠 ROOK Ceph 스냅샷 클래스를 설치합니다.

https://rook.io/docs/rook/v1.9/ceph-csi-snapshot.html

 

Ceph Docs

Prerequisites Rook officially supports v1/v1beta1 snapshots for kubernetes v1.17+. Install the snapshot controller and snapshot v1/v1beta1 CRD as required. More info can be found here. Note: If only Alpha snapshots are available, enable snapshotter in rook

rook.io

  Ceph 볼륨에서 사용할 수 있는 snapshot class 을 확인할 수 있습니다.

👉 스냅샷 클래스를 이용해 스냅샷을 생성할 수 있습니다.

워드프레스 블로그 설치 및 스냅샷 생성

⛔ 워드프레스 설치

  rook-ceph PVC 이용하는 워드프레스 파드 YAML

https://raw.githubusercontent.com/wikibook/kubepractice/main/ch11/wordpress.yaml

Service.type: LoadBalancer
-> 워드프레스 웹서버를 로드밸러서 타입 서비스로 외부에 노출합니다.
PersistentVolumeClaim.storageClassName: rook-ceph-block
-> 스토리지 클래스는 ROOK 를 이용해 생성한 CEPH 스토리지 클래스를 사용합니다.
Deployment.containers.image: wordpress:4.6.1-apache
-> 컨테이너 이미지입니다.
Deployment.env.alue: wordpress-mysql
-> DB 파드의 서비스 이름으로 연결합니다.
volumeMounts.mountPath: /var/www/html
-> 웹서버의 루트 디렉토리를 파드의 Persistent Volume으로 지정합니다.
volumes.persistentVolumeClaim.claimName: wp-pv-claim
-> 웹서버의 PVC YAML 파일의 PVC이름을 동일하게 지정합니다.

  rook-ceph PVC 이용하는 워드프레스 MySQL 파드 YAML

https://raw.githubusercontent.com/wikibook/kubepractice/main/ch11/mysql.yaml

Service.name: wordpress-mysql
-> 웹서버에서 DB서버 연결에 사용한 서비스 이름
PersistentVolumeClaim.storageClassName: rook-ceph-block
-> PVC 생성용 스토리지 클래스를 CEPH 스토리지 클래스로 지정
Deployment.containers.image: mysql:5.6
-> 컨테이너 이미지
volumeMounts.mountPath: /var/lib/mysql
-> DB 서버의 데이터를 PVC에 저장합니다.
volumes.persistentVolumeClaim.claimName: mysql-pv-claim
-> PVC 이름을 지정, 해당 PVC는 DB의 데이터로 사용

💠 새로운 namespace 만들고 워드프레스를 설치합니다.

💠 설치한 워드프레스의 EXTERNAL-IP로 접속해서 기본설정을 완료하고 새로운 글을 작성합니다.

⛔ 스토리지 볼륨 스냅샷 생성

✔ 쿠버네티스 환경에서는 스냅샷도 하나의 리소스로서 YAML 파일로 생성 할 수 있습니다.

✔ 스냅샷 리소스 = VolumeSnapshotContent (실제 데이터가 저장되는 부분) + VolumeSnapshot (스냅샷을 요청)

✔ VolumeSnapshot을 생성하기 위해 VolumeSnapshotClass 가 필요합니다.

 

💠 VolumeSnapshot 을 생성하기 위해 스냅샷을 생성할  PVC 와 SnapshotClass 을 확인합니다.

✔ 워드프레스의 테스트 페이지가 저장되는 mysql-pv-claim 을 PVC 대상으로 스냅샷을 생성합니다.

스냅샷을 생성하기 위해 csi-rbdplugin-snapclass 을 사용합니다.

  MySQL 데이터를 백업하는 스냅샷 YAML

https://raw.githubusercontent.com/wikibook/kubepractice/main/ch11/mysql-pvc-snapshot.yml

kind: VolumeSnapshot
-> 볼륨스냅셧은 별도의 오브젝트로 지정
spec.volumeSnapshotClassName
-> 스냅샷을 만들 스냅샷 클래스 이름 지정
spec.source.persistentVolumeClaimName
-> 스냅샷을 생설할 PVC 이름 지정

💠 스냅샷을 생성합니다.

스냅샷을 이용한 데이터 복구

💠 앞서 생성한 테스트 글을 삭제하고 기존에 실행중인 PVC를 삭제을 위해 볼륨이 마운트 된 Pod 를 먼저 삭제 한 후 PVC 를 삭제합니다.

✔ 같은 이름의 PVC가 실행 중이면 스냅셧으로 같은 이름으로 PVC를 복구할 수 없습니다.

💠 스냅샷을 이용해 PVC를 복구합니다.

  스냅샷을 이용한 PVC 복구용 YAML

https://raw.githubusercontent.com/wikibook/kubepractice/main/ch11/snap-restore-pvc.yml

kind: PersistentVolumeClaim
-> PVC 복구/생성 시에도 동일하게 PVC API 리소스를 사용
metadata.name: mysql-pv-claim
-> PVC 이름은 복구하는 PVC 이름과 동일해야 기존 볼륨을 마운트할 수 있습니다.
spec.dataSource.name: mysql-snapshot-01
-> 스냅샷에서 PVC 복구에는 dataSource 를 사용합니다. 기존의 스냅샷 이름을 지정
spec.resources.requests.storage: 20Gi
-> 복구하는 PVC는 기존 PVC 와 동일한 용량

✔ 복구하는 PVC 이름을 기존에 MySQL 파드에서 사용하던 이름과 동일하게 지정합니다.

💠 이전에 삭제한 MySQL 파드를 다시 생성합니다.

💠 워드프레스에 접속하여 이전에 삭제한 글이 복구된것을 확인 합니다.

✅ rock-ceph 스토리지의 가용성 테스트 및 IOPS 성능 측정

✔ OpenEBS : Pod가 실행중인 호스트 Node 의 특정 디렉터리를 Pod의 Volume 으로 사용

✔ Ceph : Pod가 실행중인 하나의 Node가 아닌 여러 Node 에 분산된 디스크를 Pod의 Volume으로 사용

 => 여러 Node에 분산 저장해서 특정 Node가 다운돼도 다른 Node에서 데이터를 분산 처리할 수 있어 고가용성 보장

 => 여러 Node에서 서비스해서 각 Node간 분산 파일 처리에 필요한 오버헤드가 발생하여 성능 저하

 

💠 워드프레스 Pod가 실행중인 Node에서 실행중인 모든 Pod를 종료합니다.

✔ ubuntu20-1 에서 ubuntu20-2  로 이동해서 Pod가 자동으로 생성됩니다.

👉 PVC 를 사용해도 특정 Node 에 종속되지 않아 다른 Node로 이전해서 Pod가 실행됩니다.

💠 ubuntu20-1 Node를 복구합니다.

💠 스토리지의 IOPS 성능을 측정합니다.

💠 실습에 사용한 리소스를 삭제합니다.

Comments