The module lifecycle stage: Preview
The module has requirements for installation
How to check module health?
To do this, you need to check the status of the pods in the d8-csi-scsi-generic namespace. All pods should be in the Running or Completed state and should be running on all nodes.
kubectl -n d8-csi-scsi-generic get pod -owide -wHow to verify Fibre Channel prerequisites on a node?
Check that Fibre Channel adapters (FC HBA) are available on the node and that LUN paths are visible after Storage Area Network (SAN) zoning:
To verify that, run the following commands:
ls /sys/class/fc_host/
ls -l /dev/disk/by-path/ | grep -E 'fc-|/fc-'Possible results:
- If the
/sys/class/fc_host/directory is empty, the node has no FC HBA or the corresponding driver is not loaded. - If there are no
fc-*entries in the/dev/disk/by-path/directory, check zoning and LUN masking settings on the storage system. - If the FC paths are displayed, the node is ready to detect LUN provided via Fibre Channel.
Why are no SCSIDevice objects created for an Fibre Channel SCSITarget?
If no SCSIDevice objects are present after a SCSITarget is created, check the following:
- WWPN values set in the
spec.fibreChannel.WWNsfield match the storage system ports. - Cluster nodes have access to LUNs and can detect FC paths (there are
fc-*entries in the/dev/disk/by-path/directory). - Only one connection type is specified under
specin the SCSITarget:iSCSIorfibreChannel.
Also inspect controller logs in the d8-csi-scsi-generic namespace and verify the target WWPN with your storage administrator.
Where do open-iscsi and multipath-tools on a node come from?
From the module itself. The NodeGroupConfiguration never asks the node’s package manager for them, so a node in a closed environment with no route to the distribution’s repositories is set up the same way as any other, and no bashible run waits on those repositories.
On every node it serves, bashible pulls the module’s package image iscsi-tools from the module’s registry, unpacks it and runs its install script. The stack is two pairs — iscsiadm with iscsid, and multipath with multipathd — and the script decides for each pair separately:
- a pair the host already has of its own stays the host’s, and the module only enables and configures the distribution’s unit for its daemon;
- a pair the host lacks lands under
/var/lib/deckhouse/sds/csi-scsi-generic, every binary is started through its own dynamic loader with its own library path, and a unit of the module’s comes up for its daemon.
A client and its daemon always come from the same source, because iscsiadm of one version does not speak to iscsid of another. The two pairs do not talk to each other, so a node may well run the host’s iscsid next to the module’s multipathd.
To tell which pair a node took from where, look at what is running on it:
# the distribution's daemons
systemctl is-active iscsid multipathd
# the module's daemons and binaries
systemctl is-active d8-csi-scsi-generic-iscsid.service d8-csi-scsi-generic-multipathd.service
ls /var/lib/deckhouse/sds/csi-scsi-generic/binThe module’s stack changes little on the host itself. Its libraries are never merged into the host’s /lib64 or /usr/lib; the only files it puts outside its own directory are the multipath path checkers in /usr/lib/multipath, where multipathd looks for them, and only those the host does not already have. And it does not touch /etc/iscsi/initiatorname.iscsi when the node already has one: the IQN is the node’s identity on the array, registered there in a host object, and a node that comes back under a different name is a node the array has never heard of.
sg3-utils is not installed at all: no code path in the driver invokes its tools.
How much of a volume is reserved for the superuser?
Nothing, by default: the module formats ext4 with -m 0, so the whole volume is available to the workload.
Where the classic 5% ext4 reserve is wanted — for example to keep a filesystem writable for a privileged process after a workload has filled it — annotate the SCSIStorageClass with the percentage to reserve:
d8 k annotate scsistorageclass <name> storage.deckhouse.io/ext4-reserved-percent=5The value is a whole number of percent between 0 and 50; an invalid one puts the SCSIStorageClass into the Failed phase with the reason in status.reason, instead of breaking volume creation later.
The reserve applies only to volumes created after the annotation was set — filesystems that already exist keep the reserve they were created with. Only the ext filesystems keep blocks for the superuser, so with fsType: xfs the annotation is ignored and the node logs a warning.
Changing the annotation makes the controller recreate the StorageClass, because parameters of an existing StorageClass are immutable in Kubernetes. Existing volumes and PVCs are not affected.