Getting started

Remote Block Storage (RBS) are external block-level storage volumes that can be mounted to Enterprise Bare Metal servers, Scalable Bare Metal servers, Cloud Servers, or Kubernetes nodes. This section outlines how to create and initialize a new RBS volume. To create a new RBS volume:

  1. Log in to the Customer Portal and navigate to Remote Block Storage
  2. Click Order
  3. Select the storage location
  4. Choose a type of flavor
  5. Specify the desired volume size in gigabytes
    • IOPS (Input/Output Operations Per Second) and bandwidth will be calculated automatically based on the selected size
  6. Enter a name for the volume
  7. Click Order to complete the request

The system will begin provisioning the volume. Once completed, the volume will be available for use.

Connection configuration

Linux

To connect a volume to a Linux server, follow the steps below. Run all commands as root (or with sudo).

Step 1: install the Internet Small Computer System Interface (iSCSI) package (if not done already)

  • Debian-based OS (Ubuntu, Debian)
apt install open-iscsi

The target configuration path is: /etc/iscsi/nodes

  • RedHat-based OS (Rocky Linux, Alma Linux, CentOS)
yum install iscsi-initiator-utils

The target configuration path is: /var/lib/iscsi/nodes

The target configuration path stores connection details for each discovered iSCSI target and supports automatic reconnection after reboot. If issues occur during login or reconfiguration, you can manually inspect or remove entries in this directory.

Step 2: register the target volume

Take the target name and the volume IP address from the volume details page: Customer PortalRemote Block Storage → Your volume. You will need two fields:

  • Target name - the IQN (iSCSI Qualified Name) that uniquely identifies the volume, for example: iqn.2024-10.com.servers:59809d6c-6ec7-4220-b334-9c93ed8f52b4
  • IP address - the iSCSI volume IP address

Create a node record for the target:

iscsiadm -m node --targetname <Target name> -p <Volume IP>:3260 -o new

Replace <Target name> and <Volume IP> with the values from the Target name and IP address fields on the volume details page.

Step 3: configure authentication

Configure CHAP authentication parameters, by setting up a username and password:

iscsiadm -m node --targetname <Target name> -p <Volume IP>:3260 -o update -n node.session.auth.username -v <Username>
iscsiadm -m node --targetname <Target name> -p <Volume IP>:3260 -o update -n node.session.auth.password -v <Password>

Replace <Username> and <Password> parameters with credentials from Remote Block Storage → Your volume → Credentials → Click the Show button. Enable auto-start for this connection (optional):

iscsiadm -m node --targetname <Target name> -p <Volume IP>:3260 -o update -n node.startup -v automatic

Step 4: Configure queue depth

By default, the Linux iSCSI initiator exposes a low queue depth on the SCSI device, which can limit performance for volumes with high IOPS limits.

To increase the queue depth, update the node session parameters before you log in:

iscsiadm -m node --targetname <Target name> -p <Volume IP>:3260 -o update -n node.session.cmds_max -v 256
iscsiadm -m node --targetname <Target name> -p <Volume IP>:3260 -o update -n node.session.queue_depth -v 128

node.session.cmds_max must be a power of two and must be at least twice the target node.session.queue_depth. For example, to set a queue depth of 128 on the SCSI device, set cmds_max to 256.

If the session is already active, log out and log back in for the changes to take effect.

Step 5: log in to the target volume

Log in to the target volume:

iscsiadm -m node --targetname <Target name> -p <Volume IP>:3260 --login

After completing the login, a new block storage device will appear in the /dev directory, typically named in the sdX format (e.g., sdc). To identify <Device name>, use the lsblk command.

Step 6: prepare the storage device

Format the new block storage device, create a file system (ext4 in our example) and mount it to a local directory such as /mnt/iscsi:

mkfs.ext4 -E lazy_itable_init=1 -E lazy_journal_init=1 /dev/<Device name>
mkdir /mnt/iscsi
mount /dev/<Device name> /mnt/iscsi

Replace <Device name> with the actual device name from the previous step.

