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, 경량 환경 (복제 없음)

관련 포스트