Skip to main content
Technical Guide

NVMe/TCP Storage for Kubernetes

Low-latency block storage over standard Ethernet for OpenShift and Kubernetes: native NVMe multi-queue, no special network cards, and no proprietary drivers.

NVMe/TCP carries native NVMe commands over standard TCP/IP. For OpenShift and Kubernetes it delivers low-latency block storage on ordinary Ethernet, without RDMA-capable adapters and without out-of-tree drivers. simplyblock uses NVMe/TCP as the transport for erasure-coded, hyperconverged storage that runs on the compute nodes, so there is no separate storage tier to rack or operate. This guide covers how NVMe/TCP differs from iSCSI, why an NVMe-first design matters once a cluster reaches petabyte scale, how it integrates through CSI, and the cases where NVMe/TCP is not the right transport.

Multi-queue Native NVMe queue model, versus a single command queue per iSCSI session
Standard Ethernet No RDMA fabric or special network cards required
In-kernel NVMe/TCP initiator in mainline Linux since kernel 5.0
CSI-native Provisioning, expansion, snapshots, and clones through standard Kubernetes objects

Why the block protocol and where it runs both matter at scale

Once a cluster carries hundreds of pods and virtual machines and grows toward petabyte scale, the choice of block protocol and its placement in the cluster stop being details.

iSCSI serialises concurrency

iSCSI wraps SCSI commands in TCP and carries a single command queue per session, so concurrent I/O is funnelled through one queue and reassembled. For a cluster where many pods and virtual machines drive I/O at the same time, that serialisation is a practical ceiling, and it carries a SCSI translation layer kept only for backward compatibility.

Retrofitted stacks spend CPU per I/O

NVMe drives placed behind a data path originally designed for spinning disks and SCSI add a translation layer, an interrupt, and a context switch on every operation. At petabyte scale the limit is rarely raw bandwidth; it is the CPU cost of each I/O and the gap between average and worst-case latency, which is the latency applications actually feel.

A separate storage tier adds cost and distance

Placing storage on a dedicated target that compute nodes reach over the network adds a tier to rack, license, and operate, and it puts a network hop between every workload and its data. Both hardware count and latency grow with it.

NVMe-first block storage on the compute nodes

Native NVMe multi-queue over standard Ethernet

NVMe/TCP transports native NVMe commands and preserves the NVMe multi-queue model: many independent queues, each with deep queue depth, mapped to separate CPU threads. Parallelism is expressed in the protocol rather than through a single queue. It runs on ordinary Ethernet with no RDMA fabric, so it keeps the reach and operational simplicity of iSCSI without the single-queue bottleneck or the SCSI translation layer.

  • Native NVMe commands, not SCSI-over-TCP
  • Deep, parallel queues instead of one per session
  • Standard Ethernet, no RoCE-capable NICs required

An NVMe-first data path

The data path is built around NVMe semantics from the application to the drive rather than retrofitted behind an older stack. A user-space, poll-mode, zero-copy path avoids kernel context switches on every I/O, which holds tail latency steady under the sustained, mixed load a production cluster actually runs in. Where a lossless fabric is available, simplyblock also supports NVMe/RoCE for lower latency still.

  • User-space, poll-mode, zero-copy engine
  • Tail latency held steady under sustained load
  • NVMe/TCP or NVMe/RoCE, chosen per environment

Runs on the compute nodes

simplyblock is hyperconverged: the storage services run on the same compute nodes as the workloads, so there is no separate storage tier to rack, license, or operate. NVMe/TCP is the transport between storage services within and across those nodes, with NVMe multipathing for path resilience. Because the storage services follow a workload, a pod or virtual machine keeps local-read latency even after it reschedules to another node.

  • One hardware footprint, storage and compute on the same nodes
  • Data locality preserved as workloads move
  • Every volume still reachable over NVMe/TCP from any node

Standard CSI integration

simplyblock is consumed through a standard Container Storage Interface driver. Dynamic provisioning, expansion, snapshots, and clones all use the normal Kubernetes objects, so application teams do not learn a new workflow. NVMe Asymmetric Namespace Access provides automatic path failover, and the NVMe/TCP initiator has been in the mainline Linux kernel since 5.0, so there are no out-of-tree drivers to maintain. It works with Red Hat® OpenShift® and any Kubernetes distribution. See the simplyblock documentation for configuration details.

  • StorageClass, PersistentVolumeClaim, and VolumeSnapshot
  • NVMe ANA multipathing for automatic path failover
  • In-tree initiator, works on any Kubernetes distribution

Outcomes of an NVMe-first, hyperconverged approach

One hardware footprint

Storage runs on the compute nodes, so there is no separate storage tier to buy, rack, or operate. Fewer moving parts, one server class, and one thing to scale.

Predictable latency under load

An NVMe-first, poll-mode data path holds tail latency steady during the node drains, rebuilds, and rolling upgrades that a platform team runs every week, not just in a quiet benchmark.

Fewer drives through erasure coding

Distributed erasure coding protects data at a fraction of the raw-capacity overhead of replication, so the same usable capacity needs far fewer NVMe drives.

No lock-in

NVMe/TCP is an open, in-kernel standard on commodity hardware. No proprietary drivers, no appliance, and no RDMA fabric requirement to get started.

Run the numbers

See the cost of erasure coding versus replication

Enter your usable capacity and compare 1.5× raw with erasure coding against 3× with replication, plus the compute you reclaim from lower latency. No sign-up, and the result is printable.

Talk to a storage engineer

Questions and Answers

How is NVMe/TCP different from iSCSI for Kubernetes storage?

iSCSI carries SCSI commands over TCP with a single command queue per session, which serialises concurrent I/O. NVMe/TCP carries native NVMe commands and preserves the NVMe multi-queue model, so many pods and virtual machines can drive parallel I/O without a single-queue bottleneck. Both run on standard Ethernet, so NVMe/TCP keeps iSCSI's operational simplicity while removing its architectural limits.

Do I need special network cards for NVMe/TCP?

No. NVMe/TCP runs over standard Ethernet and standard NICs, and the initiator has been in the mainline Linux kernel since 5.0. RDMA-capable adapters and a lossless fabric are only needed for NVMe/RoCE, which simplyblock also supports where the lower latency is worth the additional fabric complexity.

When is NVMe/TCP the wrong choice?

Three cases. If you already run a lossless RDMA fabric and need the lowest possible latency, NVMe/RoCE will beat NVMe/TCP. If the workload is not latency or IOPS sensitive, such as cold archival data or large sequential batch, a cheaper capacity tier is usually a better fit. And if storage never leaves a single node, a networked block protocol adds coordination without a matching benefit. Most block workloads at scale sit outside these cases.

Does simplyblock run on a separate storage tier or on the compute nodes?

On the compute nodes. simplyblock is hyperconverged: storage and compute share the same servers, so there is no separate storage tier to rack or license. NVMe/TCP is the transport between storage services across those nodes, and storage follows the workload to preserve local-read latency.

Not sure if simplyblock is right for your team?

Ask about NVMe/TCP versus iSCSI, running storage on the compute nodes, CSI integration, or where NVMe/TCP is the wrong choice.