Protocol

NVMe-oF Discovery Service

The NVMe-oF Discovery Service is a protocol mechanism that allows initiator hosts to automatically find and enumerate available NVMe-oF targets and subsystems on the network. Initiators query a Discovery Controller to retrieve a log of all subsystems they are authorized to connect to, eliminating the need for manual target configuration.

How NVMe-oF Discovery Works

When an initiator host boots, it connects to a well-known discovery address (port 8009 for centralized discovery, or a configured IP). It sends a Get Log Page command to the Discovery Controller, which responds with a Discovery Log Page — a list of NVMe-oF targets including their transport type, address, port, and NQN (subsystem identifier).

Discovery in Practice (nvme-cli)

# Discover all NVMe-oF targets at a given address
nvme discover -t tcp -a 192.168.1.10 -s 8009
# Connect to a discovered subsystem by NQN
nvme connect -t tcp -a 192.168.1.10 -s 4420 \
-n nqn.2024-01.com.example:storage-node-1
# Connect to all discovered subsystems at once
nvme connect-all -t tcp -a 192.168.1.10

Centralized vs Distributed Discovery

  • Centralized — A single Discovery Controller maintains the full target list. Simple to manage; a single point of failure unless replicated.
  • Distributed (TP8013) — Each NVMe-oF target runs its own Discovery Controller. Initiators are directed between them. More resilient but more complex.

NVMe Discovery and Kubernetes

Storage systems like simplyblock automate discovery — when a Kubernetes node joins the cluster, the CSI node plugin runs NVMe discovery and nvme connect automatically, making storage volumes available to pods without manual administrator intervention.