From 3cb11f9cb92c1a822ad0cf3e187c9159a60d4afe Mon Sep 17 00:00:00 2001 From: Manohar Reddy Date: Mon, 11 May 2026 07:08:19 +0200 Subject: [PATCH 1/3] update documentation for Backup and BackupRestore --- docs/reference/operator.md | 123 +++++++++++++++ docs/usage/backup-recovery.md | 275 +++++++++++++++++++++------------- 2 files changed, 295 insertions(+), 103 deletions(-) diff --git a/docs/reference/operator.md b/docs/reference/operator.md index 3a6929b0..8e42ccd4 100644 --- a/docs/reference/operator.md +++ b/docs/reference/operator.md @@ -21,6 +21,9 @@ The operator manages the following Custom Resource Definitions (CRDs): | `Lvol` | - | Manages logical volumes | | `Device` | - | Manages NVMe devices on storage nodes | | `Task` | - | Monitors cluster tasks and their status | +| `StorageBackup` | - | Creates a one-time backup of a PVC to S3 | +| `BackupRestore` | - | Restores a backup into a new PVC | +| `BackupPolicy` | - | Defines an automated backup schedule for PVCs | All CRDs use the API group `storage.simplyblock.io/v1alpha1`. @@ -431,3 +434,123 @@ spec: | `tasks[].taskResult` | string | Backend result payload or message. | | `tasks[].retried` | int | Number of retry attempts made for the task. | | `tasks[].canceled` | bool | Whether the task was canceled. | + +## StorageBackup + +The `StorageBackup` resource creates a one-time backup of a PVC to the S3-compatible storage endpoint configured +in the `StorageCluster`. For backup configuration prerequisites, see +[Backup and Recovery](../../usage/backup-recovery.md#kubernetes-crd-operations). + +```yaml title="Example: Create a PVC backup" +apiVersion: storage.simplyblock.io/v1alpha1 +kind: StorageBackup +metadata: + name: my-backup + namespace: simplyblock +spec: + clusterName: production + pvcRef: + name: my-pvc +``` + +### Spec Fields + +| Field | Type | Description | +|---------------|--------|------------------------------------------------------| +| `clusterName` | string | Name of the target StorageCluster. **Required**. | +| `pvcRef.name` | string | Name of the PVC to back up. **Required**. | + +### Status Fields + +| Field | Type | Description | +|------------|--------|-------------------------------------------------------------| +| `phase` | string | Current phase: `InProgress` or `Done`. | +| `pvc` | string | Name of the source PVC. | +| `backupID` | string | Backend backup identifier assigned after the backup starts. | +| `snapshot` | string | Name of the snapshot used for the backup. | + +## BackupRestore + +The `BackupRestore` resource restores a `StorageBackup` into a new PVC. The backup may be directed to a +different pool or storage node, but must be restored within the same namespace as the `BackupRestore` object. + +```yaml title="Example: Restore a backup to a new PVC" +apiVersion: storage.simplyblock.io/v1alpha1 +kind: BackupRestore +metadata: + name: my-restore + namespace: simplyblock +spec: + clusterName: production + backupRef: + name: my-backup + pvcTemplate: + metadata: + name: restored-pvc + spec: + accessModes: + - ReadWriteOnce + resources: + requests: + storage: 10Gi +``` + +### Spec Fields + +| Field | Type | Description | +|-----------------------------|--------|--------------------------------------------------------------------------------| +| `clusterName` | string | Name of the target StorageCluster. **Required**. | +| `backupRef.name` | string | Name of the `StorageBackup` to restore from. **Required**. | +| `targetPool` | string | Pool to restore into. Defaults to the source backup PVC's pool. | +| `targetNode` | string | Storage node to restore to. Defaults to the node that held the original backup.| +| `pvcTemplate.metadata.name` | string | Name of the new PVC to create. **Required**. | +| `pvcTemplate.spec` | object | PVC spec including `accessModes` and `resources`. | + +### Status Fields + +| Field | Type | Description | +|----------|--------|----------------------------------------------------------| +| `phase` | string | Current phase: `InProgress`, `PVCBinding`, or `Done`. | +| `backup` | string | Name of the source `StorageBackup`. | +| `pvc` | string | Name of the newly created PVC. | + +!!! warning + `BackupRestore` can only restore a PVC to the same namespace as the restore object. + +## BackupPolicy + +The `BackupPolicy` resource defines an automated backup schedule with retention settings. Policies are attached +to PVCs using the `simplybk/backup-policy` Kubernetes annotation, which causes `StorageBackup` objects to be +created automatically on schedule. Removing the annotation detaches the policy; updating it switches the PVC to +the new policy. + +```yaml title="Example: Create a backup policy" +apiVersion: storage.simplyblock.io/v1alpha1 +kind: BackupPolicy +metadata: + name: my-policy + namespace: simplyblock +spec: + clusterName: production + maxVersions: 10 + maxAge: "7d" + schedule: "15m,4 60m,11 24h,7" +``` + +Attach the policy to a PVC: + +```bash title="Attach a backup policy to a PVC" +kubectl annotate pvc my-pvc -n simplyblock simplybk/backup-policy=my-policy +``` + +### Spec Fields + +| Field | Type | Description | +|---------------|--------|-----------------------------------------------------------------------------------| +| `clusterName` | string | Name of the target StorageCluster. **Required**. | +| `maxVersions` | int | Maximum number of backup versions to retain. | +| `maxAge` | string | Maximum backup age before cleanup (e.g., `7d`, `12h`). | +| `schedule` | string | Tiered backup schedule as space-separated `interval,count` pairs. | + +The schedule format is a space-separated list of `interval,count` pairs. For example, `15m,4 60m,11 24h,7` means: +take a backup every 15 minutes (keep the 4 most recent), every 60 minutes (keep 11), and every 24 hours (keep 7). diff --git a/docs/usage/backup-recovery.md b/docs/usage/backup-recovery.md index 0cd43400..156e43f8 100644 --- a/docs/usage/backup-recovery.md +++ b/docs/usage/backup-recovery.md @@ -169,155 +169,224 @@ On the target cluster, import the metadata: ## Kubernetes CRD Operations -{{experimental}} +In Kubernetes environments, backups can be managed declaratively using Custom Resource Definitions (CRDs). This +is especially useful for automated backup workflows integrated with Kubernetes-native tooling. -In Kubernetes environments, backups can also be managed declaratively using Custom Resource Definitions. This is -especially useful for automated backup workflows integrated with Kubernetes-native tooling. +### Prerequisites -!!! attention - In simplyblock 26.2-PRE, this feature is not yet available. +#### S3-Compatible Object Storage -### Backup CRD +Backups require an S3-compatible object storage endpoint. For local testing, you can deploy a Minio instance: -The `Backup` CRD (`backups.simplyblock.com`, short name: `bkp`) creates a one-time backup of all PVCs in a pool or a -single PVC. +```sh title="Deploy a local Minio instance for testing" +kubectl create ns minio -```yaml title="Back up all PVCs in a pool to S3" -apiVersion: simplyblock.com/v25.10.5 -kind: Backup +kubectl -n minio create deployment minio \ + --image=minio/minio \ + -- /bin/sh -c "minio server /data --console-address :9001" + +kubectl -n minio expose deploy/minio --port 9000 + +kubectl -n minio set env deploy/minio \ + MINIO_ROOT_USER=minioadmin \ + MINIO_ROOT_PASSWORD=minioadmin123 +``` + +#### Backup Credentials Secret + +Store your S3 credentials in a Kubernetes Secret in the same namespace as your `StorageCluster`: + +```yaml title="Create backup credentials secret" +kubectl apply -f - <<'EOF' +apiVersion: v1 +kind: Secret metadata: - name: daily-backup + name: backup-credentials namespace: simplyblock +type: Opaque +stringData: + access_key_id: + secret_access_key: +EOF +``` + +#### StorageCluster Backup Configuration + +Include a `backup` section in your `StorageCluster` spec referencing the credentials secret: + +```yaml title="StorageCluster backup configuration" spec: - clusterUUID: "" - pool: "production" - s3: - bucket: "simplyblock-backups" - region: "eu-central-1" - accessKeySecret: "backup-s3-credentials" - secretKeySecret: "backup-s3-credentials" - retention: 7 + # ... other fields ... + backup: + credentialsSecretRef: + name: backup-credentials + localEndpoint: http://minio.minio.svc.cluster.local:9000 + snapshotBackups: true + withCompression: false ``` -```yaml title="Back up a single PVC" -apiVersion: simplyblock.com/v25.10.5 -kind: Backup +See the [Operator Reference](../reference/operator.md#storage-cluster) for all available `backup` spec fields. + +### StorageBackup CRD + +The `StorageBackup` resource creates a one-time backup of a PVC to the configured S3-compatible storage endpoint. + +```yaml title="Create a backup for a PVC" +kubectl apply -f - <<'EOF' +apiVersion: storage.simplyblock.io/v1alpha1 +kind: StorageBackup metadata: - name: db-backup + name: my-pvc-backup namespace: simplyblock spec: - clusterUUID: "" - pvc: "postgres-data" - s3: - bucket: "simplyblock-backups" - region: "eu-central-1" - accessKeySecret: "backup-s3-credentials" - secretKeySecret: "backup-s3-credentials" + clusterName: simplyblock-cluster + pvcRef: + name: my-pvc +EOF ``` -#### Spec Fields - -| Field | Type | Description | -|--------------------------|---------|-----------------------------------------------------------------| -| `clusterUUID` | string | UUID of the cluster | -| `pool` | string | Pool to snapshot and back up (all PVCs) | -| `pvc` | string | Individual PVC to back up (alternative to pool) | -| `s3.bucket` | string | S3 bucket name | -| `s3.region` | string | AWS region | -| `s3.accessKeySecret` | string | Kubernetes Secret for S3 access key | -| `s3.secretKeySecret` | string | Kubernetes Secret for S3 secret key | -| `filesystem.mountPoint` | string | Filesystem mount point (alternative to S3) | -| `retention` | integer | Number of backups to retain | -| `keepOnlineBackup` | boolean | Keep the online snapshot after backup completes | -| `backupRestoreList` | string | JSON file with backup metadata for cross-cluster restore | -| `replacePVConRestore` | boolean | Replace existing bound PVCs during restore (instead of creating new ones) | - -#### Monitoring Backup Status +Monitor the backup status: ```bash title="List backups" -kubectl get bkp -n simplyblock +kubectl -n simplyblock get storagebackup ``` ```plain -NAME CLUSTER POOL PVC TARGET RETENTION STATE -daily-backup abc123... production simplyblock-backups 7 Completed +NAME PHASE PVC BACKUPID SNAPSHOT AGE +my-pvc-backup Done my-pvc 7fab02f8-03f6-4e76-a9ac-78b63b1ce8ef backup-my-pvc-backup 3m ``` -The status field shows: `Pending`, `Running`, `Completed`, or `Failed`. +!!! note + The first backup may take longer to complete as there is no prior incremental state. -For detailed status including per-PVC backup details: +#### Spec Fields -```bash title="Get detailed backup status" -kubectl get bkp daily-backup -n simplyblock -o yaml -``` +| Field | Type | Description | +|---------------|--------|------------------------------------------------------| +| `clusterName` | string | Name of the target StorageCluster. **Required**. | +| `pvcRef.name` | string | Name of the PVC to back up. **Required**. | + +#### Status Fields -The status includes a `PVCs` array with per-PVC information: PVC name, pool UUID, and the list of backup IDs with -their corresponding snapshot UUIDs. +| Column | Description | +|------------|--------------------------------------------------| +| `PHASE` | Current phase: `InProgress` or `Done`. | +| `PVC` | Name of the source PVC. | +| `BACKUPID` | Backend backup identifier. | +| `SNAPSHOT` | Name of the snapshot used for the backup. | -#### Restoring from a Backup CRD +### BackupRestore CRD -To restore, update the Backup CRD with the `restore` action: +The `BackupRestore` resource restores a `StorageBackup` into a new PVC. The restored PVC is created in the +same namespace as the `BackupRestore` object. -```yaml title="Restore from backup" -apiVersion: simplyblock.com/v25.10.5 -kind: Backup +```yaml title="Restore a backup to a new PVC" +kubectl apply -f - <<'EOF' +apiVersion: storage.simplyblock.io/v1alpha1 +kind: BackupRestore metadata: - name: daily-backup + name: my-restore namespace: simplyblock spec: - clusterUUID: "" - pool: "production" - action: "restore" - s3: - bucket: "simplyblock-backups" - region: "eu-central-1" - accessKeySecret: "backup-s3-credentials" - secretKeySecret: "backup-s3-credentials" + clusterName: simplyblock-cluster + backupRef: + name: my-pvc-backup + pvcTemplate: + metadata: + name: restored-pvc + spec: + accessModes: + - ReadWriteOnce + resources: + requests: + storage: 10Gi +EOF ``` -To restore from a cross-cluster backup, provide the backup metadata JSON file: +Monitor the restore status: -```yaml title="Cross-cluster restore" -spec: - action: "restore" - backupRestoreList: "/path/to/backup-metadata.json" - replacePVConRestore: false +```bash title="List restores" +kubectl -n simplyblock get backuprestore +``` + +```plain +NAME PHASE BACKUP PVC AGE +my-restore Done my-pvc-backup restored-pvc 79s ``` -Setting `replacePVConRestore: true` will replace existing bound PVCs with the restored data instead of creating new -PVCs. +The phase transitions from `InProgress` → `PVCBinding` → `Done`. Once `Done`, the new PVC is ready to attach +to a pod. + +#### Spec Fields + +| Field | Type | Description | +|-----------------------------|--------|--------------------------------------------------------------------------------| +| `clusterName` | string | Name of the target StorageCluster. **Required**. | +| `backupRef.name` | string | Name of the `StorageBackup` to restore from. **Required**. | +| `targetPool` | string | Pool to restore into. Defaults to the source backup PVC's pool. | +| `targetNode` | string | Storage node to restore to. Defaults to the node that held the original backup.| +| `pvcTemplate.metadata.name` | string | Name of the new PVC to create. **Required**. | +| `pvcTemplate.spec` | object | PVC spec (accessModes, resources, etc.). | -### BackupSchedule CRD +!!! warning + A backup can only be restored to the same namespace as the `BackupRestore` object. + +### BackupPolicy CRD -The `BackupSchedule` CRD (`backupscheduless.simplyblock.com`, short name: `bks`) defines recurring backup schedules. +A `BackupPolicy` defines an automated backup schedule with retention settings. Attach it to a PVC using the +`simplybk/backup-policy` annotation to automatically create `StorageBackup` objects on schedule. -```yaml title="Scheduled backup for a pool" -apiVersion: simplyblock.com/v25.10.5 -kind: BackupSchedule +```yaml title="Create a backup policy" +kubectl apply -f - <<'EOF' +apiVersion: storage.simplyblock.io/v1alpha1 +kind: BackupPolicy metadata: - name: hourly-backup + name: my-policy namespace: simplyblock spec: - clusterUUID: "" - pool: "production" - s3: - bucket: "simplyblock-backups" - region: "eu-central-1" - accessKeySecret: "backup-s3-credentials" - secretKeySecret: "backup-s3-credentials" + clusterName: simplyblock-cluster + maxVersions: 10 + maxAge: "7d" + schedule: "15m,4 60m,11 24h,7" +EOF +``` + +#### Spec Fields + +| Field | Type | Description | +|---------------|--------|-----------------------------------------------------------------------------------| +| `clusterName` | string | Name of the target StorageCluster. **Required**. | +| `maxVersions` | int | Maximum number of backup versions to retain. | +| `maxAge` | string | Maximum backup age before cleanup (e.g., `7d`, `12h`). | +| `schedule` | string | Tiered backup schedule as space-separated `interval,count` pairs. | + +The schedule format is a space-separated list of `interval,count` pairs. For example, `15m,4 60m,11 24h,7` means: +take a backup every 15 minutes (keep the 4 most recent), every 60 minutes (keep 11), and every 24 hours (keep 7). + +#### Attaching a Policy to a PVC + +Apply the `simplybk/backup-policy` annotation to start automatic backups for a PVC: + +```bash title="Attach a backup policy" +kubectl annotate pvc my-pvc -n simplyblock simplybk/backup-policy=my-policy ``` -#### Actions +The policy will begin creating `StorageBackup` objects automatically. View them with: + +```bash title="List auto-created backups" +kubectl get storagebackup -n simplyblock +``` -| Action | Description | -|----------------------|--------------------------------------------------| -| `restore` | Restores volumes from backups in this schedule | -| `delete-all-backups`| Deletes all backups created by this schedule | +#### Updating and Detaching Policies -#### Monitoring Schedule Status +To switch a PVC to a different policy (detaches from the old policy and attaches to the new one): -```bash title="List backup schedules" -kubectl get bks -n simplyblock +```bash title="Switch to a different policy" +kubectl annotate pvc my-pvc -n simplyblock simplybk/backup-policy=new-policy --overwrite ``` -The status tracks the list of backup IDs created by the schedule, along with per-PVC backup details. +To detach a policy from a PVC (existing backups are not deleted): + +```bash title="Detach a backup policy" +kubectl annotate pvc my-pvc -n simplyblock simplybk/backup-policy- +``` From ca85844d56df7f20fd563beb2b7ae9b4426a343c Mon Sep 17 00:00:00 2001 From: "Christoph Engelbert (noctarius)" Date: Thu, 21 May 2026 15:06:13 +0200 Subject: [PATCH 2/3] Fixed broken links --- docs/reference/operator.md | 266 ++++++++++++++++++------------------- 1 file changed, 133 insertions(+), 133 deletions(-) diff --git a/docs/reference/operator.md b/docs/reference/operator.md index 8e42ccd4..b7e85668 100644 --- a/docs/reference/operator.md +++ b/docs/reference/operator.md @@ -55,38 +55,38 @@ spec: ### Spec Fields -| Field | Type | Description | -|-----------------------------------------|----------|------------------------------------------------------------------------------------| -| `clusterName` | string | Human-readable cluster name. **Required**. | -| `mgmtIfname` | string | Management network interface (e.g., `eth0`). | -| `haType` | string | High availability type: `single` or `ha`. | -| `stripe.dataChunks` | int | Erasure coding data chunks per stripe. | -| `stripe.parityChunks` | int | Erasure coding parity chunks per stripe. | -| `fabricType` | string | NVMe-oF fabric type: `tcp`, `rdma`, or `tcp,rdma`. | -| `clientDataIfname` | string | Client-side data network interface name. | -| `enableNodeAffinity` | bool | Enable node affinity for data placement. | -| `strictNodeAntiAffinity` | bool | Enforce strict node anti-affinity for chunks. | -| `isSingleNode` | bool | Set to `true` for single-node clusters. | -| `blockSize` | int | Logical block size in bytes (`512` or `4096`). | -| `pageSizeInBlocks` | int | Page size expressed in blocks. | -| `qpairCount` | int | NVMe queue pair count per volume. | -| `maxQueueSize` | int | Maximum backend queue size. | -| `inflightIOThreshold` | int | Inflight I/O threshold before back-pressure is applied. | -| `maxFaultTolerance` | int | Maximum number of concurrent node faults tolerated. | -| `nvmfBasePort` | int | Base port for NVMe-oF services. Subsequent nodes increment from this value. | -| `rpcBasePort` | int | Base port for RPC services. | -| `snodeApiPort` | int | Storage node API port. | -| `warningThreshold.capacity` | int | Capacity warning threshold (percent). | -| `criticalThreshold.capacity` | int | Capacity critical threshold (percent). | -| `warningThreshold.provisionedCapacity` | int | Provisioned capacity warning threshold (percent). | -| `criticalThreshold.provisionedCapacity` | int | Provisioned capacity critical threshold (percent). | -| `action` | string | Lifecycle action: `activate` or `expand`. | -| `backup.credentialsSecretRef.name` | string | Name of the Secret (in the same namespace) holding `access_key_id` and `secret_access_key`. **Required when `backup` is set**. | -| `backup.localEndpoint` | string | S3-compatible endpoint URL for backup storage. | -| `backup.snapshotBackups` | bool | Enable snapshot-based backups. | -| `backup.withCompression` | bool | Enable compression for backup data. | -| `backup.secondaryTarget` | int | Secondary backup target identifier. | -| `backup.localTesting` | bool | Enable local testing mode for backup. | +| Field | Type | Description | +|-----------------------------------------|--------|--------------------------------------------------------------------------------------------------------------------------------| +| `clusterName` | string | Human-readable cluster name. **Required**. | +| `mgmtIfname` | string | Management network interface (e.g., `eth0`). | +| `haType` | string | High availability type: `single` or `ha`. | +| `stripe.dataChunks` | int | Erasure coding data chunks per stripe. | +| `stripe.parityChunks` | int | Erasure coding parity chunks per stripe. | +| `fabricType` | string | NVMe-oF fabric type: `tcp`, `rdma`, or `tcp,rdma`. | +| `clientDataIfname` | string | Client-side data network interface name. | +| `enableNodeAffinity` | bool | Enable node affinity for data placement. | +| `strictNodeAntiAffinity` | bool | Enforce strict node anti-affinity for chunks. | +| `isSingleNode` | bool | Set to `true` for single-node clusters. | +| `blockSize` | int | Logical block size in bytes (`512` or `4096`). | +| `pageSizeInBlocks` | int | Page size expressed in blocks. | +| `qpairCount` | int | NVMe queue pair count per volume. | +| `maxQueueSize` | int | Maximum backend queue size. | +| `inflightIOThreshold` | int | Inflight I/O threshold before back-pressure is applied. | +| `maxFaultTolerance` | int | Maximum number of concurrent node faults tolerated. | +| `nvmfBasePort` | int | Base port for NVMe-oF services. Subsequent nodes increment from this value. | +| `rpcBasePort` | int | Base port for RPC services. | +| `snodeApiPort` | int | Storage node API port. | +| `warningThreshold.capacity` | int | Capacity warning threshold (percent). | +| `criticalThreshold.capacity` | int | Capacity critical threshold (percent). | +| `warningThreshold.provisionedCapacity` | int | Provisioned capacity warning threshold (percent). | +| `criticalThreshold.provisionedCapacity` | int | Provisioned capacity critical threshold (percent). | +| `action` | string | Lifecycle action: `activate` or `expand`. | +| `backup.credentialsSecretRef.name` | string | Name of the Secret (in the same namespace) holding `access_key_id` and `secret_access_key`. **Required when `backup` is set**. | +| `backup.localEndpoint` | string | S3-compatible endpoint URL for backup storage. | +| `backup.snapshotBackups` | bool | Enable snapshot-based backups. | +| `backup.withCompression` | bool | Enable compression for backup data. | +| `backup.secondaryTarget` | int | Secondary backup target identifier. | +| `backup.localTesting` | bool | Enable local testing mode for backup. | ### Auto-Managed CSI Credentials @@ -97,22 +97,22 @@ the cluster's entry from the Secret automatically. ### Status Fields -| Field | Type | Description | -|-----------------------|--------|----------------------------------------------------------------------| -| `uuid` | string | Cluster UUID assigned after creation. | -| `clusterName` | string | Cluster name. | -| `nqn` | string | Cluster NVMe Qualified Name. | -| `status` | string | Current cluster lifecycle status. | -| `rebalancing` | bool | Whether cluster rebalancing is currently active. | -| `erasureCodingScheme` | string | Active erasure coding layout, for example `2x1`. | -| `secretName` | string | Name of the Kubernetes Secret holding cluster credentials. | -| `configured` | bool | Whether initial cluster setup has completed. | -| `actionStatus.action` | string | Most recently requested action name. | -| `actionStatus.state` | string | Action execution state. | -| `actionStatus.message` | string | Human-readable result or error message. | -| `actionStatus.updatedAt` | string | Timestamp of the last status transition. | -| `actionStatus.triggered` | bool | Whether the underlying backend action has been fired. | -| `actionStatus.observedGeneration` | int | Resource generation observed when this status was recorded. | +| Field | Type | Description | +|-----------------------------------|--------|-------------------------------------------------------------| +| `uuid` | string | Cluster UUID assigned after creation. | +| `clusterName` | string | Cluster name. | +| `nqn` | string | Cluster NVMe Qualified Name. | +| `status` | string | Current cluster lifecycle status. | +| `rebalancing` | bool | Whether cluster rebalancing is currently active. | +| `erasureCodingScheme` | string | Active erasure coding layout, for example `2x1`. | +| `secretName` | string | Name of the Kubernetes Secret holding cluster credentials. | +| `configured` | bool | Whether initial cluster setup has completed. | +| `actionStatus.action` | string | Most recently requested action name. | +| `actionStatus.state` | string | Action execution state. | +| `actionStatus.message` | string | Human-readable result or error message. | +| `actionStatus.updatedAt` | string | Timestamp of the last status transition. | +| `actionStatus.triggered` | bool | Whether the underlying backend action has been fired. | +| `actionStatus.observedGeneration` | int | Resource generation observed when this status was recorded. | ## Storage Node @@ -175,33 +175,33 @@ spec: The `status.nodes` list reflects the observed state of each managed storage node. -| Field | Type | Description | -|--------------------------|--------|-----------------------------------------------------------------------| -| `nodes[].uuid` | string | Backend node UUID. | -| `nodes[].hostname` | string | Kubernetes node hostname. | -| `nodes[].status` | string | Backend lifecycle state. | -| `nodes[].health` | bool | Whether health checks are currently passing. | -| `nodes[].cpu` | int | Reported CPU core count. | -| `nodes[].memory` | string | Reported memory value. | -| `nodes[].volumes` | int | Current logical volume count. | -| `nodes[].devices` | string | Backend device summary for this node. | -| `nodes[].mgmtIp` | string | Management IP address. | -| `nodes[].rpcPort` | int | Node RPC service port. | -| `nodes[].lvolPort` | int | Logical volume subsystem port. | -| `nodes[].nvmfPort` | int | NVMe-oF service port. | -| `nodes[].uptime` | string | Reported node uptime. | -| `actionStatus.action` | string | Most recently requested action name. | -| `actionStatus.nodeUUID` | string | Target node UUID for the action. | -| `actionStatus.state` | string | Action execution state: `pending`, `running`, `success`, or `failed`. | -| `actionStatus.message` | string | Human-readable result or error message. | -| `actionStatus.updatedAt` | string | Timestamp of the last status transition. | -| `actionStatus.triggered` | bool | Whether the underlying backend action has been fired. | -| `actionStatus.observedGeneration` | int | Resource generation observed when this status was recorded. | -| `drainCoordination[].hostname` | string | Kubernetes node name being drained. | -| `drainCoordination[].activeNodeUUID` | string | Backend UUID of the storage node being shut down or restarted. | -| `drainCoordination[].phase` | string | Drain phase: `detected`, `shutdown_called`, `draining`, `restart_called`, `complete`, or `failed`. | -| `drainCoordination[].message` | string | Additional status detail or error information. | -| `drainCoordination[].startedAt` | string | Timestamp when drain coordination began for this node. | +| Field | Type | Description | +|--------------------------------------|--------|----------------------------------------------------------------------------------------------------| +| `nodes[].uuid` | string | Backend node UUID. | +| `nodes[].hostname` | string | Kubernetes node hostname. | +| `nodes[].status` | string | Backend lifecycle state. | +| `nodes[].health` | bool | Whether health checks are currently passing. | +| `nodes[].cpu` | int | Reported CPU core count. | +| `nodes[].memory` | string | Reported memory value. | +| `nodes[].volumes` | int | Current logical volume count. | +| `nodes[].devices` | string | Backend device summary for this node. | +| `nodes[].mgmtIp` | string | Management IP address. | +| `nodes[].rpcPort` | int | Node RPC service port. | +| `nodes[].lvolPort` | int | Logical volume subsystem port. | +| `nodes[].nvmfPort` | int | NVMe-oF service port. | +| `nodes[].uptime` | string | Reported node uptime. | +| `actionStatus.action` | string | Most recently requested action name. | +| `actionStatus.nodeUUID` | string | Target node UUID for the action. | +| `actionStatus.state` | string | Action execution state: `pending`, `running`, `success`, or `failed`. | +| `actionStatus.message` | string | Human-readable result or error message. | +| `actionStatus.updatedAt` | string | Timestamp of the last status transition. | +| `actionStatus.triggered` | bool | Whether the underlying backend action has been fired. | +| `actionStatus.observedGeneration` | int | Resource generation observed when this status was recorded. | +| `drainCoordination[].hostname` | string | Kubernetes node name being drained. | +| `drainCoordination[].activeNodeUUID` | string | Backend UUID of the storage node being shut down or restarted. | +| `drainCoordination[].phase` | string | Drain phase: `detected`, `shutdown_called`, `draining`, `restart_called`, `complete`, or `failed`. | +| `drainCoordination[].message` | string | Additional status detail or error information. | +| `drainCoordination[].startedAt` | string | Timestamp when drain coordination began for this node. | ### Node Operations @@ -261,16 +261,16 @@ spec: ### Spec Fields -| Field | Type | Description | -|----------------------------|--------|-------------------------------------------------| -| `name` | string | Pool name. **Required**. | -| `clusterName` | string | Name of the cluster. **Required**. | -| `capacityLimit` | string | Maximum pool capacity (e.g., `10T`). | -| `qos.iops` | int | Maximum IOPS for the pool. | -| `qos.throughput.readWrite` | int | Maximum combined read/write throughput (MiB/s). | -| `qos.throughput.read` | int | Maximum read throughput (MiB/s). | -| `qos.throughput.write` | int | Maximum write throughput (MiB/s). | -| `action` | string | Pool lifecycle action. | +| Field | Type | Description | +|----------------------------|--------|--------------------------------------------------------------------------------------------------------------------------------------------------------------------| +| `name` | string | Pool name. **Required**. | +| `clusterName` | string | Name of the cluster. **Required**. | +| `capacityLimit` | string | Maximum pool capacity (e.g., `10T`). | +| `qos.iops` | int | Maximum IOPS for the pool. | +| `qos.throughput.readWrite` | int | Maximum combined read/write throughput (MiB/s). | +| `qos.throughput.read` | int | Maximum read throughput (MiB/s). | +| `qos.throughput.write` | int | Maximum write throughput (MiB/s). | +| `action` | string | Pool lifecycle action. | | `storageClassParameters` | object | Default volume parameters baked into the auto-created StorageClass. See [Quality of Service](../usage/simplyblock-csi/quality-of-service.md) for available fields. | ### Auto-Created StorageClass @@ -322,34 +322,34 @@ spec: Each volume in the `status.lvols` list includes: -| Field | Type | Description | -|------------------------------|----------|-----------------------------------------------------------------------------------------------------------| -| `uuid` | string | Volume UUID. | -| `lvolName` | string | Volume name. | -| `status` | string | Backend lifecycle status. | -| `size` | string | Volume size. | -| `ha` | bool | High availability enabled. | -| `health` | bool | Whether health checks are passing. | -| `encrypted` | bool | Whether the volume is encrypted. See [Volume Encryption](../deployments/kubernetes/volume-encryption.md). | -| `erasureCodingScheme` | string | Active erasure coding layout for this volume (e.g., `2x1`). | -| `nqn` | string | NVMe Qualified Name for the volume. | -| `subsysPort` | int | NVMe subsystem listener port. | -| `namespaceID` | int | NVMe namespace identifier. | -| `poolName` | string | Storage pool name. | -| `poolUUID` | string | Storage pool UUID. | -| `nodeUUID` | []string | Node UUIDs associated with this volume. | -| `hostname` | string | Node hostname associated with the volume. | -| `pvcName` | string | Bound Kubernetes PVC name, if applicable. | -| `fabricType` | string | Storage fabric/protocol in use (`tcp` or `rdma`). | -| `clonedFromSnapshot` | string | Source snapshot ID if this volume was cloned from a snapshot. | -| `sourceSnapshotName` | string | Source snapshot name if this volume was cloned from a snapshot. | -| `qos.class` | int | Assigned QoS class identifier. | -| `qos.iops` | int | IOPS limit for this volume. | -| `qos.throughput.read` | int | Read throughput limit (MiB/s). | -| `qos.throughput.write` | int | Write throughput limit (MiB/s). | -| `qos.throughput.readWrite` | int | Combined read/write throughput limit (MiB/s). | -| `blobID` | int | Backend blob identifier. | -| `maxNamespacesPerSubsystem` | int | Maximum number of NVMe namespaces per subsystem. | +| Field | Type | Description | +|-----------------------------|----------|-----------------------------------------------------------------------------------------------------------| +| `uuid` | string | Volume UUID. | +| `lvolName` | string | Volume name. | +| `status` | string | Backend lifecycle status. | +| `size` | string | Volume size. | +| `ha` | bool | High availability enabled. | +| `health` | bool | Whether health checks are passing. | +| `encrypted` | bool | Whether the volume is encrypted. See [Volume Encryption](../deployments/kubernetes/volume-encryption.md). | +| `erasureCodingScheme` | string | Active erasure coding layout for this volume (e.g., `2x1`). | +| `nqn` | string | NVMe Qualified Name for the volume. | +| `subsysPort` | int | NVMe subsystem listener port. | +| `namespaceID` | int | NVMe namespace identifier. | +| `poolName` | string | Storage pool name. | +| `poolUUID` | string | Storage pool UUID. | +| `nodeUUID` | []string | Node UUIDs associated with this volume. | +| `hostname` | string | Node hostname associated with the volume. | +| `pvcName` | string | Bound Kubernetes PVC name, if applicable. | +| `fabricType` | string | Storage fabric/protocol in use (`tcp` or `rdma`). | +| `clonedFromSnapshot` | string | Source snapshot ID if this volume was cloned from a snapshot. | +| `sourceSnapshotName` | string | Source snapshot name if this volume was cloned from a snapshot. | +| `qos.class` | int | Assigned QoS class identifier. | +| `qos.iops` | int | IOPS limit for this volume. | +| `qos.throughput.read` | int | Read throughput limit (MiB/s). | +| `qos.throughput.write` | int | Write throughput limit (MiB/s). | +| `qos.throughput.readWrite` | int | Combined read/write throughput limit (MiB/s). | +| `blobID` | int | Backend blob identifier. | +| `maxNamespacesPerSubsystem` | int | Maximum number of NVMe namespaces per subsystem. | ### Snapshot Cloning @@ -439,7 +439,7 @@ spec: The `StorageBackup` resource creates a one-time backup of a PVC to the S3-compatible storage endpoint configured in the `StorageCluster`. For backup configuration prerequisites, see -[Backup and Recovery](../../usage/backup-recovery.md#kubernetes-crd-operations). +[Backup and Recovery](../usage/backup-recovery.md#kubernetes-crd-operations). ```yaml title="Example: Create a PVC backup" apiVersion: storage.simplyblock.io/v1alpha1 @@ -497,22 +497,22 @@ spec: ### Spec Fields -| Field | Type | Description | -|-----------------------------|--------|--------------------------------------------------------------------------------| -| `clusterName` | string | Name of the target StorageCluster. **Required**. | -| `backupRef.name` | string | Name of the `StorageBackup` to restore from. **Required**. | -| `targetPool` | string | Pool to restore into. Defaults to the source backup PVC's pool. | -| `targetNode` | string | Storage node to restore to. Defaults to the node that held the original backup.| -| `pvcTemplate.metadata.name` | string | Name of the new PVC to create. **Required**. | -| `pvcTemplate.spec` | object | PVC spec including `accessModes` and `resources`. | +| Field | Type | Description | +|-----------------------------|--------|---------------------------------------------------------------------------------| +| `clusterName` | string | Name of the target StorageCluster. **Required**. | +| `backupRef.name` | string | Name of the `StorageBackup` to restore from. **Required**. | +| `targetPool` | string | Pool to restore into. Defaults to the source backup PVC's pool. | +| `targetNode` | string | Storage node to restore to. Defaults to the node that held the original backup. | +| `pvcTemplate.metadata.name` | string | Name of the new PVC to create. **Required**. | +| `pvcTemplate.spec` | object | PVC spec including `accessModes` and `resources`. | ### Status Fields -| Field | Type | Description | -|----------|--------|----------------------------------------------------------| -| `phase` | string | Current phase: `InProgress`, `PVCBinding`, or `Done`. | -| `backup` | string | Name of the source `StorageBackup`. | -| `pvc` | string | Name of the newly created PVC. | +| Field | Type | Description | +|----------|--------|-------------------------------------------------------| +| `phase` | string | Current phase: `InProgress`, `PVCBinding`, or `Done`. | +| `backup` | string | Name of the source `StorageBackup`. | +| `pvc` | string | Name of the newly created PVC. | !!! warning `BackupRestore` can only restore a PVC to the same namespace as the restore object. @@ -545,12 +545,12 @@ kubectl annotate pvc my-pvc -n simplyblock simplybk/backup-policy=my-policy ### Spec Fields -| Field | Type | Description | -|---------------|--------|-----------------------------------------------------------------------------------| -| `clusterName` | string | Name of the target StorageCluster. **Required**. | -| `maxVersions` | int | Maximum number of backup versions to retain. | -| `maxAge` | string | Maximum backup age before cleanup (e.g., `7d`, `12h`). | -| `schedule` | string | Tiered backup schedule as space-separated `interval,count` pairs. | +| Field | Type | Description | +|---------------|--------|-------------------------------------------------------------------| +| `clusterName` | string | Name of the target StorageCluster. **Required**. | +| `maxVersions` | int | Maximum number of backup versions to retain. | +| `maxAge` | string | Maximum backup age before cleanup (e.g., `7d`, `12h`). | +| `schedule` | string | Tiered backup schedule as space-separated `interval,count` pairs. | The schedule format is a space-separated list of `interval,count` pairs. For example, `15m,4 60m,11 24h,7` means: take a backup every 15 minutes (keep the 4 most recent), every 60 minutes (keep 11), and every 24 hours (keep 7). From 375a491c0bc4b4a49c30b2263c2f70655a735748 Mon Sep 17 00:00:00 2001 From: "Christoph Engelbert (noctarius)" Date: Thu, 21 May 2026 15:12:09 +0200 Subject: [PATCH 3/3] Fixed broken links --- docs/deployments/index.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/docs/deployments/index.md b/docs/deployments/index.md index 20911912..06570ef8 100644 --- a/docs/deployments/index.md +++ b/docs/deployments/index.md @@ -65,7 +65,7 @@ life cycle automation is performed by the orchestrator-specific simplyblock driv - On OpenStack: [Cinder Driver](openstack/index.md) Generally, before creating volumes it is important to understand the difference btw. an -[NVMe-oF Subsystem and a Namespace](nvme-namespaces-and-subsystems.md). +[NVMe-oF Subsystem and a Namespace](../architecture/concepts/nvme-namespaces-and-subsystems.md). ## System Requirements and Sizing