Step 7: set up auto-mounting after reboot (optional)

  • Get the UUID of the file system:
lsblk -f
  • Set up automatic mounting:
echo "UUID=<UUID value> /mnt/iscsi ext4 _netdev 0 0" | tee --append /etc/fstab

<UUID value> is the UUID of a file system from the previous request

Remote Block Storage has been set up.

Windows

To connect a volume to a Windows server, follow the steps below. Run all commands in an elevated PowerShell session.

Step 1: configure the iSCSI service

Using PowerShell
  1. Set the Microsoft iSCSI Initiator Service to start automatically and start it:
Set-Service -Name MSiSCSI -StartupType Automatic
Start-Service -Name MSiSCSI
  1. Add the target portal, binding it to your Global Private Network interface:
New-IscsiTargetPortal -TargetPortalAddress <Volume IP> -InitiatorPortalAddress <GPN interface IP>

<Volume IP> is the volume's IP address from the volume details page: Customer PortalRemote Block Storage → Your volume → IP address. <GPN interface IP> is a Global Private Network IP address assigned to an interface of your server, found on your server's detail page (Private IP).

  1. Confirm the target was discovered and note its NodeAddress (the target IQN), which you need in Step 2:
Get-IscsiTarget
Using the GUI
  1. Make sure the iSCSI service is set to run automatically:
  • Open the Microsoft Management Console by typing services.msc in the Start menu
  • Locate Microsoft iSCSI Initiator Service, right-click → Properties
  • Set Startup type to Automatic
  1. Open the iSCSI Initiator by typing iscsicpl in the Start menu
  2. In the iSCSI Initiator Properties window, switch to the Discovery tab and click Discover Portal
  3. In the Discover Target Portal dialog, set the following:
  • IP address or DNS name: <Volume IP>
  • Port: 3260 <Volume IP> is the volume's IP address from the volume details page: Customer PortalRemote Block Storage → Your volume → IP address
  1. Click Advanced and set the following:
  • Local adapter: Microsoft iSCSI Initiator
  • Initiator IP: <GPN interface IP>

<GPN interface IP> is a Global Private Network IP address assigned to an interface of your server. Find it on your server's detail page (Private IP).

  1. Click OK to close Advanced Settings, then OK to add the portal. It now appears under Target portals on the Discovery tab.
  2. Switch to the Targets tab. The volume appears under Discovered targets with the Inactive status.

Step 2: connect to the volume

Connect to the target with CHAP authentication, binding it to your Global Private Network interface and keeping the connection persistent across reboots.

Using PowerShell
Connect-IscsiTarget -NodeAddress <Target name> -TargetPortalAddress <Volume IP> -InitiatorPortalAddress <GPN interface IP> -AuthenticationType ONEWAYCHAP -ChapUsername <Username> -ChapSecret <Password> -IsPersistent $true

Replace <Target name> with the target IQN (the NodeAddress returned by Get-IscsiTarget, or the Target name field on the volume details page). Find <Username> and <Password> on the volume details page: Remote Block Storage → Your volume → CredentialsShow.

Using the GUI
  1. On the Targets tab, select the discovered target and click Connect
  2. In the Connect To Target dialog, keep Add this connection to the list of Favorite Targets selected so the connection is restored automatically after every reboot, then click Advanced
  3. In the Advanced Settings dialog, set the following:
  • Local adapter: Microsoft iSCSI Initiator
  • Initiator IP: <GPN interface IP>
  • Target portal IP: <Volume IP> / 3260
  • Select the Enable CHAP log on checkbox
  • Name: <Username>
  • Target secret: <Password>

You can find <Username> and <Password> on the volume details page: Remote Block Storage → Your volume → CredentialsShow

  1. Click OK to close Advanced Settings, then OK in the Connect To Target dialog. The target's status changes to Connected on the Targets tab.

Step 3: initialize the disk

