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, andsbctl cluster index-stateto operate those indices. The backfill is idempotent and safe to run against a live cluster,check-indiceswrites back what it can derive with--repair, andindex-statelists where every index stands and takes a single one out of service with--set disabled. - Control Plane: TODO, to be collected from the
sbclichanges since 26.3.
Fixes
- Control Plane: TODO, to be collected from the
sbclichanges 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-operatorchanges since 26.3.
Fixes
- Operator: TODO, to be collected from the
simplyblock-operatorchanges 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.actionis replaced by creating aStorageClusterOps, 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, andOperatorOpsshare that shape, includingspec.abortand theAbortedphase. - A storage cluster is deployed from a
ClusterDeploymentConfig. The operator inspects the workers, writes the draft, and an administrator approves it withspec.approved, after which the document is expanded into theStorageClusterand itsStorageNodeobjects. 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
restartis writtenRestart, and a phase such asCompletedis writtenSucceeded. - The status of a running operation is a state machine snapshot in
status.step, replacingstatus.subPhase.status.step.statecarries the step, andstatus.step.deadlineis when that step expires. - The annotation and label keys move from the
simplyblock.io/prefix tostorage.simplyblock.io/. Every spelling is read and the new one is written, so nothing has to be relabeled. The exception issimplyblock.io/pod-affinity, which has no prefixed spelling yet. - The
StorageClusterfinalizer is renamed fromstorage.simplyblock.io/cluster-finalizertostorage.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-upgradetool 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.