스냅샷이 필요한 이유
쿠버네티스에서 애플리케이션은 대부분 PVC(PersistentVolumeClaim) 를 통해 스토리지를 사용한다.
하지만 단순히 PVC를 사용한다고 해서 자동으로 백업/복구 기능이 제공되는 것은 아니다.
운영 환경에서는 다음이 반드시 필요하다.
- 데이터 변경 전 시점 저장
- 장애 발생 시 롤백
- 마이그레이션 대비 백업
- 테스트용 복제 데이터 생성
이때 사용하는 것이 볼륨 스냅샷(Volume Snapshot) 이다.
CSI란?
CSI(Container Storage Interface)는 쿠버네티스와 외부 스토리지 시스템을 연결하는 표준 인터페이스이다.
CSI를 사용하면 다음과 같은 장점이 존재한다.
- 쿠버네티스 코어를 수정하지 않아도 된다.
- 스토리지 기능을 플러그인 방식으로 확장할 수 있다.
- 프로비저닝, 확장, 스냅샷 기능을 표준화한다
즉, CSI를 통해 스토리지 벤더 또는 오픈소스 솔루션은 쿠버네티스에서 동일한 방식으로 동작할 수 있다.
Rook-Ceph 구조 이해하기
Ceph란 무엇인가
Ceph는 분산 스토리지 시스템이다.
제공하는 스토리지 타입은 다음과 같다.
- 블록 스토리지 (RBD)
- 파일 스토리지 (CephFS)
- 오브젝트 스토리지 (RGW)
여러 노드의 디스크(OSD)를 묶어 하나의 논리적 스토리지 풀을 만든다.
Operator 개념
오퍼레이터는 쿠버네티스에서 특정 애플리케이션의 패키징과 설치, 관리를 손쉽게 할 수 있도록 쿠버네티스 API 확장 기능을 사용하는 컨트롤러다. 특징은 다음과 같다.
- CRD(Custom Resource Definition)를 사용한다
- 리소스의 상태를 계속 감시한다
- 사용자가 정의한 원하는 상태(desired state)를 유지한다
예를 들어 CephCluster 리소스를 생성하면 오퍼레이터가 이를 감지하고 Ceph 클러스터를 자동으로 구성한다.
Rook이란 무엇인가
Rook은 쿠버네티스에서 Ceph를 쉽게 운영하기 위한 오퍼레이터 기반 프레임워크이다.
Rook은 다음 항목들을 자동화할 수 있다.
- Ceph 설치
- 디스크 OSD 구성
- 모니터/매니저 구성
- 장애 복구
- 스케일링
즉, Rook은 쿠버네티스 네이티브 Ceph 운영 자동화 도구다.
Rook-Ceph Operator 설치
루크-셰프 오퍼레이터를 설치한 후 셰프를 설치해준다. 설치는 루크 공식 가이드를 참고했다.
cf. 루크 공식 가이드: https://rook.io/docs/rook/latest/Getting-Started/quickstart/#prerequisites
먼저, Rook 저장소를 클론해준다.
git clone --single-branch --branch master https://github.com/rook/rook.git
cd rook/deploy/examples
CRD, 공통 리소스, 오퍼레이터를 이어서 설치해준다.
kubectl apply -f crds.yaml
kubectl apply -f common.yaml
kubectl apply -f operator.yaml

위와 같이 정상적으로 오퍼레이터가 설치됐고, 이어서 셰프 클러스터를 설치한다.
CephCluster 생성
Rook CephCluster라는 별도의 CRD로 CephCluster를 설치한다. CephCluster YAML에는 Ceph 설치 요구사항을 선언할 수 있다.
예시로 다음과 같은 것들이 들어간다.
- 모니터(MON) 개수
- 사용할 노드/디스크 조건
- 네트워크 설정
- 대시보드/모니터링 옵션
- 스토리지 엔진 설정(OSD 구성 방식)
그리고 오퍼레이터는 이걸 보고 다음을 자동 생성한다.
- MON: 클러스터 상태/쿼럼(다수결) 유지 담당이다
- 보통 3개를 둔다(홀수 권장이다)
- MGR: 모니터링/관리 기능 담당이다
- OSD: 실제 디스크에 데이터를 저장하는 데몬이다
- ex. osd 6개 출력 -> 디스크 6개가 OSD로 편입됨을 의미.
다음 명령어를 통해 Ceph 클러스터를 생성한다.
cd /home/pkg/rook/deploy/examples
kubectl apply -f cluster.yaml

위와 같이 성공적으로 파드들이 생성된 것을 확인할 수 있다.
생성된 파드들의 구조는 크게 다음과 같은 5계층 구조로 이루어져 있다.
- Operator 계층
- Monitor 계층 (MON)
- Manager 계층 (MGR)
- OSD 계층 (스토리지 실제 데이터 저장)
- CSI 계층 (쿠버네티스 연동 인터페이스)
Operator 계층
pod/rook-ceph-operator-7c8d9fcff4-h8qrw
쿠버네티스의 뇌 역할을 한다. Ceph 자체는 컨테이너로 뜨지만, 그 생명주기를 관리하는 것이 Operator다.
다음과 같은 역할들을 수행한다.
- Ceph 클러스터 전체를 관리하는 컨트롤러이다.
- CephCluster CR을 감시한다.
- MON, MGR, OSD, CSI 생성/삭제를 제어한다.
- 장애 발생 시 리소스 재배치를 담당한다.
MON 계층
rook-ceph-mon-a
rook-ceph-mon-b
rook-ceph-mon-c
Ceph의 컨트롤 플레인이다. 3개 이상 구성하는 이유는 quorum 때문이다. 3개 중 2개 이상 살아있어야 클러스터가 유지된다.
다음과 같은 역할들을 수행한다.
- 클러스터 멤버 관리
- OSD 상태 관리
- quorum 유지
- 클러스터 맵 관리
MGR 계층 (통계 / 모니터링 담당)
rook-ceph-mgr-a
rook-ceph-mgr-b
Active/Standby 구조이다. 하나는 Active, 하나는 대기한다.
다음과 같은 역할을 수행한다.
- 클러스터 상태 수집
- Dashboard 제공
- Prometheus exporter 기능
- 성능 메트릭 수집
OSD 준비 Job
1회성 Job이다. Completed 상태가 정상이다.
다음과 같은 역할을 수행한다.
- 노드의 디스크 탐색
- 블록 디바이스 초기화
- OSD 생성 준비