Remote Block Storage (RBS) is an external block-level storage volumes that can be mounted to Dedicated Servers or Kubernetes nodes.
This section outlines how to create and initialize a new RBS volume.
To create a new RBS volume:
IOPS (Input/Output Operations Per Second) and bandwidth will be calculated automatically based on the selected size
The system will begin provisioning the volume. Once completed, the volume will be available for use.
To connect a volume to a Linux dedicated server, follow the steps below. All the commands should be run under the root user.
apt install open-iscsi
The target configuration path is: /etc/iscsi/nodes
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.
Run the discovery command:
iscsiadm -m discovery -t st -p <Volume IP>
<Volume IP>
is an iSCSI Volume IP address.
You can find it in the customer portal under Remote Block Storage → Your volume → IP address.
The output will include the iSCSI target name, which looks like:
X.X.X.X:3260,1 iqn.1234-56.com.servers:12a34bcd-5678-9e12-3456-ex4mp1e
Where:
X.X.X.X
- IP address of the iSCSI target (the server hosting the volume)3260
- default TCP port for iSCSI connections1
- target portal port index (1
- default value)iqn.1234-56.com.servers:12a34bcd-5678-9e12-3456-ex4mp1e
- IQN (iSCSI Qualified Name), which uniquely identifies the iSCSI target nameConfigure 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 <User>
iscsiadm -m node --targetname <Target name> -p <Volume IP>:3260 -o update -n node.session.auth.password -v <Password>
Replace <User>
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
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.
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>
with the actual device name from the previous step.
lsblk -f
echo "UUID=<UUID value> /mnt ext4 _netdev 0 0" | tee --append /etc/fstab
<UUID value>
is the UUID of a file system from the previous requestRemote Block Storage has been set up.
sudo mkdir -p /mnt/iscsi
sudo mount /dev/<Device name> /mnt/iscsi
cd /mnt/iscsi
nano /mnt/iscsi/test.txt
To save and close:
cat /mnt/iscsi/test.txt
To safely disconnect and avoid data loss:
lsblk
Example output:
NAME MAJ:MIN RM SIZE RO TYPE MOUNTPOINTS
sdc 8:32 0 10G 0 disk /mnt/iscsi
/mnth
sudo umount /mnt/iscsi
sudo umount /mnth
If the device is busy, check which processes are using it:
lsof /mnt/iscsi
End those processes or wait for any write operations to complete, then try unmounting again.iscsiadm -m session
iscsiadm -m node --targetname <Target name> -p <Volume IP>:3260 --logout
iscsiadm -m node --targetname <Target name> -p <Volume IP>:3260 -o delete
lsblk
again to ensure the block storage device is no longer listedTo connect a volume to a Windows Dedicated Server, follow the steps below.
Get-NetFirewallRule | Where-Object { $_.Direction -eq "Inbound" -and $_.Enabled -eq "True" } | Get-NetFirewallPortFilter | Where-Object { $_.Protocol -eq "TCP" -and ($_.LocalPort -eq 860 -or $_.LocalPort -eq 3260) }
860
and 3260
:
New-NetFirewallRule -DisplayName "Allow iSCSI TCP 860" -Direction Inbound -Protocol TCP -LocalPort 3260 -Action Allow
New-NetFirewallRule -DisplayName "Allow iSCSI TCP 3260" -Direction Inbound -Protocol TCP -Lo
To add outbound rules, repeat the same command with Outbound
instead of Inbound
.860
, 3260
Allow iSCSI
)Services
in the search barSet-Service -Name MSiSCSI -StartupType Automatic
iSCSI Initiator
by using the Control Panel or run iscsicpl.exe
from PowerShell<Volume IP>
3260
(default port)<Volume IP>
is an iSCSI volume IP address<GPN interface IP>
<GPN interface IP>
is a Global Private Network IP address assigned on an interface of your server<GPN interface IP>
on your server's detail page Dedicated Servers → Manage → Your server → Private IPIn the Targets tab, the new target volume will appear with Inactive status.
<GPN interface IP>
<Volume IP>
<User>
<Password>
<User>
and <Password>
on the volume details page: Remote Block Storage → Your volume → Credentials → ShowYou can now create partitions, assign a label or drive letter, and format to NTFS.
To perform a quick initialization and format via PowerShell, use the following command:
Get-Disk |Where-Object PartitionStyle -eq 'RAW' |Initialize-Disk -PartitionStyle MBR -PassThru |New-Partition -AssignDriveLetter -UseMaximumSize |Format-Volume -FileSystem NTFS -Confirm:$false
To safely disconnect an iSCSI volume and prevent data loss, follow these steps:
diskmgmt.msc
in the Start menu)iscsicpl
in the Start menu)This prevent Windows from automatically reconnecting to the target on startup.
To connect a remote block storage (RBS) volume to a Kubernetes pod, follow the steps below.
chap-secret.yaml
):
nano chap-secret.yaml
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>
echo -n '<Username>' | base64
echo -n '<Password>' | base64
Replace:
<Username>
and <Password>
with the encoded values from the customer portal → Remote Block Storage → Your volume → Credentials → Show<CHAP secret name>
with a name for the secret (e.g., chap-secret
), which will be used later in the pod manifestkubectl 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.
pod-manifest.yaml
):
nano pod-manifest.yaml
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 placeholders with actual values:
Placeholder |
Description |
<Pod name> |
Name of the pod (e.g., |
<Container name> |
Name of the container inside the pod |
<Image name> |
Container image name (e.g., |
<Folder> |
Mount path inside the container (e.g., |
<Volume name> |
Volume name inside the pod |
<Volume IP> |
IP address of the iSCSI target |
<Target name> |
IQN of the target (e.g., |
<File system> |
Filesystem type (typically |
<CHAP secret name> |
Name of the CHAP secret object from the previous step |
<Volume IP>
and <Target name>
in the customer portal on the block storage details pagekubectl apply -f pod-manifest.yaml
pod/iscsi-demo-pod created
kubectl get pods
kubectl get pod iscsi-demo-pod -o wide
Statuses:
Running
- container is successfully launched and the volume is mountedContainerCreating
- the pod is still initializingCrashLoopBackOff
- check the container's command, logs, or volume errors. You can get more details using the kubectl describe pod <Pod name>
commandkubectl exec -it iscsi-demo-pod -- sh
ls /mnt/storage
If everything was set up correctly, you should see the contents of the mounted iSCSI volume.
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
ssh <user>@<node IP>
sudo iscsiadm -m session
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 sessionsThis 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
kubectl delete secret chap-secret