<div dir="ltr"><div><div><div><div><div><div><div><div><div>Hi Mike,<br><br>after reviewing your latest patch [1], I  think that a possible solution could be to add a new entry in fdb RPC message.<br>This entry would specify whether the port is multi-bound or not.<br>The new fdb message would look like this : <br>{net_id:<br>  {port:<br>    {agent_ip:<br>      {mac, ip, <b>multi-bound</b>}<br>    }<br>  }<br></div>   network_type:<br></div>     vxlan,<br></div>   segment_id:<br></div>     id<br> }<br><br></div>When the multi-bound option would be set, the ARP responder would be provisioned but the underlying module (ovs or kernel vxlan) would be provisioned to flood the packet to every tunnel concerned by this overlay segment, and not only the tunnel to agent that is supposed to host the port.<br></div><div>In the LB world, this means not adding fdb entry for the MAC of the multi-bound port, whereas in the OVS world, it means not adding a flow that send  the trafic that matches the MAC of the multi-bound port to only one tunnel port, but to every tunnel port of this overlay segment.<br><br></div><div>This way, traffic to multi-bound port will behave as unknown unicast traffic. First packet will be flood to every tunnel and local bridge will learn the correct tunnel for the following packets based on which tunnel received the answer.<br></div>Once learning occurs with first ingress packet, following packets would be sent to the correct tunnel and not flooded anymore.<br><br></div>I've tested this with linuxbridge and it works fine. Based on code overview, this should work correctly with OVS too. I'll test it ASAP.<br><br></div>I know that DVR team already add such a flag in RPC messages, but they revert it in later patches. I would be very interested in having their opinion on this proposal.<br></div>It seems that DVR port could also use this flag. This would result in having ARP responder activated for DVR port too.<br><div><div><div><div><div><div><div><div><div><div><div><br></div><div>This shouldn't need a bump in RPC versioning since this flag would be optionnal. So their shouldn't have any issue with backward compatibility.<br><br></div><div>Regards,<br><br></div><div>Mathieu<br><br>[1]<a href="https://review.openstack.org/#/c/141114/2">https://review.openstack.org/#/c/141114/2</a><br></div></div></div></div></div></div></div></div></div></div></div></div><div class="gmail_extra"><br><div class="gmail_quote">On Sun, Dec 21, 2014 at 12:14 PM, Narasimhan, Vivekanandan <span dir="ltr"><<a href="mailto:vivekanandan.narasimhan@hp.com" target="_blank">vivekanandan.narasimhan@hp.com</a>></span> wrote:<br><blockquote class="gmail_quote" style="margin:0 0 0 .8ex;border-left:1px #ccc solid;padding-left:1ex">Hi Mike,<br>
<br>
Just one comment [Vivek]<br>
<span class=""><br>
-----Original Message-----<br>
From: Mike Kolesnik [mailto:<a href="mailto:mkolesni@redhat.com">mkolesni@redhat.com</a>]<br>
</span><span class="">Sent: Sunday, December 21, 2014 11:17 AM<br>
To: OpenStack Development Mailing List (not for usage questions)<br>
</span><span class="">Cc: Robert Kukura<br>
Subject: Re: [openstack-dev] [Neutron][L2Pop][HA Routers] Request for comments for a possible solution<br>
<br>
</span><div><div class="h5">Hi Mathieu,<br>
<br>
Comments inline<br>
<br>
Regards,<br>
Mike<br>
<br>
----- Original Message -----<br>
> Mike,<br>
><br>
> I'm not even sure that your solution works without being able to bind<br>
> a router HA port to several hosts.<br>
> What's happening currently is that you :<br>
><br>
> 1.create the router on two l3agent.<br>
> 2. those l3agent trigger the sync_router() on the l3plugin.<br>
> 3. l3plugin.sync_routers() will trigger l2plugin.update_port(host=l3agent).<br>
> 4. ML2 will bind the port to the host mentioned in the last update_port().<br>
><br>
> From a l2pop perspective, this will result in creating only one tunnel<br>
> to the host lastly specified.<br>
> I can't find any code that forces that only the master router binds<br>
> its router port. So we don't even know if the host which binds the<br>
> router port is hosting the master router or the slave one, and so if<br>
> l2pop is creating the tunnel to the master or to the slave.<br>
><br>
> Can you confirm that the above sequence is correct? or am I missing<br>
> something?<br>
<br>
Are you referring to the alternative solution?<br>
<br>
In that case it seems that you're correct so that there would need to be awareness of the master router at some level there as well.<br>
I can't say for sure as I've been thinking on the proposed solution with no FDBs so there would be some issues with the alternative that need to be ironed out.<br>
<br>
><br>
> Without the capacity to bind a port to several hosts, l2pop won't be<br>
> able to create tunnel correctly, that's the reason why I was saying<br>
> that a prerequisite for a smart solution would be to first fix the bug<br>
> :<br>
> <a href="https://bugs.launchpad.net/neutron/+bug/1367391" target="_blank">https://bugs.launchpad.net/neutron/+bug/1367391</a><br>
><br>
> DVR Had the same issue. Their workaround was to create a new<br>
> port_binding tables, that manages the capacity for one DVR port to be<br>
> bound to several host.<br>
> As mentioned in the bug 1367391, this adding a technical debt in ML2,<br>
> which has to be tackle down in priority from my POV.<br>
<br>
I agree that this would simplify work but even without this bug fixed we can achieve either solution.<br>
<br>
We have already knowledge of the agents hosting a router so this is completely doable without waiting for fix for bug 1367391.<br>
<br>
Also from my understanding the bug 1367391 is targeted at DVR only, not at HA router ports.<br>
<br>
</div></div>[Vivek]  Currently yes, but Bob's concept embraces all replicated ports and so HA router ports will play into it :)<br>
<br>
--<br>
Thanks,<br>
<br>
Vivek<br>
<div class="HOEnZb"><div class="h5"><br>
<br>
><br>
><br>
> On Thu, Dec 18, 2014 at 6:28 PM, Mike Kolesnik <<a href="mailto:mkolesni@redhat.com">mkolesni@redhat.com</a>> wrote:<br>
> > Hi Mathieu,<br>
> ><br>
> > Thanks for the quick reply, some comments inline..<br>
> ><br>
> > Regards,<br>
> > Mike<br>
> ><br>
> > ----- Original Message -----<br>
> >> Hi mike,<br>
> >><br>
> >> thanks for working on this bug :<br>
> >><br>
> >> On Thu, Dec 18, 2014 at 1:47 PM, Gary Kotton <<a href="mailto:gkotton@vmware.com">gkotton@vmware.com</a>> wrote:<br>
> >> ><br>
> >> ><br>
> >> > On 12/18/14, 2:06 PM, "Mike Kolesnik" <<a href="mailto:mkolesni@redhat.com">mkolesni@redhat.com</a>> wrote:<br>
> >> ><br>
> >> >>Hi Neutron community members.<br>
> >> >><br>
> >> >>I wanted to query the community about a proposal of how to fix HA<br>
> >> >>routers not working with L2Population (bug 1365476[1]).<br>
> >> >>This bug is important to fix especially if we want to have HA<br>
> >> >>routers and DVR routers working together.<br>
> >> >><br>
> >> >>[1] <a href="https://bugs.launchpad.net/neutron/+bug/1365476" target="_blank">https://bugs.launchpad.net/neutron/+bug/1365476</a><br>
> >> >><br>
> >> >>What's happening now?<br>
> >> >>* HA routers use distributed ports, i.e. the port with the same<br>
> >> >>IP & MAC<br>
> >> >>  details is applied on all nodes where an L3 agent is hosting<br>
> >> >>this router.<br>
> >> >>* Currently, the port details have a binding pointing to an<br>
> >> >>arbitrary node<br>
> >> >>  and this is not updated.<br>
> >> >>* L2pop takes this "potentially stale" information and uses it to<br>
> >> >>create:<br>
> >> >>  1. A tunnel to the node.<br>
> >> >>  2. An FDB entry that directs traffic for that port to that node.<br>
> >> >>  3. If ARP responder is on, ARP requests will not traverse the network.<br>
> >> >>* Problem is, the master router wouldn't necessarily be running<br>
> >> >>on the<br>
> >> >>  reported agent.<br>
> >> >>  This means that traffic would not reach the master node but<br>
> >> >>some arbitrary<br>
> >> >>  node where the router master might be running, but might be in<br>
> >> >>another<br>
> >> >>  state (standby, fail).<br>
> >> >><br>
> >> >>What is proposed?<br>
> >> >>Basically the idea is not to do L2Pop for HA router ports that<br>
> >> >>reside on the tenant network.<br>
> >> >>Instead, we would create a tunnel to each node hosting the HA<br>
> >> >>router so that the normal learning switch functionality would<br>
> >> >>take care of switching the traffic to the master router.<br>
> >> ><br>
> >> > In Neutron we just ensure that the MAC address is unique per network.<br>
> >> > Could a duplicate MAC address cause problems here?<br>
> >><br>
> >> gary, AFAIU, from a Neutron POV, there is only one port, which is<br>
> >> the router Port, which is plugged twice. One time per port.<br>
> >> I think that the capacity to bind a port to several host is also a<br>
> >> prerequisite for a clean solution here. This will be provided by<br>
> >> patches to this bug :<br>
> >> <a href="https://bugs.launchpad.net/neutron/+bug/1367391" target="_blank">https://bugs.launchpad.net/neutron/+bug/1367391</a><br>
> >><br>
> >><br>
> >> >>This way no matter where the master router is currently running,<br>
> >> >>the data plane would know how to forward traffic to it.<br>
> >> >>This solution requires changes on the controller only.<br>
> >> >><br>
> >> >>What's to gain?<br>
> >> >>* Data plane only solution, independent of the control plane.<br>
> >> >>* Lowest failover time (same as HA routers today).<br>
> >> >>* High backport potential:<br>
> >> >>  * No APIs changed/added.<br>
> >> >>  * No configuration changes.<br>
> >> >>  * No DB changes.<br>
> >> >>  * Changes localized to a single file and limited in scope.<br>
> >> >><br>
> >> >>What's the alternative?<br>
> >> >>An alternative solution would be to have the controller update<br>
> >> >>the port binding on the single port so that the plain old L2Pop<br>
> >> >>happens and notifies about the location of the master router.<br>
> >> >>This basically negates all the benefits of the proposed solution,<br>
> >> >>but is wider.<br>
> >> >>This solution depends on the report-ha-router-master spec which<br>
> >> >>is currently in the implementation phase.<br>
> >> >><br>
> >> >>It's important to note that these two solutions don't collide and<br>
> >> >>could be done independently. The one I'm proposing just makes<br>
> >> >>more sense from an HA viewpoint because of it's benefits which<br>
> >> >>fit the HA methodology of being fast & having as little outside<br>
> >> >>dependency as possible.<br>
> >> >>It could be done as an initial solution which solves the bug for<br>
> >> >>mechanism drivers that support normal learning switch (OVS), and<br>
> >> >>later kept as an optimization to the more general, controller<br>
> >> >>based, solution which will solve the issue for any mechanism<br>
> >> >>driver working with L2Pop (Linux Bridge, possibly others).<br>
> >> >><br>
> >> >>Would love to hear your thoughts on the subject.<br>
> >><br>
> >> You will have to clearly update the doc to mention that deployment<br>
> >> with Linuxbridge+l2pop are not compatible with HA.<br>
> ><br>
> > Yes this should be added and this is already the situation right now.<br>
> > However if anyone would like to work on a LB fix (the general one or<br>
> > some specific one) I would gladly help with reviewing it.<br>
> ><br>
> >><br>
> >> Moreover, this solution is downgrading the l2pop solution, by<br>
> >> disabling the ARP-responder when VMs want to talk to a HA router.<br>
> >> This means that ARP requests will be duplicated to every overlay<br>
> >> tunnel to feed the OVS Mac learning table.<br>
> >> This is something that we were trying to avoid with l2pop. But may<br>
> >> be this is acceptable.<br>
> ><br>
> > Yes basically you're correct, however this would be only limited to<br>
> > those tunnels that connect to the nodes where the HA router is<br>
> > hosted, so we would still limit the amount of traffic that is sent across the underlay.<br>
> ><br>
> > Also bear in mind that ARP is actually good (at least in OVS case)<br>
> > since it helps the VM locate on which tunnel the master is, so once<br>
> > it receives the ARP response it records a flow that directs the<br>
> > traffic to the correct tunnel, so we just get hit by the one ARP<br>
> > broadcast but it's sort of a necessary evil in order to locate the master..<br>
> ><br>
> >><br>
> >> I know that ofagent is also using l2pop, I would like to know if<br>
> >> ofagent deployment will be compatible with the workaround that you<br>
> >> are proposing.<br>
> ><br>
> > I would like to know that too, hopefully someone from OFagent can<br>
> > shed some light.<br>
> ><br>
> >><br>
> >> My concern is that, with DVR, there are at least two major features<br>
> >> that are not compatible with Linuxbridge.<br>
> >> Linuxbridge is not running in the gate. I don't know if anybody is<br>
> >> running a 3rd party testing with Linuxbridge deployments. If<br>
> >> anybody does, it would be great to have it voting on gerrit!<br>
> >><br>
> >> But I really wonder what is the future of linuxbridge compatibility?<br>
> >> should we keep on improving OVS solution without taking into<br>
> >> account the linuxbridge implementation?<br>
> ><br>
> > I don't know actually, but my capability is to fix it for OVS the<br>
> > best way possible.<br>
> > As I said the situation for LB won't become worse than it already<br>
> > is, legacy routers would till function as always.. This fix also<br>
> > will not block fixing LB in any other way since it can be easily<br>
> > adjusted (if<br>
> > necessary) to work only for supporting mechanisms (OVS AFAIK).<br>
> ><br>
> > Also if anyone is willing to pick up the glove and implement the<br>
> > general controller based fix, or something more focused on LB I will<br>
> > happily help review what I can.<br>
> ><br>
> >><br>
> >> Regards,<br>
> >><br>
> >> Mathieu<br>
> >><br>
> >> >><br>
> >> >>Regards,<br>
> >> >>Mike<br>
> >> >><br>
> >> >>_______________________________________________<br>
> >> >>OpenStack-dev mailing list<br>
> >> >><a href="mailto:OpenStack-dev@lists.openstack.org">OpenStack-dev@lists.openstack.org</a><br>
> >> >><a href="http://lists.openstack.org/cgi-bin/mailman/listinfo/openstack-dev" target="_blank">http://lists.openstack.org/cgi-bin/mailman/listinfo/openstack-dev</a><br>
> >> ><br>
> >> ><br>
> >> > _______________________________________________<br>
> >> > OpenStack-dev mailing list<br>
> >> > <a href="mailto:OpenStack-dev@lists.openstack.org">OpenStack-dev@lists.openstack.org</a><br>
> >> > <a href="http://lists.openstack.org/cgi-bin/mailman/listinfo/openstack-dev" target="_blank">http://lists.openstack.org/cgi-bin/mailman/listinfo/openstack-dev</a><br>
> >><br>
> >> _______________________________________________<br>
> >> OpenStack-dev mailing list<br>
> >> <a href="mailto:OpenStack-dev@lists.openstack.org">OpenStack-dev@lists.openstack.org</a><br>
> >> <a href="http://lists.openstack.org/cgi-bin/mailman/listinfo/openstack-dev" target="_blank">http://lists.openstack.org/cgi-bin/mailman/listinfo/openstack-dev</a><br>
> >><br>
> ><br>
> > _______________________________________________<br>
> > OpenStack-dev mailing list<br>
> > <a href="mailto:OpenStack-dev@lists.openstack.org">OpenStack-dev@lists.openstack.org</a><br>
> > <a href="http://lists.openstack.org/cgi-bin/mailman/listinfo/openstack-dev" target="_blank">http://lists.openstack.org/cgi-bin/mailman/listinfo/openstack-dev</a><br>
><br>
> _______________________________________________<br>
> OpenStack-dev mailing list<br>
> <a href="mailto:OpenStack-dev@lists.openstack.org">OpenStack-dev@lists.openstack.org</a><br>
> <a href="http://lists.openstack.org/cgi-bin/mailman/listinfo/openstack-dev" target="_blank">http://lists.openstack.org/cgi-bin/mailman/listinfo/openstack-dev</a><br>
><br>
<br>
_______________________________________________<br>
OpenStack-dev mailing list<br>
<a href="mailto:OpenStack-dev@lists.openstack.org">OpenStack-dev@lists.openstack.org</a><br>
<a href="http://lists.openstack.org/cgi-bin/mailman/listinfo/openstack-dev" target="_blank">http://lists.openstack.org/cgi-bin/mailman/listinfo/openstack-dev</a><br>
<br>
_______________________________________________<br>
OpenStack-dev mailing list<br>
<a href="mailto:OpenStack-dev@lists.openstack.org">OpenStack-dev@lists.openstack.org</a><br>
<a href="http://lists.openstack.org/cgi-bin/mailman/listinfo/openstack-dev" target="_blank">http://lists.openstack.org/cgi-bin/mailman/listinfo/openstack-dev</a><br>
</div></div></blockquote></div><br></div>