Routage inter-subnet intra-VPC via L3VNI (IRB symétrique) #41
Labels
No labels
bug fix
feature implementation
new feature
No project
No assignees
1 participant
Notifications
Due date
No due date set.
Dependencies
No dependencies set.
Reference
syonad/two#41
Loading…
Add table
Add a link
Reference in a new issue
No description provided.
Delete branch "%!s()"
Deleting a branch is permanent. Although the deleted branch may continue to exist for a short time before it actually gets removed, it CANNOT be undone in most cases. Continue?
Contexte et problème
Aujourd'hui le routage entre deux subnets d'un même VPC impose de porter les deux subnets
(bridge + L2VNI + SVI) sur les deux hyperviseurs concernés. C'est de l'IRB asymétrique :
le routage se fait entièrement sur le VTEP d'entrée, qui doit donc connaître localement le
subnet de destination.
Conséquences :
Solution retenue
IRB symétrique : introduction d'un L3VNI par VPC, VNI de transit distinct des L2VNI
de subnet, associé à une VRF l3mdev dans le netns underlay.
Le netns du VPC est conservé pour les VM (isolation structurelle là où sont les charges non
fiables). Il ne porte plus que les gateways de subnet et une route supernet de sortie. La
table de routage inter-subnet remonte dans la VRF, où FRR la voit et peut faire de l'EVPN
nativement.
Chemin d'un paquet A (subnet D, host1) → B (subnet E, host2) :
veth-l3-C-out, entrée dansvrf-C;vrf-C→ RT-5 apprise, next-hop = VTEP host2, RMAC = RMAC-host2 ;br-l3-Cremonte en L3 dansvrf-C, route vers son netns ;br-E→ ARP de B → livraison.Host1 n'a jamais besoin de
br-Eni devxlan-E, et réciproquement. Par host, le nombre deVNI passe de « tous les subnets de tous les VPC hébergés » à « subnets réellement locaux
Articulation avec le plan public existant
Le plan public reste inchangé et cohabite sans interférence :
Dans le netns d'un VPC, les deux plans coexistent par longest-prefix : le supernet du VPC part
dans le L3VNI, la route par défaut part vers la MAC anycast des border routers via le VNI
public. Aucun conflit. Les sujets propres au plan public sont traités dans les issues #04,
#05, #06 et #08.
Topologie
Règle d'invariant :
vrf-Ccontient exactement deux interfaces,br-l3-C(sans IP)et
veth-l3-C-out(avec le /30). Elles ne sont pas pontées entre elles — c'est la FIB dela VRF qui les relie, et ce lookup est le routage inter-subnet.
Erreurs à ne pas commettre :
veth-l3-C-out master br-l3-C→ remet le netns dans le domaine de broadcast du L3VNI :plus de routage sur l'host, collision généralisée du /30 entre tous les hosts, pollution
du L3VNI par des RT-2 parasites ;
vxlan-l3-Cdirectement dans la VRF sans bridge → pas de terminaison L3, non reconnucomme L3VNI par FRR. Le bridge à un port est un passage obligé du modèle Linux.
Plan d'allocation (exemple chiffré)
10.1.0.0/161100<IP-VTEP-host>:1100— dérivé du VTEP, pas de l'ASN65000:1100, commun au VPC169.254.0.0/30, identique pour tous les VPC65001(commun à tous les hosts) /6500010.0.0.1/02:00:00:00:00:0110.0.0.2/02:00:00:00:00:0210.0.255.1,10.0.255.210.1.0.0/24, L2VNI1010010.1.0.510.1.1.0/24, L2VNI1010110.1.1.5Contraintes d'allocation :
65001, un RDde la forme
<ASN>:<VNI>serait identique partout : les annonces concurrentes du mêmepréfixe redeviendraient une seule NLRI, et on perdrait le multipath ainsi que le filet de
secours du /24 pendant les migrations. Contrainte, pas préférence.
La dérivation auto du RT dépend de l'ASN local, que
local-asmodifie sur la session RR.VPC est taillé dans un bloc agrégeable. Voir issue #10.
même subnet.
Configuration kernel
Host1 — création du netns C
Host1 — subnet D (L2VNI, inchangé)
Aucun L2VNI n'est rattaché à la VRF : la gateway est dans le netns.
Configuration FRR
Host1 —
/etc/frr/frr.confHost2 — seules lignes divergentes
Tout le reste est strictement identique, y compris le RT, le L3VNI, le prefix-list VPC et la
route-map d'export. Trois valeurs à substituer par host : IP de VTEP (router-id,
update-source, RD, prefix-list underlay), RMAC (côté kernel), hostname.
Route reflector —
/etc/frr/frr.confLe RR réfléchit les routes, il ne les importe pas : aucune VRF, aucun L3VNI, aucun RT,
aucun VTEP. Ajouter un VPC ne touche jamais à sa configuration, et le
listen rangefaitqu'ajouter un hyperviseur non plus.
Interdits sur le RR, chacun provoquant une panne silencieuse :
next-hop-self: le next-hop d'une route EVPN est le VTEP d'origine. Réécrit, ilpointe vers le RR, qui n'est pas un VTEP → trou noir total.
advertise-all-vni: le RR n'est pas un VTEP.update-sourcedoit être la VIP Pacemaker, sinon la session casse au basculement.À vérifier sur la version en usage :
bgp retain route-target all. Un RR reçoit desroutes dont il n'importe aucun RT ; si la rétention est désactivée il les jette et la
réflexion ne fonctionne plus. Le défaut FRR est la rétention, mais ce point doit être
confirmé — la panne serait totale et immédiate sur tout VPC nouvellement créé. Voir #01.
Pourquoi
local-assur la session RRHyperviseurs et RR ont des ASN différents (
65001/65000), la session serait donc eBGP.Quatre problèmes en découlent, dont un bloquant :
65001, une route de host1 revient à host2avec
65001dans l'AS-PATH et est rejetée. Aucune route EVPN n'est échangée entre hosts ;route-reflector-clientest un mécanisme iBGP, sans effet en eBGP ;local-as 65000 no-prepend replace-asramène cette seule session en iBGP : le type desession se détermine par voisin, en comparant
remote-asà l'ASN local effectif. Les autresvoisins du host restent en eBGP natif avec
65001.Portée de diffusion des routes tenant
router bgp 65001 vrf vrf-Cne contient aucunneighbor: c'est un contexted'origination, pas une instance BGP supplémentaire. Ce qui décide de la diffusion, c'est
l'AF sous laquelle un voisin est activé.
l2vpn evpnseuleipv4 unicastseuleDeux conditions à ne jamais violer :
l2vpn evpn— il recevrait toutes lesRT-5 tenant et pourrait les propager vers le backbone ;
import vrf vrf-Cdans l'instance par défaut — c'est la commande defuite de routes entre VRF.
Ni l'une ni l'autre ne produit d'erreur ni de dégradation visible, seulement une fuite : ce
sont des cas à détecter par contrôle automatisé de configuration.
Opérations
Ajout / suppression de VM
redistribute kernel, pasredistribute static: une route posée parip route adddepuis l'orchestrateur est de type kernel pour zebra.
staticdésigne les routes configuréesdans FRR. Avec
static, aucune route VM n'est annoncée, sans message d'erreur.Choix du /32 par VM retenu pour que la migration soit un événement de plan de contrôle
échangé, et non une expiration de cache.
Filet de secours : conserver en permanence l'annonce du /24 par chaque host portant le
subnet. Pendant la fenêtre de bascule d'un /32, le trafic tombe sur un host du subnet et
repart en L2VNI vers la VM. Un hop de trop pendant quelques secondes, aucune perte.
Migration de VM
Ordre imposé : retrait du /32 à la source, puis pose à destination.
Dans l'ordre inverse, deux RT-5 identiques coexistent, la sélection peut figer l'ancien
chemin, et le trafic tombe dans le vide de façon stable — bien pire qu'une micro-coupure.
Ajout / suppression de VPC
Uniquement sur les hosts hébergeant une VM du VPC : VRF +
br-l3-C+vxlan-l3-C+rattachement du veth, puis le bloc
vrfetrouter bgp ... vrfci-dessus. Rien sur lesautres hosts, rien sur les RR, rien sur les border routers.
Créer un subnet ne touche jamais à la config VRF ; créer un VPC ne touche jamais à la config
des subnets. Les deux plans sont orthogonaux.
Effet sur traceroute (accepté)
Deux hops supplémentaires, un par extrémité :
Le passage en L3VNI est transparent (l'encapsulation VXLAN ne décrémente pas le TTL interne).
Décision : hops visibles conservés, pas de filtrage ICMP time-exceeded. Sous-décisions
restantes en #10.
Vérifications
Si
show bgp neighboraffiche la session en external, lelocal-asn'a pas pris et rienne fonctionnera entre hosts.
Assertion d'invariant à automatiser : chaque VRF contient exactement deux membres,
br-l3-Csans IP etveth-l3-C-outavec le /30. La topologie est peu intuitive et se prêteau copier-coller approximatif ; ne pas compter sur la relecture humaine.
Risques
L'étanchéité inter-tenant passe d'une propriété du noyau à une propriété de la configuration :
le forwarding local reste isolé par la FIB de la VRF, mais la joignabilité inter-host dépend
désormais du RD/RT et du mapping L3VNI↔VRF. Trois scénarios de fuite silencieuse : RT mal
alloué, L3VNI dupliqué ou recyclé trop vite,
import vrfrésiduel. Traité en #02.L'orchestrateur devient source de vérité du routage tenant : une route /32 non retirée après
destruction d'une VM est un trou noir qui survit à la VM. Traité en #03.
Atténuation structurelle à formaliser dans le dossier d'architecture : le netns est conservé,
donc les charges non fiables restent isolées par le noyau. Seul le segment de transit entre
hyperviseurs est exposé à la configuration.
Autres risques : volumétrie du plan de contrôle (#09), MTU 8950/9000 à revalider (#01),
migration depuis l'existant (#11), usurpation MAC/IP au port virtuel (#04).
Issues liées
Variante non retenue
Session BGP unnumbered entre le netns et l'host sur le veth, netns en
redistribute connected: supprime toute écriture de route statique, y compris par VM. Coût : un démon BGPpar couple (VPC, host), sur lien point-à-point. À réévaluer si le volume d'écritures devient
un problème opérationnel.
🛡️ Garde-fou Voltalis
plus par le noyau ; routes /32 rémanentes (trou noir silencieux) ; séquencement de
migration ; réutilisation d'ID sans quarantaine ; volumétrie du plan de contrôle
production multi-tenant
d'isolation avec test négatif inter-VPC comme critère d'acceptation, veille, revue
technique, tests, traçabilité de l'usage de l'IA dans la conception
Configurations conçues avec assistance IA : relecture humaine et validation en lab
obligatoires avant toute application sur un système réel.
point a regarder :
Campagne de qualification en lab — L3VNI / VRF / iBGP
Priorité : bloquant. Prérequis à tout engagement de design sur #00.
Contexte
La conception #00 repose sur plusieurs comportements de FRR et du noyau que la documentation
ne garantit pas de façon univoque selon les versions. Ils doivent être observés, pas supposés.
Points à qualifier
1.
local-as ... no-prepend replace-assur l'AFl2vpn evpnVérifier que la session vers les RR est bien vue comme internal et que les routes EVPN
sont échangées entre hosts partageant l'ASN 65001 sans rejet pour boucle AS-PATH.
Contrôle :
show bgp neighbor <RR>doit indiquer un lien internal ; une RT-5 émise par host1doit apparaître dans
show bgp vrf vrf-C ipv4 unicastsur host2.2.
bgp retain route-target allsur les RRUn RR reçoit des routes dont il n'importe aucun RT. Si la rétention est désactivée il les
jette et la réflexion cesse de fonctionner. Le défaut FRR est la rétention, à confirmer.
Criticité : la panne serait totale et immédiate sur tout VPC nouvellement créé.
3.
redistribute kerneldans une VRFVérifier qu'une route posée par
ip route add ... vrf vrf-Cest bien captée et convertie enRT-5.
redistribute staticne fonctionne pas (il ne couvre que les routes configurées dansFRR) et échoue silencieusement.
4. Sélection de meilleur chemin entre deux RT-5 /32 concurrentes
Simuler une migration : annonce simultanée du même /32 par deux hosts avec des RD distincts.
Observer quel chemin est retenu et combien de temps dure l'incohérence.
Ce test tranche définitivement la stratégie de séquencement de migration.
5. Ajout / retrait à chaud d'une instance VRF sous charge
Vérifier l'absence de reset des sessions existantes, et le comportement de
frr-reload.pysur ces opérations — c'est l'outillage qui peut être brutal, pas la fonctionnalité.
6. SVI de L3VNI alimenté par routes kernel
Vérifier le comportement de FRR quand les préfixes tenant arrivent par route redistribuée
plutôt que par interface connectée dans la VRF.
7. MTU de bout en bout
ip netns exec C ping -M do -s 8922 <ip-distante>doit passer avec veth à 8950 et underlayà 9000. Valider aussi le comportement de la PMTU discovery.
8. Comportement de la MAC anycast des border routers au flap
Voir #05 : provoquer un basculement de border router et observer si la MAC de gateway est
traitée comme une mobilité, voire gelée par la détection de duplication.
Critère d'acceptation
Les 8 points documentés avec version exacte de noyau et de FRR, résultat observé, et pour
chaque écart un contournement validé. Aucun déploiement avant clôture de cette issue.
Prochain ticket