Merge "BGPaaS enhancements"
This commit is contained in:
commit
e3c7a586d4
818
specs/xena/bgpaas-enhancements.rst
Normal file
818
specs/xena/bgpaas-enhancements.rst
Normal file
@ -0,0 +1,818 @@
|
|||||||
|
..
|
||||||
|
This work is licensed under a Creative Commons Attribution 3.0 Unported
|
||||||
|
License.
|
||||||
|
|
||||||
|
http://creativecommons.org/licenses/by/3.0/legalcode
|
||||||
|
|
||||||
|
=============================
|
||||||
|
Enhancement to Neutron BGPaaS
|
||||||
|
=============================
|
||||||
|
|
||||||
|
https://bugs.launchpad.net/neutron/+bug/1921461
|
||||||
|
|
||||||
|
Enhancement to Neutron BGPaaS to directly support Neutron Routers and
|
||||||
|
bgp-peering from such routers over internal & external Neutron Networks
|
||||||
|
|
||||||
|
Problem Description
|
||||||
|
===================
|
||||||
|
|
||||||
|
There are very good foundation APIs in Neutron BGPaaS that brought in BGP
|
||||||
|
service functionality (see [1]_) into Neutron through Neutron Dynamic Routing.
|
||||||
|
(see [3]_ )
|
||||||
|
|
||||||
|
.. note::
|
||||||
|
|
||||||
|
In this spec, Neutron-BGPaaS, BGPaaS and neutron-dynamic-routing/bgp are
|
||||||
|
used as synonymns. These refers to "Neutron Dynamic Routing using BGPaaS"
|
||||||
|
function already available in Neutron. Similarly, 'ISP network' and
|
||||||
|
'Neutron External Network' are used as synonymns.
|
||||||
|
|
||||||
|
In a Telco Service Provider environment, VNFs (Virtual Network Functions [4]_)
|
||||||
|
& CNFs (Containerized-Network-Functions) are run that provides simple-to-fairly
|
||||||
|
complex services to subscribers. These VNFs use many Non-Neutron IP-Addresses
|
||||||
|
which need to be exposed to subscribers. The subscribers access these services
|
||||||
|
through these Non-Neutron IP-Addresses, referred as 'Service-Address'. It can
|
||||||
|
belong to either IPv4 (or) IPv6 address-families.
|
||||||
|
|
||||||
|
Service-Address are wholly managed inside a VNF transparent to Neutron. But
|
||||||
|
these Service-Address are reachable on the dataplane by subscribers, through
|
||||||
|
VNICs (or Ports) holding Neutron-managed Addresses. In short, the Neutron
|
||||||
|
managed primary-addresses on VNFs VNICs act as NextHops to the Service-Address
|
||||||
|
of VNF.
|
||||||
|
|
||||||
|
In order to enable L3 reachability to these Service-Addresses from an
|
||||||
|
ISP-network (or) make the Service-addresses reachable from another
|
||||||
|
neutron-tenant-network entity, these Service-Addresses need to be brought into
|
||||||
|
a Neutron Router's Routing Table.
|
||||||
|
|
||||||
|
The number of VNFs are high and hence the number of service addresses to be
|
||||||
|
exposed are higher. "BGP between the VNFs and their hosting Neutron Routers"
|
||||||
|
provides a very elegant and scalable automated approach for a control-plane
|
||||||
|
driven route-learning of Service-Address by the Neutron Router from the VNFs.
|
||||||
|
This enables L3 reachability of such Service-Addresses from other
|
||||||
|
neutron-tenant-network-VNFs that is attached to the same Neutron Router.
|
||||||
|
|
||||||
|
These service addresses also need to be advertised to the ISP-PE-Router. This
|
||||||
|
will enable subscribers present on ISP-network be able to use the services
|
||||||
|
exported by applications in the VNFs.
|
||||||
|
|
||||||
|
The existing Neutron Dynamic BGPaaS falls a little short of supporting the
|
||||||
|
above requirements due to below reasons:
|
||||||
|
|
||||||
|
* Existing BGPaaS lacks the functionality (both API and implementations) to do
|
||||||
|
BGP Peering over Neutron Internal Networks. The addition of service-addresses
|
||||||
|
to Neutron Router's Routing Table requires BGP control plane to bring them in
|
||||||
|
via BGP peering (see [2]_) towards the VNFs over Neutron Tenant Networks from
|
||||||
|
Neutron Router. It also requires BGP speaker to learn routes from the BGP
|
||||||
|
peers. Current implementation advertises routes to peers but doesn't learn
|
||||||
|
from peers.
|
||||||
|
* Existing Neutron BGPaaS supports BGP Peering only over Non-Neutron Networks.
|
||||||
|
Please refer the current implementation and documentation as in [8]_ .
|
||||||
|
Advertisment of service-addresses to the ISP-PE-Router requires BGP Peering
|
||||||
|
over Neutron External Networks. This will enable the ISP-PE-Router to learn
|
||||||
|
the Service-Addresses over the BGP control plane. Thereby, enabling
|
||||||
|
L3-reachability for subscribers on the ISP-side to be able to take advantage
|
||||||
|
of services offered by VNFs (and CNFs).
|
||||||
|
* Exising BGPaaS doesn't provide API/implementation to associate a BGP speaker
|
||||||
|
to a router. It currently supports a'loose-association'of network to BGP
|
||||||
|
speaker. This 'loose-association' is concept where the BGP speaker derives
|
||||||
|
the routes of the Neutron Router through APIs and not due to direct
|
||||||
|
connectivity of BGP Speaker to the Neutron Router. Association of BGP speaker
|
||||||
|
to router enables access to all the neutron-router-interfaces ie. both
|
||||||
|
internal/external interfaces. This will enable a single bgpspeaker associated
|
||||||
|
with the Neutron Router, be able to peer simultaneously towards VNFs on
|
||||||
|
neutron-tenant-network as well as the ISP-PE-Router on
|
||||||
|
neutron-external-network.
|
||||||
|
* It also doesn't support BGP peer group feature. BGP Peer Group feature
|
||||||
|
enables automatic-bgp-peering towards VNFs by Neutron Router whenever the
|
||||||
|
VNFs are scaled-out in a VNF cluster or whenever the VNFs are scaled in from
|
||||||
|
a VNF cluster. The automatic-bgp-peering refers to the fact that the current
|
||||||
|
BGP Speaker will be enhanced to automatically accept peering-requests from
|
||||||
|
VNF if the VNFs are within a pre-configured ip-address-range (aka
|
||||||
|
listen-range) that openstack tenant can configure for the BGP speaker.
|
||||||
|
* BGPaaS capability will have varying implementations from different Neutron
|
||||||
|
backends. This makes it important to have some feedback ingrained in the
|
||||||
|
Neutron BGPaaS API. It will allow various Neutron backends (including
|
||||||
|
reference BGPaaS backend) to drive realization status inside Openstack Infra
|
||||||
|
for the BGP resources exposed by Neutron BGPaaS. To provide that, the
|
||||||
|
proposal in the spec is to add a new resource type 'Association' that can
|
||||||
|
work with current BGPSpeaker object. More specifically, the plan is to
|
||||||
|
support router_association, peer_association as resources under a BGPSpeaker
|
||||||
|
object. A ``router_association`` resource will be used to create a binding
|
||||||
|
between a BGPSpeaker and a Neutron Router, that will internally realizes BGP
|
||||||
|
Control Plane over that Neutron Router. Similarly, a ``peer_association``
|
||||||
|
resource will be used to create a binding between a BGPSpeaker and a BGPPeer
|
||||||
|
that will internally realize BGP Peering between the BGPSpeaker and the
|
||||||
|
BGPPeer resource.
|
||||||
|
|
||||||
|
Proposed Change
|
||||||
|
================
|
||||||
|
|
||||||
|
To enable L3 reachability to the Service-Addresses from ISP-network or from
|
||||||
|
another-neutron-tenant-network entity, the below usecases are introduced :
|
||||||
|
|
||||||
|
#. ``Enable direct BGP-Peering (see [2]_) from a Neutron Router towards the
|
||||||
|
VNFs (or CNFs) on its connected networks.`` This provides L3 reachability to
|
||||||
|
the service-addresses hosted on such VNFs, as such addresses will be
|
||||||
|
installed in the Neutron Router's routing-table by the BGPaaS control
|
||||||
|
plane. The proposal is to provide facility to directly associate a BGP
|
||||||
|
Speaker to a neutron-router, that will in turn enable the router to reach
|
||||||
|
BGP-Control plane learned routes from the VNF.. A single router can be
|
||||||
|
associated to a BGP speaker and the speaker will be running inside the L3
|
||||||
|
router namespace.
|
||||||
|
#. ``Enable BGP-Peering over Neutron External Networks from a Neutron Router to
|
||||||
|
the ISP-PE-Router.`` This allows the ISP-PE-Router to learn the
|
||||||
|
Service-Addresses over the BGP control plane from Neutron Router. Thereby,
|
||||||
|
enabling L3-reachability for subscribers on the ISP-side to leverage
|
||||||
|
services offered by VNFs (and CNFs).
|
||||||
|
#. ``Support BGP peer group feature`` This will allow to transparently scale
|
||||||
|
bgp peering to a number of VNFs, whenever VNF clusters are scaled-out or
|
||||||
|
scaled-in. It supports BGP peering to a group of remote neighbors that are
|
||||||
|
configured using a range of IP addresses. This can also be used in k8s over
|
||||||
|
openstack deployment where CNF scale-out/scale-in is a pure k8s operation.
|
||||||
|
It would be undesirable to call neutron APIs in this case.
|
||||||
|
|
||||||
|
New resources (Network Association, Router Association, Peer Association) will
|
||||||
|
be added as part of this spec. Association resources provides the below
|
||||||
|
benefits
|
||||||
|
|
||||||
|
* Enables provisioning of certain BGP control plane parameters specific to
|
||||||
|
BGP-Speaker-to-BGP-Peer binding and also specific to BGP-Speaker-to-Router
|
||||||
|
binding. For eg: some attributes (status, advertise-extra-routes etc) are
|
||||||
|
useful when linked to associations rather than directly to parent resources
|
||||||
|
(speaker, peer). A BGP Peer can be associated to different BGP Speakers, so
|
||||||
|
having a Status field in bgp-peer won’t be beneficial. It is useful only
|
||||||
|
when associated to Peer Association resource.
|
||||||
|
* Enables the Neutron BGPaaS APIs to provide feedback on the realization
|
||||||
|
status of BGP Control Plane towards Openstack Tenant. For eg: In this spec,
|
||||||
|
a new Status field is planned to be introduced. This will allow a
|
||||||
|
Neutron-BGPaaS backend driver to provide realization-status for different
|
||||||
|
BGP resources inside Openstack Infra.
|
||||||
|
|
||||||
|
::
|
||||||
|
|
||||||
|
+-----------------------------------------------+
|
||||||
|
| |
|
||||||
|
| ISP- PE Router |---------|
|
||||||
|
| | |
|
||||||
|
+-----------------------------------------------+ EBGP
|
||||||
|
| |
|
||||||
|
| |
|
||||||
|
+-----------------------------------------------+ |
|
||||||
|
| |---------|
|
||||||
|
| Neutron Router |
|
||||||
|
| |---------|
|
||||||
|
+-----------------------------------------------+ |
|
||||||
|
| |
|
||||||
|
| EBGP
|
||||||
|
+-----------------------------------------------+ |
|
||||||
|
| VNF Cluster | |
|
||||||
|
| +-----------------+ +-----------------+ |---------|
|
||||||
|
| | VM1 | | VM2 | |
|
||||||
|
| +-----------------+ +-----------------+ |
|
||||||
|
+-----------------------------------------------+
|
||||||
|
|
||||||
|
To advertise the multiple service addresses hosted by VNFs to ISP-PE routers,
|
||||||
|
2 BGP sessions are created. One BGP session created directly towards the VNFs
|
||||||
|
from a Neutron Router hosting the neutron-tenant-networks of the VNF. And the
|
||||||
|
next BGP-Peering towards the ISP-PE-Routers from Neutron Router directly over
|
||||||
|
the Neutron External Networks.
|
||||||
|
|
||||||
|
Proposal is to enhance existing BGPaas (see [6]_), allow neutron router to be
|
||||||
|
associated to a BGP Speaker and allow BGP Speaker to peer with both the
|
||||||
|
internal-Networks and External-Networks present on that Neutron Router. This
|
||||||
|
will be implemented using enhancements to the neutron-service and
|
||||||
|
neutron-dynamic-routing.
|
||||||
|
|
||||||
|
Implementation approaches
|
||||||
|
-------------------------
|
||||||
|
|
||||||
|
Option 1
|
||||||
|
~~~~~~~~
|
||||||
|
|
||||||
|
A BGP speaker is spawned inside router namespace, when a neutron-router is
|
||||||
|
associated to BGP Speaker. BGP speaker will be running inside the L3 router
|
||||||
|
namespace which enables access to all the neutron-router-interfaces ie. both
|
||||||
|
internal/external interfaces. BGP functionality provided by OS-Ken will be
|
||||||
|
reused to excite BGP speaker functionality to run only within the neutron
|
||||||
|
router namespace.
|
||||||
|
|
||||||
|
``BGP Service Plugin`` will be enhanced to accept the request to associate a
|
||||||
|
BGP speaker to the router. ``BGP L3 agent extension`` will implement the L3
|
||||||
|
agent side of BGP enhancements. It will be responsible for realizing
|
||||||
|
bgpspeaker inside the router-namespace and now bgpspeaker can peer over
|
||||||
|
networks on the router from inside the router-namespace. BGP speaker can
|
||||||
|
listen on 0.0.0.0:179 which enables it to listen on all the
|
||||||
|
neutron-router-interfaces and can peer with the neighbour based on the
|
||||||
|
configuration.
|
||||||
|
|
||||||
|
::
|
||||||
|
|
||||||
|
+---------------+ +-----------------------------------+
|
||||||
|
|DHCP namespace | |Router namespace |
|
||||||
|
| qdhcp | | qrouter |
|
||||||
|
| +------+ | | +---+ +---+ +-----------+ |
|
||||||
|
| | tap | | | | qr| | qg| |BGP Speaker| |
|
||||||
|
| +------+ | | +---+ +---+ +-----------+ |
|
||||||
|
| | | | | | |
|
||||||
|
+---------------+ +-----------------------------------+
|
||||||
|
| | |
|
||||||
|
+--------------------------------------------------------------+
|
||||||
|
| | | | |
|
||||||
|
| +--------+ +-------+ +-------+ |
|
||||||
|
| |Port tap| |Port qr| |Port qg| |
|
||||||
|
| +--------+ +-------+ +-------+ |
|
||||||
|
| br-int |
|
||||||
|
+--------------------------------------------------------------+
|
||||||
|
|
||||||
|
|
||||||
|
Option 2
|
||||||
|
~~~~~~~~
|
||||||
|
|
||||||
|
In Option 1, since BGP speaker is spawned inside the router namespace, the
|
||||||
|
speaker is tightly coupled with that router namespace. For a different BGP
|
||||||
|
Speaker on a different router, wherein that router in turn is realized on the
|
||||||
|
same network-node hosting the original router, a new instantiation of the BGP
|
||||||
|
Speaker is required. This could potentially bring in scalability and
|
||||||
|
performance problems with Option 1.
|
||||||
|
|
||||||
|
In Option 2, the proposal is to create and use VRF for BGP-Peering. VRF device
|
||||||
|
(see [9]_) can be used instead of namespace for BGP peering. VRF is a layer 3
|
||||||
|
master network device with its own associated routing table. It also provides
|
||||||
|
added benefit of ``VRF any`` socket which allows a single process instance to
|
||||||
|
efficiently provide service across all VRFs. So for N router associated BGP
|
||||||
|
speakers, N vrfs will be created but a single BGP speaker will serve all of
|
||||||
|
them.
|
||||||
|
|
||||||
|
::
|
||||||
|
|
||||||
|
+---------------+ +-----------------+ +-----------------+
|
||||||
|
|DHCP namespace | |Router namespace | | VRF device | +-------+
|
||||||
|
| qdhcp | | qrouter | | | | BGP |
|
||||||
|
| +------+ | | +---+ +---+ | | +---+ +---+ |N---1|speaker|
|
||||||
|
| | tap | | | | qr| | qg| | | | vr| | vg| | +-------+
|
||||||
|
| +------+ | | +---+ +---+ | | +---+ +---+ |
|
||||||
|
| | | | | | | | | | |
|
||||||
|
+-------------- + +-----------------+ +-----------------+
|
||||||
|
| | | | | |
|
||||||
|
+-----------------------------------------------------------------+
|
||||||
|
| | | | | | |
|
||||||
|
| +--------+ +-------+ +-------+ +-------+ +-------+ |
|
||||||
|
| |Port tap| |Port qr| |Port qg| |Port vr| |Port vg| |
|
||||||
|
| +--------+ +-------+ +-------+ +-------+ +-------+ |
|
||||||
|
| |
|
||||||
|
| br-int |
|
||||||
|
+-----------------------------------------------------------------+
|
||||||
|
|
||||||
|
Current L3Plugin and L3Agent will continue to provide Neutron-Router
|
||||||
|
functionality. VRF will be realized by BGP-Dr-Agent and a new VRF is created
|
||||||
|
when a neutron-router is associated to BGP Speaker. VRF will be used only for
|
||||||
|
BGP peering and the learnt routes are installed inside router namespace.
|
||||||
|
|
||||||
|
Extra IPs has to be allocated from internal and external subnet pools for the
|
||||||
|
vr, vg interfaces respectively. These IPs will be used for BGP peering and
|
||||||
|
the allocation of new IPs can be considered as a short coming with this
|
||||||
|
option.
|
||||||
|
|
||||||
|
Option 3
|
||||||
|
~~~~~~~~
|
||||||
|
|
||||||
|
VRF device can provide most of the L3 functionalities provided by router
|
||||||
|
namespace. In this option, the idea is to completely replace the namespace
|
||||||
|
with VRF device. A new VRF will be created when a neutron-router is created.
|
||||||
|
|
||||||
|
Both L3-Routing as well as BGP can be realized through VRFs. Linux-VRF will
|
||||||
|
provide neutron router functionality which includes dataplane L3-forwarding
|
||||||
|
for east-west, north-south and NATing.
|
||||||
|
|
||||||
|
This provides the same advantages as in option 2 and eliminates its
|
||||||
|
disadvantages. But the main concern with this approach is that it will make a
|
||||||
|
huge deviation from the existing L3 implementation which will require a lot
|
||||||
|
of effort and time. This also requires changes to upgrade mechanisms.
|
||||||
|
|
||||||
|
.. note::
|
||||||
|
|
||||||
|
The current plan is to implement Option 1 which is simpler and doesn't
|
||||||
|
deviate much from the existing implementation. Incase the implementation
|
||||||
|
option 3 is going to be used, it will be only a gradual replacement (from
|
||||||
|
namespace to vrf) with proper upgrade path.
|
||||||
|
|
||||||
|
HA-Capable Neutron Router with BGPaaS
|
||||||
|
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
|
||||||
|
When HA-Capable neutron router is associated to a BGPSpeaker, two BGPSpeaker
|
||||||
|
instances will be run, one on active router namespace and other on the standby
|
||||||
|
router namespace. Whenever the failover happens from Active to Standby
|
||||||
|
Namespace, the BGPSpeaker on Standby will be able to peer with BGP-Peers and
|
||||||
|
become an Active-BGP-Speaker managing the Router.
|
||||||
|
|
||||||
|
The implementation planned in this spec supports only Centralized Neutron
|
||||||
|
Routers (both HA and non-HA) and not Distributed Routers.
|
||||||
|
|
||||||
|
REST API & Neutron client command Impact
|
||||||
|
----------------------------------------
|
||||||
|
|
||||||
|
Use-case a)
|
||||||
|
|
||||||
|
Associate neutron router to BGP Speaker API
|
||||||
|
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
|
||||||
|
::
|
||||||
|
|
||||||
|
POST /v2.0/bgp-speakers/<bgp-speaker-id>/router_associations
|
||||||
|
|
||||||
|
{
|
||||||
|
"router_association":
|
||||||
|
{
|
||||||
|
"router_id": "c930d7f6-ceb7-40a0-8b81-a425dd994ccf",
|
||||||
|
"advertise_extra_routes": True
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
* ``router_id`` represents the UUID of the neutron router to which the BGP
|
||||||
|
speaker has to be associated.
|
||||||
|
* ``advertise_extra_routes`` decides whether neutron extra routes on the
|
||||||
|
neutron router will be redistributed to bgp-peers by the bgpspeaker. Default
|
||||||
|
is ``True`` and so all neutron extra routes will be redistributed to every
|
||||||
|
bgp-peer that is bound to the BGP Speaker. Turning OFF
|
||||||
|
advertise_extra_routes will disable advertisement of neutron router’s
|
||||||
|
extra-routes by the bgpspeaker.
|
||||||
|
|
||||||
|
.. note::
|
||||||
|
|
||||||
|
The enhancement will support a router to be associated to only a single
|
||||||
|
BGP speaker. The association of router to speaker and network to speaker
|
||||||
|
will be a mutually exclusive operation.
|
||||||
|
|
||||||
|
New neutron Client Command::
|
||||||
|
|
||||||
|
openstack bgp speaker router association create
|
||||||
|
[--advertise-extra-routes]
|
||||||
|
[--no-advertise-extra-routes]
|
||||||
|
<bgpspeaker>
|
||||||
|
<router>
|
||||||
|
|
||||||
|
Disassociate neutron router from BGP Speaker API
|
||||||
|
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
|
||||||
|
::
|
||||||
|
|
||||||
|
DELETE /v2.0/bgp-speakers/<bgp-speaker-id>/router_associations/<router
|
||||||
|
-association-uuid>
|
||||||
|
|
||||||
|
New neutron Client Command::
|
||||||
|
|
||||||
|
openstack bgp speaker router association delete
|
||||||
|
<bgpspeaker>
|
||||||
|
<router>
|
||||||
|
|
||||||
|
.. note::
|
||||||
|
|
||||||
|
Deleting a BGP SPeaker will not be permitted, if the speaker already has
|
||||||
|
multiple associations on itself like peer-associations and
|
||||||
|
router-associations. Similarly, deletion of a router that is asoociated
|
||||||
|
to a BGP speaker is also not allowed.
|
||||||
|
|
||||||
|
Update BGP Speaker Router Association
|
||||||
|
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
|
||||||
|
::
|
||||||
|
|
||||||
|
PUT /v2.0/bgp-speakers/<bgp-speaker-id>/router_associations/<router
|
||||||
|
-association-uuid>
|
||||||
|
|
||||||
|
{
|
||||||
|
"router_association":
|
||||||
|
{
|
||||||
|
"router_id": "c930d7f6-ceb7-40a0-8b81-a425dd994ccf",
|
||||||
|
"advertise_extra_routes": True
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
* ``advertise_extra_routes`` field can be set to True or False when updating
|
||||||
|
the router association.
|
||||||
|
|
||||||
|
New neutron Client Command::
|
||||||
|
|
||||||
|
openstack bgp speaker router association update
|
||||||
|
[--advertise-extra-routes]
|
||||||
|
[--no-advertise-extra-routes]
|
||||||
|
<bgpspeaker>
|
||||||
|
<router>
|
||||||
|
|
||||||
|
List Router associations for a given BGP speaker
|
||||||
|
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
|
||||||
|
::
|
||||||
|
|
||||||
|
GET /v2.0/bgp-speakers/<bgp-speaker-id>/router_associations
|
||||||
|
|
||||||
|
{
|
||||||
|
"router_associations": [
|
||||||
|
{
|
||||||
|
"router_id": "c930d7f6-ceb7-40a0-8b81-a425dd994ccf",
|
||||||
|
"advertise_extra_routes": True
|
||||||
|
"status": 'ACTIVE'
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"router_id": "a330d7f6-ceb7-40a0-8b81-a425dd994bbe",
|
||||||
|
"advertise_extra_routes": True
|
||||||
|
"status": 'ACTIVE'
|
||||||
|
}
|
||||||
|
]
|
||||||
|
}
|
||||||
|
|
||||||
|
* ``status`` attribute helps to know whether Neutron-BGPaaS backend software
|
||||||
|
has realized the router association successfully on the openstack
|
||||||
|
infrastructure. Status field can be either ``DOWN`` or ``ACTIVE``.
|
||||||
|
|
||||||
|
|
||||||
|
Show details for a BGP speaker Router Association
|
||||||
|
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
|
||||||
|
::
|
||||||
|
|
||||||
|
GET /v2.0/bgp-speakers/<bgp-speaker-id>/router_associations/<router
|
||||||
|
-association-id>
|
||||||
|
|
||||||
|
{
|
||||||
|
"router_association":
|
||||||
|
{
|
||||||
|
"router_id": "c930d7f6-ceb7-40a0-8b81-a425dd994ccf",
|
||||||
|
"advertise_extra_routes": True
|
||||||
|
"status": 'ACTIVE'
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
Create BGP speaker Peer Association
|
||||||
|
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
|
||||||
|
::
|
||||||
|
|
||||||
|
POST /v2.0/bgp-speakers/<bgp-speaker-id>/peer_associations
|
||||||
|
|
||||||
|
{
|
||||||
|
"peer_association":
|
||||||
|
{
|
||||||
|
"peer_id": "b930d7f6-ceb7-40a0-8b81-a425dd994ccf",
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
* ``peer_id`` represents the UUID of the BGP peer to which the BGP speaker has
|
||||||
|
to be associated.
|
||||||
|
|
||||||
|
New neutron Client Command::
|
||||||
|
|
||||||
|
openstack bgp speaker peer association create
|
||||||
|
<bgpspeaker>
|
||||||
|
<peer>
|
||||||
|
|
||||||
|
Delete BGP speaker Peer Association
|
||||||
|
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
|
||||||
|
::
|
||||||
|
|
||||||
|
DELETE /v2.0/bgp-speakers/<bgp-speaker-id>/peer_associations/<peer
|
||||||
|
-association-uuid>
|
||||||
|
|
||||||
|
.. note::
|
||||||
|
|
||||||
|
Deleting a BGP speaker which has peer-associated will not be allowed.
|
||||||
|
|
||||||
|
New neutron Client Command::
|
||||||
|
|
||||||
|
openstack bgp speaker peer association delete
|
||||||
|
<bgpspeaker>
|
||||||
|
<peer>
|
||||||
|
|
||||||
|
List Peer associations for a given BGP speaker
|
||||||
|
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
|
||||||
|
::
|
||||||
|
|
||||||
|
GET /v2.0/bgp-speakers/<bgp-speaker-id>/peer_associations
|
||||||
|
|
||||||
|
{
|
||||||
|
"peer_associations": [
|
||||||
|
{
|
||||||
|
"peer_id": "b930d7f6-ceb7-40a0-8b81-a425dd994ccf",
|
||||||
|
"status": 'ACTIVE'
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"peer_id": "a640d7f6-ceb7-40a0-8b81-a425dd994dde",
|
||||||
|
"status": 'ACTIVE'
|
||||||
|
}
|
||||||
|
]
|
||||||
|
}
|
||||||
|
|
||||||
|
* ``status`` attribute helps to know whether Neutron-BGPaaS backend software
|
||||||
|
has realized the peer association successfully on the openstack
|
||||||
|
infrastructure. Status field can be either ``DOWN`` or ``ACTIVE``.
|
||||||
|
|
||||||
|
Show details for a BGP speaker Peer Association
|
||||||
|
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
|
||||||
|
::
|
||||||
|
|
||||||
|
GET /v2.0/bgp-speakers/<bgp-speaker-id>/peer_associations/<peer
|
||||||
|
-association-id>
|
||||||
|
|
||||||
|
{
|
||||||
|
"peer_association":
|
||||||
|
{
|
||||||
|
"peer_id": "b930d7f6-ceb7-40a0-8b81-a425dd994ccf",
|
||||||
|
"status": 'ACTIVE'
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
Show routes managed by BGP Speaker API
|
||||||
|
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
|
||||||
|
::
|
||||||
|
|
||||||
|
GET /v2.0/bgp-speakers/<bgp-speaker-id>/get_routes
|
||||||
|
|
||||||
|
{
|
||||||
|
"routes": [
|
||||||
|
{
|
||||||
|
"cidr": "192.168.10.0/24",
|
||||||
|
"nexthop": ["10.0.0.1"],
|
||||||
|
"route-type": "local"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"cidr": "192.168.11.0/24",
|
||||||
|
"nexthop": ["10.0.0.5", "10.0.0.6"],
|
||||||
|
"route-type": "peer"
|
||||||
|
}
|
||||||
|
]
|
||||||
|
}
|
||||||
|
|
||||||
|
* ``nexthop`` is a list which contains ip addresses that is going to be used
|
||||||
|
to reach a certain destination cidr.
|
||||||
|
* ``cidr`` represents the CIDR prefix.
|
||||||
|
* ``route-type`` can be local or peer based on whether the routes are local or
|
||||||
|
learnt from the peer respectively.
|
||||||
|
|
||||||
|
The routes can be obtained from the backend. For example, in case of os_ken
|
||||||
|
backend, rib_get method (see [10]_) can be used to obtain the routes.
|
||||||
|
|
||||||
|
New Neutron Client Command::
|
||||||
|
|
||||||
|
openstack bgp speaker list routes <bgpspeaker>
|
||||||
|
|
||||||
|
Use-case b)
|
||||||
|
|
||||||
|
Create BGP Peer Group API
|
||||||
|
~~~~~~~~~~~~~~~~~~~~~~~~~
|
||||||
|
::
|
||||||
|
|
||||||
|
POST /v2.0/bgp-peer-groups/
|
||||||
|
{
|
||||||
|
"bgp_peer_groups":{
|
||||||
|
"name":"bgppeergroup1",
|
||||||
|
"project_id":"",
|
||||||
|
"remote_asn":"4566",
|
||||||
|
"next_hop_self" : True,
|
||||||
|
"update_source_ip": "10.20.1.5"
|
||||||
|
"auth_type": "md5",
|
||||||
|
"password": "<passwd>"
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
* ``remote_asn`` represents the remote AS number of a BGP peer group
|
||||||
|
* ``next_hop_self`` decides whether to modify the nexthop attribute to its own
|
||||||
|
during BGP advertisement.
|
||||||
|
* ``update_source_ip`` forces BGP to use the IP address specified while
|
||||||
|
talking to a BGP neighbor.
|
||||||
|
* ``auth_type`` determines the authentication algorithm. Supported algorithms
|
||||||
|
are none and md5, none by default.
|
||||||
|
* ``password`` represents the authentication password for the specified
|
||||||
|
authentication type.
|
||||||
|
|
||||||
|
New neutron Client Commands::
|
||||||
|
|
||||||
|
openstack bgp peer group create
|
||||||
|
[--next-hop-self]
|
||||||
|
[--no-next-hop-self]
|
||||||
|
[--auth-type <auth-type>]
|
||||||
|
[--password <password>]
|
||||||
|
[--update_source-ip <ip-address>]
|
||||||
|
--remote-asn <asn-number>
|
||||||
|
<bgp-peer-group-name>
|
||||||
|
|
||||||
|
Delete BGP Peer Group API
|
||||||
|
~~~~~~~~~~~~~~~~~~~~~~~~~
|
||||||
|
::
|
||||||
|
|
||||||
|
DELETE /v2.0/bgp-peer-groups/<bgp-peer-group-id>
|
||||||
|
|
||||||
|
Deletion of peer-group will succeed only if there are no BGP-Peers referring
|
||||||
|
to this peer-group.
|
||||||
|
|
||||||
|
New Neutron Client Commands::
|
||||||
|
|
||||||
|
openstack bgp peer group delete <bgp-peer-group-id>
|
||||||
|
|
||||||
|
Create a bgp-peer using a pre-created peer-group API
|
||||||
|
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
|
||||||
|
::
|
||||||
|
|
||||||
|
POST /v2.0/bgp-peers/
|
||||||
|
{
|
||||||
|
"bgp_peer":{
|
||||||
|
"peer_group_id":"a930d7f6-ceb7-40a0-8b81-a425dd994ccf",
|
||||||
|
"name":"bgppeer1",
|
||||||
|
"listen_range": "10.2.1.0/24"
|
||||||
|
"listen_limit": 10
|
||||||
|
"auth_type": "md5",
|
||||||
|
"password": "<passwd>"
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
* ``peer_group_id`` represents the UUID of the BGP peer group
|
||||||
|
* ``listen_range`` defines a prefix range to be associated with the peer group.
|
||||||
|
* ``listen_limit`` defines the maximum number of BGP peers that can be created
|
||||||
|
automatically.
|
||||||
|
|
||||||
|
These are new fields to the existing BGP peer API and are optional parameters.
|
||||||
|
A BGP-Peer-Group can be re-used by multiple BGP Peers.
|
||||||
|
|
||||||
|
Changed Neutron Client Commands ((see [7]_)::
|
||||||
|
|
||||||
|
openstack bgp peer create
|
||||||
|
[--listen-range <listen-network-range>]
|
||||||
|
[--listen-limit <number>]
|
||||||
|
[--auth-type <auth-type>]
|
||||||
|
[--password <password>]
|
||||||
|
[--peer-group <peer-group-id>]
|
||||||
|
<bgp-peer>
|
||||||
|
|
||||||
|
openstack bgp speaker add peer mybgpspeaker bgpppeer1
|
||||||
|
|
||||||
|
``peer-group`` attribute is introduced in the already existing ``bgp peer``
|
||||||
|
neutron client command. It specifies the name/UUID of the BGP peer group that
|
||||||
|
has to be used by BGP Peer.
|
||||||
|
|
||||||
|
Create BGP peers with update-source and next-hop-self parameters API
|
||||||
|
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
|
||||||
|
As part of the enhancement, new attributes are introduced for the BGP peer
|
||||||
|
model. These are next_hop_self and update_source_ip. ``next_hop_self`` decides
|
||||||
|
whether to modify the nexthop attribute to its own during BGP advertisement.
|
||||||
|
And ``update_source_ip`` forces BGP to use the IP address specified while
|
||||||
|
talking to a BGP neighbor.
|
||||||
|
|
||||||
|
::
|
||||||
|
|
||||||
|
POST /v2.0/bgp-peers/
|
||||||
|
{
|
||||||
|
"bgp_peer":{
|
||||||
|
"auth_type":"none",
|
||||||
|
"remote_as":"1001",
|
||||||
|
"name":"bgppeer1",
|
||||||
|
"peer_ip":"10.0.0.3",
|
||||||
|
"next_hop_self":True,
|
||||||
|
"update_source_ip": "10.2.0.15"
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
Changed Neutron Client Commands::
|
||||||
|
|
||||||
|
openstack bgp peer create
|
||||||
|
[--peer-ip <peer-ip>]
|
||||||
|
[--next-hop-self True]
|
||||||
|
[--auth-type <auth-type>]
|
||||||
|
[--update-source-ip <ip>]
|
||||||
|
--remote-as <as>
|
||||||
|
<bgppeer>
|
||||||
|
|
||||||
|
``update-source-ip`` and ``next-hop-self`` are introduced in the existing
|
||||||
|
``bgp peer`` neutron client command.
|
||||||
|
|
||||||
|
Backend for reference implementation
|
||||||
|
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
|
||||||
|
|
||||||
|
os-ken can be used to handle BGP (see [5]_ ).
|
||||||
|
os-ken is able to start bgp speaker using BGPSpeaker class and
|
||||||
|
it is possible to receive event notifications (``BGP_BEST_PATH_CHANGED``)
|
||||||
|
which can be then used to populate routes inside the namespace.
|
||||||
|
|
||||||
|
|
||||||
|
Data Model Impact
|
||||||
|
-----------------
|
||||||
|
|
||||||
|
``bgp_peers`` table will be updated to incorporate the new fields.
|
||||||
|
|
||||||
|
+---------------------+----------+------------------------------------------+
|
||||||
|
| Field | Type | Description |
|
||||||
|
+=====================+==========+==========================================+
|
||||||
|
| update_source_ip | String | Forces BGP to use the IP address |
|
||||||
|
| | | specified while talking to a BGP neighbor|
|
||||||
|
| next_hop_self | Boolean | Setting to True enables all published |
|
||||||
|
| | | routes to carry BGPSpeaker IP address |
|
||||||
|
| | | over the BGP Control Plane towards this |
|
||||||
|
| | | BGP Peer. |
|
||||||
|
+---------------------+----------+------------------------------------------+
|
||||||
|
|
||||||
|
New table ``bgp_speaker_router_bindings`` will be created to manage the
|
||||||
|
speaker to router association.
|
||||||
|
|
||||||
|
+------------------------+----------+---------------------------------------+
|
||||||
|
| Field | Type | Description |
|
||||||
|
+========================+==========+=======================================+
|
||||||
|
| id | uuid-str | UUID of the BGP speaker router |
|
||||||
|
| | | association |
|
||||||
|
| bgp_speaker_id | uuid-str | UUID of the BGP speaker |
|
||||||
|
| router_id | uuid-str | UUID of the router to which the BGP |
|
||||||
|
| | | speaker has to be associated |
|
||||||
|
| advertise_extra_routes | Boolean | Decides whether neutron extra routes |
|
||||||
|
| | | on the neutron router will be |
|
||||||
|
| | | advertised to bgp-peers |
|
||||||
|
| status | String | Shows whether Neutron-BGPaaS backend |
|
||||||
|
| | | software has realized the router |
|
||||||
|
| | | association successfully on the |
|
||||||
|
| | | openstack infrastructure. Status field|
|
||||||
|
| | | can be either DOWN or ACTIVE. |
|
||||||
|
+------------------------+----------+---------------------------------------+
|
||||||
|
|
||||||
|
Similarly, ``id`` and ``status`` field will be introduced in the existing
|
||||||
|
``bgp_speaker_peer_bindings`` tables.
|
||||||
|
|
||||||
|
New table ``bgp_peer_group`` will be created to manage bgp peer group.
|
||||||
|
|
||||||
|
+---------------------+----------+------------------------------------------+
|
||||||
|
| Field | Type | Description |
|
||||||
|
+=====================+==========+==========================================+
|
||||||
|
| id | uuid-str | UUID of the BGP peer group |
|
||||||
|
| name | String | Human readable name of the BGP peer group|
|
||||||
|
| project_id | String | Owner of the BGP peer group |
|
||||||
|
| remote_asn | Integer | Remote AS number of a BGP peer group |
|
||||||
|
| update_source_ip | String | Forces BGP to use the IP address |
|
||||||
|
| | | specified while talking to a BGP neighbor|
|
||||||
|
| next_hop_self | Boolean | decides whether to modify the nexthop |
|
||||||
|
| | | attribute to its own during BGP |
|
||||||
|
| | | advertisement |
|
||||||
|
+---------------------+----------+------------------------------------------+
|
||||||
|
|
||||||
|
Security Impact
|
||||||
|
---------------
|
||||||
|
There can be security impacts with the introuduction of peer groups which
|
||||||
|
support automatic peering requests from peers within a pre-configured
|
||||||
|
listen-range. This is of major concern if we support this option for external
|
||||||
|
networks.
|
||||||
|
|
||||||
|
And this problem can be resolved using authentication which will be supported
|
||||||
|
in peer-groups.
|
||||||
|
|
||||||
|
Performance Impact
|
||||||
|
------------------
|
||||||
|
There can be performance impact based on the selection of the implementation
|
||||||
|
approaches.
|
||||||
|
|
||||||
|
Accurate testing is however needed to understand the overhead.
|
||||||
|
|
||||||
|
Implementation
|
||||||
|
==============
|
||||||
|
|
||||||
|
Assignee(s)
|
||||||
|
-----------
|
||||||
|
|
||||||
|
Primary assignee:
|
||||||
|
|
||||||
|
Manu B <manubk2020@gmail.com> (IRC: manubk)
|
||||||
|
|
||||||
|
Work Items
|
||||||
|
----------
|
||||||
|
|
||||||
|
* REST API update.
|
||||||
|
* BGP plugin, L3 agent extension to handle BGP:
|
||||||
|
|
||||||
|
* Associate router to bgp speaker
|
||||||
|
* Disassociate router from bgp speaker.
|
||||||
|
* HA support for BGP speaker
|
||||||
|
* Support new peer group APIs
|
||||||
|
* New attributes for BGP peer APIs
|
||||||
|
|
||||||
|
* CLI update.
|
||||||
|
* Documentation.
|
||||||
|
* Tests and CI related changes.
|
||||||
|
|
||||||
|
Testing
|
||||||
|
=======
|
||||||
|
|
||||||
|
* Unit Test
|
||||||
|
* Functional test
|
||||||
|
* API test
|
||||||
|
Perhaps this is something that can be easily tested end-to-end with fullstack
|
||||||
|
tests. Need more investigation.
|
||||||
|
|
||||||
|
Documentation Impact
|
||||||
|
====================
|
||||||
|
|
||||||
|
User Documentation
|
||||||
|
------------------
|
||||||
|
|
||||||
|
New API and changes to legacy APIs like neutron-router and neutron-bgpaas must
|
||||||
|
be documented.
|
||||||
|
|
||||||
|
References
|
||||||
|
==========
|
||||||
|
|
||||||
|
.. [1] https://tools.ietf.org/html/rfc4271
|
||||||
|
.. [2] https://tools.ietf.org/html/rfc4271#section-8
|
||||||
|
.. [3] https://docs.openstack.org/neutron-dynamic-routing/latest
|
||||||
|
.. [4] https://www.sdxcentral.com/networking/nfv/definitions/virtual-network-function
|
||||||
|
.. [5] https://opendev.org/openstack/os-ken/src/branch/master/os_ken/services/protocols/bgp/bgpspeaker.py#L225
|
||||||
|
.. [6] https://docs.openstack.org/neutron/latest/admin/config-bgp-dynamic-routing.html
|
||||||
|
.. [7] https://docs.openstack.org/neutron-dynamic-routing/latest/cli/index.html
|
||||||
|
.. [8] https://docs.openstack.org/neutron-dynamic-routing/latest/contributor/testing.html
|
||||||
|
.. [9] https://www.kernel.org/doc/Documentation/networking/vrf.txt
|
||||||
|
.. [10] https://docs.openstack.org/os-ken/latest/library_bgp_speaker_ref.html#os_ken.services.protocols.bgp.bgpspeaker.BGPSpeaker.rib_get
|
Loading…
x
Reference in New Issue
Block a user