Skip to main content

Persistent Block Storage (Cinder & Ceph)

Okustera Persistent Block Storage is powered by OpenStack Cinder backed by a distributed, high-performance Ceph NVMe storage cluster.

It delivers persistent, low-latency, multi-attach block volumes for Nova virtual machines and Kubernetes stateful workloads via dynamic Container Storage Interface (CSI) drivers.

Okustera Block & Object Storage Console


Architectural Highlights​

  • NVMe Distributed Fabric: Enterprise flash storage with automated 3x replica distribution across physical failure domains.
  • Online Volume Expansion: Increase storage capacity on live, mounted volumes without requiring VM reboots, downtime, or filesystem detachment.
  • Point-in-Time Volume Snapshots: Instantaneous, copy-on-write snapshots for rapid backup, disaster recovery, and testing clones.
  • Bootable Volumes: Create bootable persistent volumes from images to preserve instance root state even when VMs are destroyed and recreated.
  • Native Kubernetes CSI (ceph-rbd / block-rbd1): Dynamic provisioning of Kubernetes PersistentVolumeClaims (PVCs) that automatically migrate and reattach across worker nodes during node upgrades.

Storage Classes & Performance Tiers​

Volume Type / StorageClassBacking MediaPerformance ProfileRecommended Workloads
ceph-nvme / ceph-rbdCeph NVMe All-FlashHigh IOPS, sub-millisecond latencyProduction databases (PostgreSQL, MySQL, Valkey), transactional caches
rbd1 / block-rbd1Ceph Balanced PoolStandard IOPS, high throughputGeneral backend application volumes, stateful worker pods, CI/CD runners

Managing Block Storage in the Cloud Portal​

The Okustera Cloud Portal (/storage) provides visual volume management:

1. Creating a Persistent Volume​

  1. Navigate to Storage $\to$ Volumes in the left sidebar.
  2. Click Create Volume:
    • Volume Name: db-data-volume
    • Size (GB): e.g. 100
    • Volume Type: Select ceph-nvme (high performance) or rbd1 (standard).
    • Source:
      • Empty Volume: Format as fresh block storage.
      • From Image: Create a bootable volume pre-loaded with an OS image.
      • From Snapshot: Clone an existing point-in-time snapshot into a new independent volume.
  3. Click Create. The volume transitions to available.

2. Attaching a Volume to a Compute Instance​

  1. In the Volumes list, locate your volume and click Attach to Instance.
  2. Select your running compute instance (e.g. web-server-01).
  3. The volume attaches as a block device (e.g. /dev/vdb or /dev/sdb) in under 2 seconds.
  4. SSH into your VM to format and mount:
    # Format filesystem (first-time only)
    sudo mkfs.ext4 /dev/vdb

    # Mount to mountpoint
    sudo mkdir -p /mnt/data
    sudo mount /dev/vdb /mnt/data

3. Taking a Volume Snapshot​

  1. In the Volumes list, click Create Snapshot.
  2. Name the snapshot (e.g. db-data-snap-pre-upgrade).
  3. Copy-on-write snapshots complete instantaneously without pausing writes.

4. Online Volume Expansion (Live Resize)​

To expand an attached volume that is running out of space:

  1. In the portal, click Extend Volume on your volume.
  2. Enter the new target size (e.g. from 100 GB to 200 GB).
  3. Click Confirm. Cinder expands the Ceph RBD image immediately.
  4. On the running VM, expand the filesystem without unmounting:
    sudo resize2fs /dev/vdb

Declarative Management via Terraform​

# 1. Create a 100 GB persistent block volume
resource "okustera_storage_volume" "database_data" {
name = "db-data-volume"
size = 100
volume_type = "rbd1"
description = "Production database data volume"
}

# 2. Attach volume to a Nova compute instance
resource "okustera_storage_volume_attachment" "db_attach" {
instance_id = okustera_compute_instance.web_server.id
volume_id = okustera_storage_volume.database_data.id
}

# 3. Create a point-in-time snapshot
resource "okustera_storage_snapshot" "db_snapshot" {
name = "db-data-snapshot-weekly"
volume_id = okustera_storage_volume.database_data.id
description = "Automated weekly snapshot"
}

Kubernetes PersistentVolumeClaim (PVC)​

When running stateful applications on Managed Kubernetes, request dynamic block volumes using standard Kubernetes manifests:

apiVersion: v1
kind: PersistentVolumeClaim
metadata:
name: pg-data-pvc
namespace: default
spec:
accessModes:
- ReadWriteOnce
storageClassName: ceph-rbd
resources:
requests:
storage: 50Gi

The Cinder CSI driver automatically provisions the volume in Ceph and attaches it to the appropriate Kubernetes worker node.


REST API Reference​

  • GET /api/v1/storage/volumes — List volumes in current tenant project.
  • POST /api/v1/storage/volumes — Provision a new volume.
  • GET /api/v1/storage/volumes/{id} — Retrieve volume status, size, and attachments.
  • DELETE /api/v1/storage/volumes/{id} — Delete an available volume.
  • POST /api/v1/storage/volumes/{id}/attach — Attach volume to an instance.
  • POST /api/v1/storage/volumes/{id}/detach — Detach volume from an instance.
  • GET /api/v1/storage/snapshots — List point-in-time volume snapshots.
  • POST /api/v1/storage/snapshots — Create a snapshot from an existing volume.