Using PowerShell
$RBSDisk = Get-Disk | Where-Object PartitionStyle -eq 'RAW'
$RBSDisk | Set-Disk -IsOffline:$false
$RBSDisk | Initialize-Disk -PartitionStyle GPT -PassThru | New-Partition -AssignDriveLetter -UseMaximumSize | Format-Volume -FileSystem NTFS -Confirm:$false
Using the GUI
  1. Right-click Start → select Disk Management
  2. Locate your iSCSI disk in the list

If the disk is marked Offline, that means Windows detects it but does not activate new external disks by default (this is a data protection feature)

  1. Set the disk to online and initialize it:
    1. In Disk Management, locate the correct disk (e.g., Disk 2)
    2. Right-click on the left pane (not the "unallocated" area)
    3. In the context menu, select Online, then Initialize Disk

You can now create partitions, assign a label or drive letter, and format to NTFS.

Kubernetes

To connect a volume to a Kubernetes cluster, follow the steps below.

Step 1: create a CHAP secret

Create a YAML file (e.g., chap-secret.yaml) and insert the following structure, adjusting it to your environment:

apiVersion: v1
kind: Secret
metadata:
  name: <CHAP secret name>
type: "kubernetes.io/iscsi-chap"
data:
  node.session.auth.username: <base64-username>
  node.session.auth.password: <base64-password>

Encode the credentials in base64 before pasting them into the file:

echo -n '<Username>' | base64
echo -n '<Password>' | base64

Replace:

  • <Username> and <Password> with the values from the Customer PortalRemote Block Storage → Your volume → CredentialsShow
  • <CHAP secret name> with a name for the secret (e.g., chap-secret), which will be used later in the pod manifest

Apply the secret to the cluster:

kubectl apply -f chap-secret.yaml

If successful, you will see:

secret/chap-secret created

The CHAP secret is now ready to be referenced in your pod manifest.

Step 2: define a pod that mounts the block storage

Create a pod manifest file (e.g., pod-manifest.yaml) and use the following configuration as a base, adjusting it as needed:

apiVersion: v1
kind: Pod
metadata:
  name: <Pod name>
spec:
  containers:
  - name: <Container name>
    image: <Image name>
    imagePullPolicy: IfNotPresent
    command: ["sleep", "3600"]
    volumeMounts:
    - mountPath: "/mnt/<Folder>"
      name: <Volume name>
  volumes:
  - name: <Volume name>
    iscsi:
      targetPortal: <Volume IP>
      iqn: <Target name>
      lun: 0
      fsType: <File system>
      readOnly: false
      chapAuthDiscovery: false
      chapAuthSession: true
      secretRef:
        name: <CHAP secret name>

Replace the placeholders with actual values:

  • <Pod name> - name of the pod (e.g., iscsi-demo-pod)
  • <Container name> - name of the container inside the pod
  • <Image name> - container image name (e.g., nginx)
  • <Folder> - subdirectory under /mnt to mount inside the container (e.g., storage)
  • <Volume name> - volume name inside the pod
  • <Volume IP> - IP address of the iSCSI target
  • <Target name> - IQN of the target (e.g., iqn.2024-10.com.servers:abc123)
  • <File system> - filesystem type (typically ext4)
  • <CHAP secret name> - name of the CHAP secret object from the previous step

You can find <Volume IP> and <Target name> in the Customer Portal on the block storage details page.

Apply the configuration:

kubectl apply -f pod-manifest.yaml

If successful, you will see:

pod/iscsi-demo-pod created

Storage verification

Linux

  1. Navigate to the mount point:
cd /mnt/iscsi
  1. Create a test file:
nano /mnt/iscsi/test.txt

To save and close:

  • Press Ctrl + O → then Enter (to save)
  • Press Ctrl + X (to exit Nano)
  1. Verify the created file and its content
cat /mnt/iscsi/test.txt

Windows

Using PowerShell
  1. Confirm the volume is available and note its drive letter:
Get-Volume
  1. Write a test file to the volume and read it back (replace <Drive letter> with the letter assigned to the volume, for example D):
Set-Content -Path <Drive letter>:\test.txt -Value "Remote Block Storage test"
Get-Content -Path <Drive letter>:\test.txt

