Skip to content

26.4

Simplyblock is happy to release Simplyblock 26.4. The changes are grouped by the component they belong to: the simplyblock control plane and storage plane, and the Kubernetes components, meaning the Simplyblock Operator and Simplyblock CSI.

Draft

This page is a work in progress. Only the important changes of the operator API are collected so far. The control plane and storage plane entries, the operator and CSI driver features, the upgrade path, and the known issues are not final yet.

Simplyblock

The control plane and the storage plane are released together and share a version number. The changes below apply to every deployment, including a Kubernetes-based one.

New Features

  • Control Plane: Added secondary indices to the control plane's FoundationDB store. A lookup by anything other than the record id, such as the volumes of a storage pool or the node a device sits in, is answered from an index instead of a scan of the whole record class, so the cost of a lookup no longer grows with the size of the cluster. The indices of an upgraded cluster are backfilled by sbctl cluster upgrade-complete, and until an index is complete its reads fall back to a scan.
  • Control Plane: Added sbctl cluster build-indices, sbctl cluster check-indices, and sbctl cluster index-state to operate those indices. The backfill is idempotent and safe to run against a live cluster, check-indices writes back what it can derive with --repair, and index-state lists where every index stands and takes a single one out of service with --set disabled.
  • Control Plane: TODO, to be collected from the sbcli changes since 26.3.

Fixes

  • Control Plane: TODO, to be collected from the sbcli changes since 26.3.

Kubernetes

The changes below apply to a Kubernetes-based deployment and ship with the Simplyblock Operator and Simplyblock CSI.

New Features

  • Operator: TODO, to be collected from the simplyblock-operator changes since 26.3.

Fixes

  • Operator: TODO, to be collected from the simplyblock-operator changes since 26.3.

Important Changes

The operator API moves from storage.simplyblock.io/v1alpha1 to storage.simplyblock.io/v1alpha2. Every kind is served at the new version, which is also the storage version, and a conversion webhook translates an existing v1alpha1 object so that a manifest written for 26.3 keeps working. The replication kinds are the exception and stay at v1alpha1.

  • Imperative operations are separate resources instead of fields on the entity they act on. Setting StorageCluster.spec.action is replaced by creating a StorageClusterOps, and the operation runs to a terminal phase and stays afterward as the record of what was done. StorageClusterOps, StorageNodeOps, StorageDeviceOps, StoragePoolOps, PersistentVolumeOps, StorageBackupOps, ControlPlaneOps, and OperatorOps share that shape, including spec.abort and the Aborted phase.
  • A storage cluster is deployed from a ClusterDeploymentConfig. The operator inspects the workers, writes the draft, and an administrator approves it with spec.approved, after which the document is expanded into the StorageCluster and its StorageNode objects. The document is immutable once approved.
  • A namespace holds at most one StorageCluster. A second storage cluster needs a namespace of its own.
  • Every enum value of the group is PascalCase. An action such as restart is written Restart, and a phase such as Completed is written Succeeded.
  • The status of a running operation is a state machine snapshot in status.step, replacing status.subPhase. status.step.state carries the step, and status.step.deadline is when that step expires.
  • The annotation and label keys move from the simplyblock.io/ prefix to storage.simplyblock.io/. Every spelling is read and the new one is written, so nothing has to be relabeled. The exception is simplyblock.io/pod-affinity, which has no prefixed spelling yet.
  • The StorageCluster finalizer is renamed from storage.simplyblock.io/cluster-finalizer to storage.simplyblock.io/storagecluster-finalizer. The old key is read for one release.

Renamed and Retired Resources

A kind that is absorbed is not converted. The upgrade constructs the successor, and a manifest that creates the old kind has to be rewritten.

26.3 resource 26.4 resource Notes
VolumeMigration PersistentVolumeOps Cluster-scoped, because a PersistentVolume is. Action Migrate.
BackupRestore StorageBackupOps Absorbed as spec.action: Restore, the kind's only action.
BackupPolicy StorageBackupPolicy Selects its claims by label instead of a per-claim annotation.
BackupImport Retired The backup store is the inventory, so a backup another cluster wrote needs no import.
StorageNodeSet StorageCluster.spec.storageNodes The fleet template. The workers move to ClusterDeploymentConfig.
Task StorageCluster.status.tasks Canceled with a StorageClusterOps carrying action: CancelTask.

StorageCluster

26.3 property 26.4 property Notes
spec.maxHugePagesSize spec.minHugePagesSize The value is a minimum and always was.
spec.hashicorpVaultSettings.baseURL spec.kms.vault.endpoint
spec.backup.localEndpoint spec.backup.endpoint bucket, prefix, and region are added.
spec.openShiftCluster spec.storageNodes.openshift
spec.storageNodes.openShiftMachineConfigPool spec.storageNodes.openshift.machineConfigPool
spec.enableDataRealignment spec.disableDataRealignment Inverted. Realignment is on by default now.
spec.volumeAutoPlacement.enabled spec.enableVolumeAutoPlacement Moves up to the cluster spec.
spec.volumeAutoPlacement.migrationEnabled spec.volumeAutoPlacement.disableMigration Inverted.
spec.volumeAutoPlacement.latencyBenchmarkEnabled spec.volumeAutoPlacement.enableLatencyBenchmark
spec.volumeMigrationSettings.enabled Removed Migration cannot be turned off.
spec.action StorageClusterOps
status.actionStatus StorageClusterOps.status

An inverted field is the dangerous row of this release. A spec that still carries enableDataRealignment or migrationEnabled is accepted by the API server and ignored, and the feature runs with the opposite default.

