Skip to content

Chapter 19: IP Addressing and Planning · Part 10 of 11

Act 9 -- The Seven Mistakes That Break at 3am

Every mistake in this list has been made in production. Some caused hours of debugging. Some caused multi-day outages.

Common Mistakes
7 Addressing Errors That Break at 3am
1
OOB/Compute Range Overlap
CRITICAL
v
2
/24 Server Subnets Instead of /32 Host Routes
CRITICAL
>
3
VLAN ID Reuse Across Fabrics
HIGH
>
4
Insufficient Headroom in /24
MEDIUM
>
5
Duplicate Loopback (Router-ID Collision)
CRITICAL
>
6
VNI Assignment Without Convention
HIGH
>
7
No Summary Route Plan at SuperPOD Interconnect
MEDIUM
>
Mistake 1: OOB/Compute Range Overlap
ipmitool hangs. Can SSH to server. Cannot reach BMC. Server has a route to 10.0.1.0 via compute fabric.

Mistake 1: Compute and OOB in overlapping ranges

What happens: You allocate 10.0.0.0/8 for compute and also use 10.0.1.0/24 for BMC addresses. The DGX compute NIC has a route to 10.0.0.0/8 via BGP. When it tries to reach the BMC at 10.0.1.10, the packet goes over the compute fabric instead of the OOB switch. The BMC never receives it because the compute switch has no route to the BMC. Management is unreachable via the path it should be unreachable via, and the engineer cannot figure out why ipmitool hangs.

Fix: OOB and compute must be in entirely separate /16 blocks. No overlap possible by construction. 10.0.x.x = OOB always. 10.10.x.x = compute always.

Mistake 2: /24 server subnets instead of /32 host routes

What happens: You give each DGX-leaf segment a /24 subnet (DGX-01 on 10.10.1.0/24, DGX-02 on 10.10.2.0/24). AllReduce traffic needs to flow between DGX-01 and DGX-02. The leaf has two /24 subnets in the routing table but they are directly connected -- no BGP route is generated because they are connected routes, not BGP-learned routes. Traffic within a DGX works fine. Traffic between DGX nodes fails because no route exists across the fabric.

Fix: Server interfaces as /32. Leaf advertises /32 into BGP. Spines learn /32 and forward. Remote leaves install /32 as BGP route. Works.

Mistake 3: VLAN ID reuse across storage and compute

What happens: VLAN 10 is used for compute traffic on the leaf switches and also VLAN 10 is configured on the storage switch for storage management. When the leaf switch's VLAN 10 trunking port is plugged into the storage switch accidentally (wrong cable in a dense rack), VLAN 10 traffic merges. GPU AllReduce packets flood the storage network. Storage appliances receive millions of unfamiliar multicast packets. NVMe-oF connections reset under the load.

Fix: Dedicate VLAN ranges by fabric. VLANs 1-99: reserved/infrastructure. VLANs 100-199: storage. VLANs 1000-4094: compute/tenants. Never share a VLAN ID across fabrics.

Mistake 4: Not reserving headroom in every /24

What happens: BasePOD 1 is deployed with 8 DGX nodes. Each uses 8 IPs in 10.10.1.0/24. 64 addresses consumed of 254. Six months later, the cluster is expanded to 32 DGX nodes. Now you need 256 addresses in 10.10.1.0/24 -- one more than the /24 can hold. Either the 30th DGX gets an address in a different /24 (breaking the pod-indexed scheme) or you renumber the entire pod.

Fix: Plan for maximum pod size before deployment. A BasePOD is typically 32 DGX nodes maximum. 32 x 8 = 256 compute addresses. Allocate a full /23 (10.10.0.0/23 = 512 addresses) for the compute interfaces of one pod, not a /24. Reserve half for future use.

Mistake 5: BGP router-ID collision

What happens: Two switches in the fabric have the same loopback IP. They both advertise the same /32 into BGP. Each switch sees two equal-cost paths to 10.10.0.1/32. Depending on which switch is queried, traffic that should reach switch A arrives at switch B. SNMP polling for switch A returns switch B's counters. UFM topology shows switches flickering between two apparent locations.

Fix: Automate loopback assignment. Generate loopbacks from the pod-indexed scheme in a spreadsheet and push via Ansible. Never assign by hand without a source-of-truth document.

Mistake 6: VNI assignment without a naming convention

What happens: Tenant 1 gets VNI 100. Tenant 2 gets VNI 200. Later, a temporary debug VNI 150 is created and forgotten. Six months later, a new engineer adds VNI 100 to a second pod and conflicts with a VNI range that extends across both pods. EVPN distributes conflicting MAC-IP bindings. Traffic for one tenant randomly ends up in another tenant's VRF.

Fix: Use the formula from Act 7. Every VNI encodes pod + tenant + segment. Any VNI is immediately decodable. Conflicts are prevented by construction.

Mistake 7: No summary route plan at SuperPOD interconnect

What happens: BasePOD 1 and BasePOD 2 are connected at the super-spine. Neither pod was designed with aggregatable address ranges. BasePOD 1 uses 10.5.1.0/24 for some compute, 10.8.3.0/24 for other compute (assigned ad-hoc). There is no clean summary. The super-spine must carry the full BGP table of both pods -- thousands of /32 host routes. When super-spine-01 reboots, it takes 4 minutes to reconverge because it must re-learn every individual /32 from both pods.

Fix: Design the summarisation into the address plan from day one. Pod N owns 10.10.(N*10).0/23 for compute. The super-spine carries two /23 summaries per pod. Convergence is seconds, not minutes.