Get-Content returns Remote Block Storage test, confirming the volume is writable and readable.

Using the GUI
  1. Open File Explorer and confirm the volume appears under This PC.
  2. Open the volume, right-click an empty area → NewText Document, and name the file test.txt.
  3. Open test.txt, type some text, and save it (Ctrl + S).
  4. Close and reopen the file to confirm the content was saved to the volume.

Kubernetes

  1. Confirm the pod is running:
kubectl get pods
  1. Check container status:
kubectl get pod iscsi-demo-pod -o wide

Statuses:

  • Running - container is successfully launched and the volume is mounted
  • ContainerCreating - the pod is still initializing
  • CrashLoopBackOff - check the container's command, logs, or volume errors. You can get more details using the kubectl describe pod <Pod name> command
  1. Exec into the pod and check the mount:
kubectl exec -it iscsi-demo-pod -- sh
  1. Once inside the pod:
ls /mnt/storage

If everything was set up correctly, you should see the contents of the mounted iSCSI volume.

Disconnecting storage

Linux

To safely disconnect and avoid data loss:

  1. Identify mountpoints:
lsblk

Example output:

NAME                     MAJ:MIN RM   SIZE RO TYPE  MOUNTPOINTS
sdc                        8:32   0    10G  0 disk  /mnt/storage
                                                        /mnth
  1. Unmount all mountpoints:
sudo umount /mnt/storage
sudo umount /mnth

If the device is busy, check which processes are using it:

lsof /mnt/storage

End those processes or wait for any write operations to complete, then try unmounting again.

  1. Disconnect from the iSCSI target:
  • Check the current iSCSI session:
iscsiadm -m session
  • Log out from the target:
sudo iscsiadm -m node -T <Target IQN> -p <Volume IP> --logout
  • Remove the target record (optional):
iscsiadm -m node --targetname <Target name> -p <Volume IP>:3260 -o delete
  1. Run lsblk again to ensure the block storage device is no longer listed

Windows

To disconnect a volume from a Windows Dedicated Server, follow the steps below.

Step 1: take the volume offline via Disk Management

  1. Open Disk Management (search for diskmgmt.msc in the Start menu)
  2. Locate the disk associated with the iSCSI volume
  3. Right-click on the volume or partition → select Change Drive Letter and Paths...
  4. If a drive letter is assigned, remove it
  5. In the left-hand panel (e.g., Disk 2), right-click the disk → choose Offline

Step 2: disconnect from the iSCSI target via iSCSI Initiator

  1. Open iSCSI Initiator (search for iscsicpl in the Start menu)
  2. In the Targets tab, locate the target with Status: Connected
  3. Select it and click Disconnect
  4. Confirm the action when prompted

Step 3: remove the target from configuration (optional)

  1. Navigate to the Favorite Targets tab in iSCSI Initiator
  2. Select the disconnected target and click Remove

This prevents Windows from automatically reconnecting to the target on startup.

Kubernetes

Step 1: identify the node where the volume is mounted

Before deleting the pod, determine the node it runs on:

kubectl get pod <Pod name> -o wide

This will show something like:

NAME             READY   STATUS    RESTARTS   AGE   IP           NODE
iscsi-demo-pod   1/1     Running   0          1h    172.31.x.x   10.20.30.40

Step 2: log in to the worker node that mounted the volume via SSH

ssh <user>@<node IP>

Step 3: Log out from the iSCSI target

  1. After connecting to the node, list active sessions:
sudo iscsiadm -m session
  1. Disconnect the storage:
sudo iscsiadm -m node -T <Target IQN> -p <Volume IP> --logout

Replace <Target IQN> and <Volume IP> with actual values from the list of active sessions

  1. Run the session list command again to make sure the storage was successfully disconnected

Step 4: delete the pod

This command must be executed from your workstation or any machine with kubectl access, not on the Kubernetes node. Once logout is complete:

kubectl delete pod iscsi-demo-pod

Step 5: remove the CHAP secret (optional)

kubectl delete secret chap-secret

On this page