4 분 소요

개요

  • 공식 사이트 / 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 디스크·파티션 제외, 사용 가능한 디스크만 BlockDevice CR로 등록
  • 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, 경량 환경 (복제 없음)


관련 포스트