跳转到内容

Present the demo

The claim this demo supports is narrow and worth stating precisely, because a wider one will not survive questions:

Customer Edges in Azure, AWS, and On-Premise KVM advertise the same host route by eBGP (or load balance via Azure ILB), and the native routing fabric installs all of them as equal-cost next hops. Traffic distribution and node removal are therefore properties of the routing fabric — there is no cloud load balancer required in front of the CEs for BGP/ECMP topologies.

Run the four health checks first. Everything below assumes they passed.

Effective routes are the strongest single artefact: they are what Azure actually programmed, not what the CEs claim.

Terminal window
cd terraform
az network nic show-effective-route-table \
-g "$(terraform output -raw resource_group_name)" \
-n "$(terraform output -raw client_nic_name)" \
--query "value[?addressPrefix[0]=='$(terraform output -raw vip)/32'].{prefix:addressPrefix[0],nh:nextHopIpAddress,state:state}" \
-o json

Observed 2026-08-08 on live deployment:

[
{
"addressPrefix": [
"10.250.0.10/32"
],
"nextHopIpAddress": [
"10.0.1.4",
"10.0.1.5",
"10.0.1.6"
],
"nextHopType": "VirtualNetworkGateway",
"state": "Active"
}
]

One prefix, three next hops, Active. That is the whole point of the demo in a single output, and it is worth pausing on: nothing in the picture is a load balancer.

Then show it serving, from inside the VNet and with the Host header:

Terminal window
az vm run-command invoke \
-g "$(terraform output -raw resource_group_name)" \
-n "$(terraform output -raw client_vm_name)" \
--command-id RunShellScript --query "value[0].message" -o tsv \
--scripts "curl -s -o /dev/null -w '%{http_code}\n' \
-H 'Host: $(terraform output -raw lb_domain)' \
http://$(terraform output -raw vip)/"
  1. Frame the 4-path hybrid architecture. One VIP per regional path, several CEs, and no cloud load balancer needed for BGP/ECMP:
    • ROW (eastus): Azure Route Server + eBGP/ECMP (f5-sales-demo.com)
    • Canada (canadacentral): Canadian Regional Edge Virtual Site (f5-sales-demo.ca) supporting Azure Route Server (eBGP/ECMP) or Azure Internal Load Balancer (enable_canada_ilb)
    • AWS (us-east-2): AWS VPC + EC2 CEs (m5.2xlarge) (aws.mcn-ce-ha.f5-sales-demo.com)
    • On-Premise KVM: Local libvirt bridge + FRR ToR BGP router (10.100.0.1, ASN 65515, maximum-paths 4)
  2. Show the advertisement side. Loop the peerings (check 2) — each CE advertising the same prefix with its own next hop, all with the same AS path, so none is preferred.
  3. Show what Azure, AWS, and FRR did with it.
    • In Azure: Effective route table showing one prefix with $N$ next hops (type: VirtualNetworkGateway).
    • In On-Premise FRR: vtysh -c "show ip bgp 10.100.0.10/32" showing multiple *= multipath entries, and ip route show 10.100.0.10/32 in Linux kernel showing ECMP multipath next hops.
  4. Show regional data sovereignty & traffic localization. Demonstrate how xcsh_virtual_site.canada_re uses ves.io/city in (toronto, montreal) to restrict ingress, egress, and TLS decryption for f5-sales-demo.ca strictly within Canadian Regional Edges.
  5. Show Canadian ILB Architecture Variation (when enable_canada_ilb = true). Show how Azure Standard ILB (azurerm_lb.ca_ilb) uses HA Ports (protocol = "All") and Health Probes (Tcp/65500) to distribute traffic across Canadian CE management NICs without BGP.
  6. Show it serving. The curl commands, sending Host headers for mcn-ce-ha.f5-sales-demo.com, mcn-ce-ha.f5-sales-demo.ca, and aws.mcn-ce-ha.f5-sales-demo.com.
  7. Show the configuration. The Terraform is published here, read from the files that deploy it — useful when someone asks whether this is reproducible.

Stated here rather than discovered live. All three are absences of evidence, not known failures.

  • Traffic distribution across the next hops has not been measured. The from-zero UAT sent 160 requests to the VIP, and earlier testing sent 1,470 more. The verify page establishes that the path works and how it behaves over time. None of that shows how requests were spread across the next hops, and this topology gives no per-node HTTP listener to attribute them with. If asked “is it even?”, the honest answer is that it has not been measured here.
  • The cause of the fresh-build convergence transient is not established. It is characterised — when it happens, for how long, and that the origin is clean throughout — and not explained.