Skip to content

docs(mayastor): document dedicating a network interface for storage traffic - #696

Open
krishnaGajabi wants to merge 3 commits into
mainfrom
docs/dedicated-storage-interface
Open

krishnaGajabi wants to merge 3 commits into
mainfrom
docs/dedicated-storage-interface

Conversation

@krishnaGajabi

Copy link
Copy Markdown
Contributor

The Performance Tips page covers CPU isolation but nothing about the network equivalent, even though the setting to do it already exists.

Unless io_engine.target.nvmf.iface is set, the NVMe-oF target binds to the IO engine pod's own IP, so volume traffic shares the cluster pod network with application and control plane traffic. Setting it moves the target onto a chosen interface — and because every listener shares the target address, both client I/O and replication between nodes follow it.

Adds a Network Isolation section to docs/main/.../additional-information/performance-tips.md covering:

  • the <kind>:<value> syntax, and that an unprefixed value is matched as an interface name (so an unprefixed CIDR matches nothing and the IO engine fails to start)
  • why subnet: usually generalises better than name: — this is a single Helm value rendered into the DaemonSet, so the same value reaches every IO engine pod, and interface names often differ between nodes
  • applying it at install time and on an existing deployment via the kubectl plugin
  • verifying it from the IO engine startup log
  • what it does not move: control plane gRPC, etcd and the REST API stay on the pod network
  • a pointer to the RDMA page for the RDMA case

Docs only. Built locally with npm run build and checked the rendered page under the main version.

@krishnaGajabi
krishnaGajabi requested a review from a team as a code owner November 2, 2026 08:16

@niladrih niladrih left a comment

Copy link
Copy Markdown
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Should this have examples for IPv6 as well?


## Network Isolation

By default, the NVMe-oF target binds to the IO engine pod's own IP address, which places volume

Copy link
Copy Markdown
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

hmm we don't use the cluster pod network, it's always using the host network
By default it uses the K8s node IP

Copy link
Copy Markdown
Contributor Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

made the changes

Comment on lines +124 to +125
Pointing the target at a dedicated interface - a separate NIC, a VLAN, or a storage-only subnet
- keeps that traffic on its own path.

Copy link
Copy Markdown
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

does this read a bit funny with the newline and - ?

Copy link
Copy Markdown
Contributor Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

made the changes, PTAL

will disrupt any volume whose target is hosted on the node you restart.
:::

Because this changes the address that volume targets are published on, the targets hosted on a

Copy link
Copy Markdown
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Actually it's worse than that leading to full rebuilds and potentially a broken application if HA is not enabled

Copy link
Copy Markdown
Contributor Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

made the changes

@krishnaGajabi

Copy link
Copy Markdown
Contributor Author

Should this have examples for IPv6 as well?

made the changes

…raffic

The NVMe-oF target binds to the IO engine pod's IP unless
io_engine.target.nvmf.iface is set, which leaves volume traffic sharing the
cluster pod network with application and control plane traffic. The Performance
Tips page covered CPU isolation but said nothing about the network equivalent.

Add a Network Isolation section covering the value syntax, why a single Helm
value means subnet: generalises across nodes where name: often does not, how to
apply it at install time and on an existing deployment, how to verify it from
the IO engine logs, and which traffic it does not move.

Signed-off-by: krishnaGajabi <gajbikrishna23@gmail.com>
The IO engine DaemonSet is the only one in the chart using
updateStrategy: OnDelete, so a plain helm upgrade updates the DaemonSet and
leaves the running pods on their old -T= argument. The setting looks like it
did nothing until the pods are restarted.

Say so, and point at the kubectl plugin, which restarts the IO engines one
node at a time and moves volume targets off a node first.

Signed-off-by: krishnaGajabi <gajbikrishna23@gmail.com>
The IO engine runs with host networking, so the NVMe-oF target binds to the
node's own address; there is no pod network in that path. The same mistake
ran through "What This Does Not Move", which listed gRPC, etcd and the REST
API together as pod network traffic. The IO engine's own gRPC endpoint, the
HA node agent and the CSI node and controller plugins all run with host
networking and stay on the node address; only agent-core, api-rest and etcd
use the pod network.

Restarting an IO engine republishes its targets, which costs more than the
earlier wording implied. Initiators connected to those targets lose their
path, recovered by the HA node agent when agents.ha.enabled is set and not
recovered at all when it is not, and replicas on the restarted node are
rebuilt in full rather than resynced.

Also record that subnet: accepts IPv6 CIDRs, and that the value selects the
interface rather than the address family -- the family published follows the
IO engine's gRPC address and falls back to whatever the interface holds. The
verification step now points at the log line that confirms the match, rather
than only the one that reports the attempt.

Signed-off-by: krishnaGajabi <gajbikrishna23@gmail.com>
@krishnaGajabi
krishnaGajabi force-pushed the docs/dedicated-storage-interface branch from d0e846d to 63037f5 Compare November 11, 2026 07:33

This branch has not been deployed

No deployments
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

3 participants