Anatomy of an AI serving fabric

A GPU cluster that serves models has three kinds of user and one hard question: which layer owns which decision? Two complete builds walked layer by layer, down to the configuration, with the one choice that changes everything: rails as plain VLANs, or a routed rail Clos.
Hand-drawn banner: an edge box above a switch pair above four rail boxes, joined by a green path, with the title anatomy of an ai serving fabric.

On this page

A GPU cluster that serves models has more than one kind of user. There is the team that runs it, there are the people inside the company who call its models, and sooner or later there is the public internet. The hard part of the network under that cluster is not any one switch. It is deciding which layer owns which decision: who may reach which model, where a gateway lives, what the rails are for, and how storage traffic stays off the paths that carry model traffic.

This post is the anatomy of such a fabric, taken from two complete builds. Both carry a Kubernetes cluster with an inference gateway, two user populations and an operator, enterprise storage and an out-of-band network. They differ in several places, and in the one this post is about: how the eight GPU rails are joined. Build A keeps the rails as plain VLANs with no routing at all; build B routes them over a leaf and spine fabric with eBGP. Everything below is as configured and as captured, with names made generic; the captures keep each platform's own syntax, because the design is what transfers.

One page anatomy. Three user populations on the left: private users over their site or a carrier WAN, the operator, and internet users through one public address. All three enter one edge firewall that holds every gateway, with one route or one NAT rule per population. On the right, a Kubernetes platform with one Gateway per audience feeding one API gateway and the models on the GPU nodes. Below, a Layer 2 switch pair; behind the cluster, a GPU backend of eight rails shown as two designs, enterprise storage with two nodes, and out-of-band management.
The fabric on one page. Every user types the same name; split DNS and the firewall decide which Gateway answers, and a Gateway carries only the routes of its audience.

The layers, in one pass

The edge: one firewall holds every gateway, and a population reaches its Gateway by one route in its own routing instance, or by one NAT rule keyed on its zone, and nothing else. The frontend: a Layer 2 switch pair with no SVI and no routing; every server, the storage and the firewall land on both switches, and every gateway is a tagged sub-interface of the firewall's bundle. The platform: one Gateway per audience, in front of an API gateway with one route and one key per model. The backend: eight rails, one interface per rail on every GPU node. Storage and out-of-band: two storage nodes with data in the server VLAN and management on a VLAN only the firewall joins; BMCs on their own network behind the firewall, on an out-of-band switch; a bastion in its own VLAN holds kubectl and the nodes' DNS.

The backend choice

Build A deletes the spines. Rail r is VLAN 10r (rail 3 is VLAN 30) on one of two standalone switches, with no SVI, no routing protocol and no link between the switches, and a GPU reaches another rail by handing the packet to the GPU of that rail inside its own server, which sends it out on its own rail. Build B keeps the spines: a leaf per rail, four spines, eBGP with one AS per leaf and the spines sharing one, BFD on every link, equal-cost paths over the spines. Same-rail traffic never leaves the leaf; cross-rail traffic goes leaf, spine, leaf. The rest of this post walks each layer with its configuration and shows what each backend asks of the node and the pod.

Two panels. Left, build A: two standalone rail switches, one carrying rails 1, 3, 5 and 7 and the other rails 2, 4, 6 and 8, a dashed red line marking that no link joins them, and a GPU node below with eight rail interfaces whose cross-rail traffic is relayed inside the node. Right, build B: four spines above eight rail leaves, every leaf linked to every spine, eBGP with one AS per leaf, and a GPU node whose cross-rail traffic goes leaf, spine, leaf.
What joins the rails. Build A buys the absence of spines and pays with no cross-rail path through the network. Build B buys the path and pays with a routing design.

The book behind this fabric

The reasoning behind every layer here is worked out, with labs you can build yourself, in my book BGP for AI Infrastructure: A DevOps Engineer's Guide to AI Data Center Fabric Networking: the frontend and backend split in chapters 3 and 4, rail topologies and the eBGP underlay in chapters 5 and 6, how a Gateway's address is announced, and the edge, in chapters 11 and 12, storage in chapter 14. It is on Amazon in paperback and Kindle: BGP for AI Infrastructure on Amazon.

Below the line: each layer as configured and captured, and both backends in their own words.

This post is for paying subscribers only

Subscribe to LevelUp I.T. newsletter and stay updated.

Don't miss anything. Get all the latest posts delivered straight to your inbox. It's free!
Great! Check your inbox and click the link to confirm your subscription.
Error! Please enter a valid email address!