Kubernetes: OpenEBS
개요
- 공식 사이트 / GitHub
- Kubernetes 네이티브 스토리지 솔루션 — 오픈소스, CNCF Sandbox 프로젝트
- CAS (Container Attached Storage) 패턴 — 각 볼륨에 전용 마이크로서비스 스토리지 컨트롤러
- 노드 로컬 스토리지 또는 복제 PV를 동적으로 프로비저닝·관리
- 완전히 Kubernetes 위에서 동작 — 별도 외부 스토리지 클러스터 불필요
| 볼륨 유형 | 적합 워크로드 |
|---|---|
| Local PV | Cassandra, MongoDB, Elasticsearch 등 분산 DB (자체 복제) |
| Replicated PV | MySQL, Jira, GitLab 등 단일 인스턴스 상태 저장 워크로드 |
CAS (Container Attached Storage)
- 볼륨마다 컨테이너화된 스토리지 컨트롤러 + 복제본 쌍으로 구성
- 장점
- 민첩성: 볼륨별 독립 컨트롤러 → 개별 스케일·업그레이드·장애 격리
- 세분화된 정책: 볼륨 단위로 복제 수, QoS, 암호화 등 정책 독립 설정
- 낮은 폭발 반경: 단일 볼륨 컨트롤러 장애가 다른 볼륨에 영향 없음
- 벤더 종속 방지: 클라우드·온프레미스 이동 시 볼륨 마이그레이션 단순화
- 클라우드 네이티브: Prometheus, Grafana, Velero 등과 자연스럽게 통합
- 기존 SAN/NAS 대비 차이: 중앙 집중식 스토리지 컨트롤러 없이 워크로드별 분산 컨트롤러
스토리지 엔진
Local PV — Hostpath
- 노드의 디렉터리(hostpath)를 PV로 사용 — 가장 단순, 가장 빠름
- 단일 노드에서만 접근 가능 (노드 어피니티 자동 설정)
- 동적 크기 조정·스냅샷 불가
- 권장: 어플리케이션이 자체 복제를 처리하고 로컬 최고 성능이 필요한 경우
Local PV — Device
- 노드에 연결된 블록 디바이스(전용 디스크) 전체를 PV로 직접 사용
- hostpath 대비 노이즈 이웃(noisy neighbor) 효과 없음, 디스크 수준 성능
- 권장: 디스크 레벨 성능 필요, 공유 볼륨 혼용 방지
Local PV — ZFS / LVM
- 노드 디스크를 ZFS / LVM 풀로 관리 → 스냅샷·볼륨 확장·풀링 지원
- 권장: 로컬 성능 + 스냅샷·확장 기능이 모두 필요한 경우
cStor
- iSCSI 기반 블록 스토리지, 다중 노드 동기식 복제 지원
- 스냅샷, 클론, 씬 프로비저닝, 볼륨 확장, 데이터 일관성 보장
- 각 노드에 여러 디스크 → 공통 스토리지 풀(CSPC) 구성
- 사전 조건: 모든 노드에 iSCSI initiator 필요 (
iscsi-initiator-utils) - 권장: 엔터프라이즈급 복제·스냅샷, 비-NVMe 환경
Jiva
- iSCSI 기반, Kubernetes 볼륨으로 구현된 경량 복제 스토리지
- cStor 대비 단순하지만 스냅샷·클론 기능 제한
- 권장: 동기식 복제가 필요하고 단일 디스크 환경, 스냅샷 불필요
Mayastor
- NVMe-oF 기반 차세대 고성능 스토리지 엔진 (CNCF 인큐베이팅)
- io_uring + SPDK 기반으로 커널 바이패스 → 최저 지연
- 복제·고가용성 지원
- 권장: NVMe SSD 환경, 최고 성능 요구
스토리지 엔진 선택 가이드
| 엔진 | 복제 | 스냅샷 | 성능 | 사전 조건 | 권장 시나리오 |
|---|---|---|---|---|---|
| Local PV Hostpath | ✗ | ✗ | 매우 높음 | 없음 | 분산 DB (Cassandra, ES), 최고 성능 |
| Local PV Device | ✗ | ✗ | 최고 | 전용 디스크 | 노이즈 없는 전용 고성능 |
| Local PV ZFS/LVM | ✗ | ✅ | 높음 | ZFS/LVM 설치 | 로컬 성능 + 스냅샷·확장 |
| cStor | ✅ | ✅ | 중간 | 여러 디스크, iSCSI initiator | 엔터프라이즈 복제·스냅샷, MySQL/GitLab |
| Jiva | ✅ | ✗ | 낮음 | 단일 디스크, iSCSI initiator | 경량 복제, 단순 환경 |
| Mayastor | ✅ | ✅ | 최고 | NVMe SSD, NVMe-oF | 극한 성능 + 고가용성 |
아키텍처
- 컨트롤 플레인: openebs-operator, NDM DaemonSet, 각 엔진별 operator (cstor-operator 등)
- 데이터 플레인: 볼륨별 스토리지 컨트롤러 Pod + 복제본 Pod (데이터 I/O 처리)
- CSI 드라이버로 표준 Kubernetes PVC 워크플로우와 통합
NDM (Node Disk Manager)
- 각 노드에서 실행되는 DaemonSet — 연결된 블록 디바이스를 감지·분류
- 필터 기반으로 OS 디스크·파티션 제외, 사용 가능한 디스크만
BlockDeviceCR로 등록 kubectl get blockdevices.openebs.io -n openebs로 조회
주요 기능
| 기능 | 설명 |
|---|---|
| 동기식 복제 | cStor / Jiva / Mayastor — 노드 장애 시 데이터 손실 없음 |
| 스냅샷 & 클론 | Copy-On-Write 방식, kubectl로 관리 (VolumeSnapshot API) |
| 씬 프로비저닝 | 실제 사용량만큼만 디스크 점유 (cStor) |
| 볼륨 확장 | 온라인 볼륨 크기 증가 지원 |
| Velero 백업 | OpenEBS Velero 플러그인으로 클라우드 스토리지에 백업·복원 |
| Prometheus 메트릭 | IOPS, 처리량, 지연시간 등 볼륨 메트릭 자동 노출 |
설치
OpenEBS 기본 설치 (Helm 권장)
helm repo add openebs https://openebs.github.io/charts
helm repo update
helm install openebs openebs/openebs \
--namespace openebs --create-namespace
kubectl로 설치
kubectl apply -f https://openebs.github.io/charts/openebs-operator.yaml
cStor 엔진 추가 설치
# iSCSI initiator 설치 (각 노드)
dnf install -y iscsi-initiator-utils
systemctl enable --now iscsid
# cStor operator 설치
kubectl apply -f https://openebs.github.io/charts/cstor-operator.yaml
제거
# Helm으로 설치한 경우
helm uninstall openebs -n openebs
# 공식 제거 가이드: https://openebs.io/docs/user-guides/uninstall
기본 StorageClass 변경
kubectl patch storageclass openebs-hostpath \
-p '{"metadata": {"annotations":{"storageclass.kubernetes.io/is-default-class":"true"}}}'
볼륨 생성
Local PV Hostpath
# StorageClass
apiVersion: storage.k8s.io/v1
kind: StorageClass
metadata:
name: openebs-hostpath
provisioner: openebs.io/local
reclaimPolicy: Delete
volumeBindingMode: WaitForFirstConsumer
parameters:
basePath: /var/openebs/local
---
# PVC
apiVersion: v1
kind: PersistentVolumeClaim
metadata:
name: local-hostpath-pvc
spec:
storageClassName: openebs-hostpath
accessModes: [ReadWriteOnce]
resources:
requests:
storage: 5Gi
-
확인
kubectl get pvc,pv kubectl exec <pod> -- cat /mnt/store/test.txt
cStor
-
전제조건: 각 노드에 iSCSI initiator + 파티션 없는 빈 디스크
# blockdevice 목록 조회 kubectl get blockdevices.openebs.io -n openebs # CStorPoolCluster 생성 (CSPC) apiVersion: cstor.openebs.io/v1 kind: CStorPoolCluster metadata: name: cspc-stripe namespace: openebs spec: pools: - nodeSelector: kubernetes.io/hostname: node1 dataRaidGroups: - blockDevices: - blockDeviceName: blockdevice-xxxx poolConfig: dataRaidGroupType: stripe -
replicaCount는 CSPI(cStor Pool Instance) 수 이하로 설정 (최대 5)
상태 확인
# PVC / PV 확인
kubectl get persistentvolumeclaims -A
kubectl get persistentvolumes
# cStor 볼륨 확인
kubectl get cstorvolumes -n openebs
# BlockDevice 확인
kubectl get blockdevices.openebs.io -n openebs
# OpenEBS Pod 상태
kubectl get pods -n openebs
스냅샷 & 클론
# VolumeSnapshotClass
apiVersion: snapshot.storage.k8s.io/v1
kind: VolumeSnapshotClass
metadata:
name: csi-cstor-snapshotclass
driver: cstor.csi.openebs.io
deletionPolicy: Delete
---
# 스냅샷 생성
apiVersion: snapshot.storage.k8s.io/v1
kind: VolumeSnapshot
metadata:
name: my-snapshot
spec:
volumeSnapshotClassName: csi-cstor-snapshotclass
source:
persistentVolumeClaimName: cstor-pvc
---
# 스냅샷으로 PVC 복원 (클론)
apiVersion: v1
kind: PersistentVolumeClaim
metadata:
name: restore-pvc
spec:
storageClassName: cstor-csi-disk
dataSource:
name: my-snapshot
kind: VolumeSnapshot
apiGroup: snapshot.storage.k8s.io
accessModes: [ReadWriteOnce]
resources:
requests:
storage: 5Gi
유사 도구 비교
| 도구 | 방식 | 특징 |
|---|---|---|
| OpenEBS | CAS, K8s 네이티브 | 볼륨별 독립 컨트롤러, 다양한 엔진 선택 |
| Rook/Ceph | 분산 스토리지 | 대규모 클러스터, 풍부한 기능, 운영 복잡도 높음 |
| Longhorn | 분산 복제 | Rancher 생태계, UI 제공, 간단한 설치 |
| Portworx | 엔터프라이즈 | 상용, 고가용성·DR·암호화 강점 |
| local-path-provisioner | hostpath 단순화 | Rancher, 경량 환경 (복제 없음) |