StorageClusterOps

26.3 property 26.4 property
spec.nodeRollingRestart spec.rollingRestart
status.nodeRollingRestartStatus status.rollingRestart
status.triggered Removed

The action node-recycle is renamed to RollingRestart, and activate, expand, shutdown, start, and restart become Activate, Expand, Shutdown, Start, and Restart. CancelTask is added.

StorageNode

26.3 property 26.4 property Notes
spec.storageNodeSetRef spec.clusterRef and spec.nodeSet The node is owned by its cluster.
spec.socketIndex spec.slot
spec.overrides spec.config
config.failureDomain config.failureDomain Was an integer index, is a label value such as rack-a.
spec.skipKubeletConfiguration StorageCluster.spec.storageNodes.enableKubeletConfiguration Inverted, and per cluster.
overrides.enableCpuTopology StorageCluster.spec.storageNodes.enableCpuTopology Per cluster, not per node.

StorageNodeOps

26.3 property 26.4 property Notes
spec.storageNodeRef spec.nodeRef
spec.targetWorkerNode spec.migrate.targetWorkerNode
spec.newSsdPcie spec.migrate.newSsdPcie
spec.drain spec.remove Matches the action it parameterizes.
status.subPhase status.step.state
status.volumesMigrated status.drain.volumesMigrated
status.volumesPending status.drain.volumesTotal A total instead of a remainder.
status.triggered Removed

The six actions become Shutdown, Restart, Suspend, Resume, Remove, and Migrate, and HostMaintenance is added. The sub-phases Migrating and Restarting of a migration become the steps Relocating and AwaitingNode, and the Migrating sub-phase of a removal becomes MigratingVolumes.

StoragePool

26.3 property 26.4 property
spec.clusterName spec.clusterRef
spec.capacityLimit spec.limits.capacity
spec.logicalVolumeMaxSize spec.limits.maxVolumeSize
spec.qos.iops spec.limits.iops
spec.qos.throughput spec.limits.throughput
spec.dhchap spec.volumeDefaults.enableDHCHAP
spec.storageClassParameters.qosRwIops spec.volumeDefaults.iops
spec.storageClassParameters.qosRwMbytes spec.volumeDefaults.throughput.readWrite
spec.storageClassParameters.qosRMbytes spec.volumeDefaults.throughput.read
spec.storageClassParameters.qosWMbytes spec.volumeDefaults.throughput.write
spec.storageClassParameters.encryption spec.volumeDefaults.enableEncryption
spec.storageClassParameters.maxNamespacePerSubsys spec.volumeDefaults.maxNamespacesPerSubsystem
spec.storageClassParameters.fabric spec.volumeDefaults.fabric
spec.storageClassParameters.filesystem spec.volumeDefaults.filesystem
spec.storageClassParameters.tune2fsReservedBlocks spec.volumeDefaults.tune2fsReservedBlocks
spec.action, spec.status Removed

spec.limits is mutable, so a capacity or a QoS ceiling is raised on a running pool. spec.volumeDefaults is immutable, because the parameters of the generated StorageClass are.

StorageBackup, StorageBackupPolicy, and PersistentVolumeOps

26.3 property 26.4 property Notes
StorageBackup.spec.clusterName spec.clusterRef
StorageBackup.spec.pvcRef Removed The kind is discovered from the store, not authored.
StorageBackup flat status fields status.backup and status.source The copy and the volume it was taken from.
BackupPolicy.spec.clusterName StorageBackupPolicy.spec.clusterRef
BackupPolicy.status.attachedLvols StorageBackupPolicy.status.attachedClaims
VolumeMigration.spec.pvName PersistentVolumeOps.spec.persistentVolumeName
VolumeMigration.spec.targetNodeUUID PersistentVolumeOps.spec.migrate.targetNodeRef Names a StorageNode object, not a UUID.
VolumeMigration phase Completed PersistentVolumeOps phase Succeeded

ControlPlane

26.3 property 26.4 property Notes
spec.image spec.source.local.image spec.source.managed names a remote control plane instead.
phase Ready phase Available Degraded and Unavailable are added.

StorageClass Parameters and Claim Annotations

The QoS keys are renamed outside the CRD schemas as well. Every generation is read, because the parameters of a StorageClass cannot be changed after it is created, so a class an older release generated keeps working.

26.3 parameter 26.4 parameter 26.4 claim annotation
qos_rw_iops max_iops storage.simplyblock.io/max-iops
qos_rw_mbytes max_mbytes_per_sec storage.simplyblock.io/max-mbytes-per-sec
qos_r_mbytes max_read_mbytes_per_sec storage.simplyblock.io/max-read-mbytes-per-sec
qos_w_mbytes max_write_mbytes_per_sec storage.simplyblock.io/max-write-mbytes-per-sec

A StorageClass is assigned to a storage pool by three labels, storage.simplyblock.io/namespace, storage.simplyblock.io/cluster, and storage.simplyblock.io/pool, instead of being named after the pool. A pool may have any number of classes. The parameter dhchap_node_label is renamed to dhchap_node_selector, and the node label it names changes from simplyblock.io/pool.<namespace>.<cluster>.<pool> to storage.simplyblock.io/storage-pool.<pool-uuid>.

Upgrade Considerations

  • TODO, to be confirmed once the simplyblock-upgrade tool is released.

Known Issues

  • TODO, to be re-checked against the 26.3 known issues.

Features to Expect with Next Major Release

  • The ability to use different erasure coding schemas within the same cluster.
  • Inline data integrity validation to prevent silent data corruption.