Hi all,
I'm currently trying to adopt OVN native BGP/EVPN support to our cloud'
usecases and faced one problem:
Imagine topology of one "external" VTEP node and 2 OVN-managed hosts:
one of them is a gateway chassis, and another is just a normal workload
chassis (without EVPN connectivity).
XXXXXXXXXXXXXXX
X X
XXXXXXXXXXXXXXXXX IP fabric XXXXXXXXXXXXXXX
X X X X
X XXXXXXXXXXXXXXX X
X X X
X X X
XXXXXXXXXXXXXX XXXXXXXXXXXX XXXXXXXXXXXX
X X X X X X
X Ext VTEP X X OVN GW X X OVN w/l X
X X X X X X
XXXXXXXXXXXXXX XXXXXXXXXXXX XXXXXXXXXXXX
10.128.0.5 10.128.0.14 10.128.0.6
VTEP node has configured VRF linked to VNI 300 and announces Type-5
route with 172.31.0.0/24 IP prefix.
[root@vtep01 ~]# ip a s br-300
19: br-300: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc noqueue
master ovnvrf300 state UP group default qlen 1000
link/ether 00:04:00:00:00:01 brd ff:ff:ff:ff:ff:ff
inet 172.31.0.1/24 scope global br-300
valid_lft forever preferred_lft forever
[root@vtep01 ~]# ip a s ovnvrf300
18: ovnvrf300: <NOARP,MASTER,UP,LOWER_UP> mtu 65575 qdisc noqueue state
UP group default qlen 1000
link/ether c2:9d:fb:b7:74:6f brd ff:ff:ff:ff:ff:ff
[root@vtep01 ~]# ip a s vxlan300
23: vxlan300: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc noqueue
master br-300 state UNKNOWN group default qlen 1000
link/ether 2a:39:b8:a7:b6:80 brd ff:ff:ff:ff:ff:ff
inet6 fe80::2839:b8ff:fea7:b680/64 scope link
valid_lft forever preferred_lft forever
OVN has EVPN-configured edge LR and localnet-enabled LS with static
route "10.1.0.0/24" with IPv6 LLA nexthop and output LRP which leads to LR1.
LR1 has two LRPs: one to edge LR, another is a link to "workloads".
"workload" LS, which has 2 LSPs: one on gateway node, another on the
"workload" node.
OVN topology is as next:
switch b534bd4c-02bb-4428-a834-fbb21b59d79f (ls1)
port ls1-lr1
type: router
router-port: lr1-downlink
port lsp2
addresses: ["00:00:00:00:00:02 10.1.0.102"]
port lsp1
addresses: ["00:00:00:00:00:01 10.1.0.101"]
switch f03fa0e5-46a9-49b8-91b7-2e506977170c (test-ovn1-uplink)
port ln-node2
type: router
router-port: edge1-uplink2
port test-ovn1-uplink-lsp
type: localnet
addresses: ["unknown"]
port test-ovn1-edge1
type: router
router-port: edge1-uplink
router d322ecc0-c225-49f0-aa37-7c3003097714 (edge1)
port edge1-lr1
mac: "00:02:00:00:00:01"
ipv6-lla: "fe80::202:ff:fe00:1"
port edge1-uplink
mac: "0a:00:aa:21:e5:e0"
ipv6-lla: "fe80::800:aaff:fe21:e5e0"
networks: ["10.128.0.101/20"] <--- I'm not sure it is correct
gateway chassis: [8fdef43f-1bdb-4806-b2bd-bab918ee98f9]
router fab999fe-6ef7-478e-9b42-494cafe8f4b1 (lr1)
port lr1-downlink
mac: "00:03:00:00:00:01"
ipv6-lla: "fe80::203:ff:fe00:1"
networks: ["10.1.0.1/24"]
port lr1-edge1
mac: "00:02:00:00:00:02"
ipv6-lla: "fe80::202:ff:fe00:2"
# ovn-nbctl lr-route-list edge1
IPv4 Routes
Route Table <main>:
10.1.0.0/16 fe80::202:ff:fe00:2 dst-ip edge1-lr1
# ovn-nbctl lr-route-list lr1
IPv4 Routes
Route Table <main>:
0.0.0.0/0 fe80::202:ff:fe00:1 dst-ip lr1-edge1
# ovn-nbctl get logical-switch test-ovn1-uplink other_config
{dynamic-routing-advertise-ifname=lo-300,
dynamic-routing-bridge-ifname=br-300,
dynamic-routing-redistribute="fdb,ip", dynamic-routing-vni="300",
dynamic-routing-vxlan-ifname=vxlan300}
# ovn-nbctl get logical-router edge1 options
{dynamic-routing="true", dynamic-routing-redistribute=static,
dynamic-routing-vrf-id="300"}
# ovn-nbctl get logical-router-port edge1-uplink options
{dynamic-routing-maintain-vrf="true",
dynamic-routing-redistribute=connected}
So, if I start pinging from VTEP's VRF (from 172.31.0.0/24) to LSP1
(10.1.0.101), which is on the gateway node, it works fine.
On the OVN GW node the evpn commands have next output:
# ovn-appctl evpn/remote-vtep-list
IP: 10.128.0.5, port: 4789, vni: 300
# ovn-appctl evpn/vtep-arp-list
UUID: 7e3f9194-0699-4ed2-83c3-73b474c1b2b1, VNI: 300, MAC:
00:04:00:00:00:01, IP: 10.128.0.5, dp_key: 5
# ovn-appctl evpn/vtep-binding-list
UUID: 826cd9a5-d582-4a3a-85d9-2f6471c0afa6, Remote IP: 10.128.0.5, vni:
300, binding_key: 0x80000015, tunnel_ofport: 10, dp_key: 5
# ovn-appctl evpn/vtep-fdb-list
UUID: c44b7556-e8f9-4bce-9d8b-9c916b79d105, MAC: 00:04:00:00:00:01, vni:
300, binding_key: 0x80000015, dp_key: 5
# ovn-appctl evpn/vtep-multicast-group-list
UUID: 81f25768-6a40-497e-b48f-e17faa91e0e7, Remote IPs: 10.128.0.5, vni: 300
PROBLEM:
BUT, if I start pinging from VTEP node to LSP2 (10.1.0.102), it fails.
ICMP request goes from VTEP node to OVN GW node via VXLAN VNI300 (fine),
then OVN GW sends this traffic inside GENEVE to OVN w/l node and ICMP
request is seen on the VIF (lsp2).
ICMP response is sent from lsp2, but I see ARP request in the GENEVE -
OVN w/l node doesn't know br-300 MAC address on the VTEP node (which is
the dst MAC for ICMP response).
On then one hand that is expected - EVPN mac addresses are stored in the
ovn-controller runtime and not committed to OVN SB, so OVN w/l node
doesn't know which mac to use.
On the other hand, maybe I've lost some configuration hints and such
topology can work as well?
P.S. in ipv6 scenario, if I don't set 'networks' on the gateway LRP,
ovn-northd generated incorrect logical flow (example):
# ovn-sbctl dump-flows edge1 | grep 'null'
table=16(lr_in_ip_routing ), priority=514 , match=(reg7 == 0 &&
ip6.dst == 2002::/64), action=(ip.ttl--; reg8[0..15] = 0; reg0 =
10.128.0.5; reg5 = (null); eth.src = 0a:00:aa:21:e5:e0; outport =
"edge1-uplink"; flags.loopback = 1; reg9[9] = 1; next;)
So, I'm very concerned about which IP addresses should be used in GW LRP
'networks'? Why do we need them at all?
--
regards,
Vladislav Odintsov
_______________________________________________
dev mailing list
[email protected]
https://mail.openvswitch.org/mailman/listinfo/ovs-dev