Merge "Add Support for Smart NIC in OVS ML2 mech driver"
This commit is contained in:
commit
6824b2a647
@ -0,0 +1,153 @@
|
|||||||
|
..
|
||||||
|
This work is licensed under a Creative Commons Attribution 3.0 Unported
|
||||||
|
License.
|
||||||
|
|
||||||
|
http://creativecommons.org/licenses/by/3.0/legalcode
|
||||||
|
|
||||||
|
======================================================
|
||||||
|
Neutron OVS Agent Support for Baremetal with Smart NIC
|
||||||
|
======================================================
|
||||||
|
|
||||||
|
https://bugs.launchpad.net/neutron/+bug/1785608
|
||||||
|
|
||||||
|
This spec describes proposed changes to the Neutron OVS mechanism driver and
|
||||||
|
the Neutron OVS agent to enable a generic, vendor-agnostic, baremetal
|
||||||
|
networking service running on smart NICs, enabling baremetal networking
|
||||||
|
with feature parity to the virtualization use-case.
|
||||||
|
|
||||||
|
|
||||||
|
Problem Description
|
||||||
|
===================
|
||||||
|
|
||||||
|
While Ironic today supports Neutron provisioned network connectivity for
|
||||||
|
baremetal servers through an ML2 mechanism driver, the existing support
|
||||||
|
is based largely on configuration of TORs through vendor-specific mechanism
|
||||||
|
drivers, with limited capabilities.
|
||||||
|
|
||||||
|
|
||||||
|
Proposed Change
|
||||||
|
===============
|
||||||
|
|
||||||
|
There is a wide range of smart/intelligent NICs emerging on the market.
|
||||||
|
These NICs generally incorporate one or more general purpose CPU cores along
|
||||||
|
with data-plane packet processing acceleration, and can efficiently run
|
||||||
|
virtual switches such as OVS, while maintaining the existing interfaces to the
|
||||||
|
SDN layer.
|
||||||
|
|
||||||
|
The proposal is to extend the Neutron OVS mechanism driver and Neutron OVS Agent
|
||||||
|
to bind the Neutron port for the baremetal host with smart NIC. This will allow
|
||||||
|
the Neutron OVS Agent to configure the pipeline of the OVS running on the
|
||||||
|
smart NIC and leverage the pipeline features such as: VXLAN, Security Groups and
|
||||||
|
ARP Responder.
|
||||||
|
|
||||||
|
This spec is complementary to the Ironic spec [1]_.
|
||||||
|
|
||||||
|
In this proposal, we address two use-cases:
|
||||||
|
|
||||||
|
#. Neutron OVS L2 agent runs locally on the smart NIC.
|
||||||
|
#. Neutron OVS L2 agent(s) run remotely and manages the OVS bridges for all
|
||||||
|
the baremetal smart NICs.
|
||||||
|
|
||||||
|
Example of smart NIC model::
|
||||||
|
|
||||||
|
+---------------------+
|
||||||
|
| baremetal |
|
||||||
|
| +-----------------+ |
|
||||||
|
| | OS Server | | |
|
||||||
|
| | | | |
|
||||||
|
| | +A | | |
|
||||||
|
| +------|--------+ | |
|
||||||
|
| | | |
|
||||||
|
| +------|--------+ | |
|
||||||
|
| | OS SmartNIC | | |
|
||||||
|
| | +-+B-+ | | |
|
||||||
|
| | |OVS | | | |
|
||||||
|
| | +-+C-+ | | |
|
||||||
|
| +------|--------+ | |
|
||||||
|
+--------|------------+
|
||||||
|
|
|
||||||
|
|
||||||
|
A - port on the baremetal host.
|
||||||
|
B - port that represents the baremetal port in the smart NIC.
|
||||||
|
C - port that represents to the physical port in the smart NIC.
|
||||||
|
|
||||||
|
- Ironic creation of Neutron Port:
|
||||||
|
|
||||||
|
#. Create Neutron port with new vnic_type called `smart-nic`.
|
||||||
|
#. Add local_link_information with the following attributes:
|
||||||
|
|
||||||
|
#. smart NIC hostname - the hostname of server/smart NIC where the Neutron
|
||||||
|
OVS agent is running. (required)
|
||||||
|
#. smart NIC port id - the port name that needs to be plugged to the
|
||||||
|
integration bridge. B in the diagram above(required)
|
||||||
|
#. smart NIC SSH public key - ssh public key of the smart NIC
|
||||||
|
(required only for remote)
|
||||||
|
#. smart NIC OVSDB SSL certificate - OVSDB SSL of the OVS in smart NIC
|
||||||
|
(required only remote)
|
||||||
|
|
||||||
|
- Neutron OVS ML2 Mechanism Driver:
|
||||||
|
|
||||||
|
The OVS ML2 will allow binding the `smart-nic` vnic_type. The rationale
|
||||||
|
for creating new vnic_type and not using the barmetal one is that there is a
|
||||||
|
wide range of mechanism drivers that use hierarchical port binding for
|
||||||
|
configuring TOR switches and we want to allow this to work with smart NICs.
|
||||||
|
for example mechanism_drivers=cisco_nexus,openvswitch
|
||||||
|
|
||||||
|
The OVS ML2 mechanism driver will determine if the Neutron OVS Agent runs
|
||||||
|
locally or remotely based on smart NIC configuration passed from ironic as
|
||||||
|
described above.
|
||||||
|
|
||||||
|
In case the Neutron OVS L2 agent runs locally on the smart NIC the OVS
|
||||||
|
mechanism driver will locate the Neutron OVS agent by the smart
|
||||||
|
NIC hostname attribute. For the remote case the changes are captured
|
||||||
|
in this neutron spec [2]_.
|
||||||
|
|
||||||
|
- Neutron OVS Agent:
|
||||||
|
|
||||||
|
Extend the port_update rpc method as following:
|
||||||
|
|
||||||
|
.. code-block:: python
|
||||||
|
|
||||||
|
def port_update(self, context, **kwargs):
|
||||||
|
port = kwargs.get('port')
|
||||||
|
# get the port data from cache
|
||||||
|
port_data = self.plugin_rpc.remote_resource_cache. \
|
||||||
|
get_resource_by_id(resources.PORT, port['id'])
|
||||||
|
# if smart-nic port add it to updated_smart_nic_ports with
|
||||||
|
# the required information for adding the port to OVSDB
|
||||||
|
port_binding = port_data['bindings']
|
||||||
|
if port_binding['vnic_type'] == 'smart-nic':
|
||||||
|
ifname = smart_nic_port_data['port_binding']['profile'] \
|
||||||
|
['local_link_information'][0]['port_id']
|
||||||
|
mac = port_data['mac_address']
|
||||||
|
node_uuid = port_data['device_id']
|
||||||
|
port_binding['vif_type'] = vif_type
|
||||||
|
self.updated_smart_nic_ports.append({
|
||||||
|
'mac': mac,
|
||||||
|
'node_uuid': node_uuid,
|
||||||
|
'iface_id': port['id'],
|
||||||
|
'iface_name': ifname,
|
||||||
|
'vif_type': vif_type})
|
||||||
|
self.updated_ports.add(port['id'])
|
||||||
|
|
||||||
|
When Neutron processes the ports the Neuton OVS agent will add the
|
||||||
|
smart NIC port(s) to the OVSDB by ovs plugin in os-vif.
|
||||||
|
|
||||||
|
Because RPC is not reliable we need to extend the full sync to do the following:
|
||||||
|
|
||||||
|
#. when sync is True we will retrieve all the smart-nic ports for this agent.
|
||||||
|
This requires to add another RPC call.
|
||||||
|
#. We will compare the retrieved smart-nic ports for the Neutron server to the
|
||||||
|
existing smart-nic port on the integration bridge.
|
||||||
|
#. if the smart-nic port is only on the Neutron server we will add it to
|
||||||
|
the added list in the port_info.
|
||||||
|
#. if the smart-nic port is only on the integration bridge we will add it
|
||||||
|
to the removed list in the port_info.
|
||||||
|
|
||||||
|
|
||||||
|
References
|
||||||
|
==========
|
||||||
|
|
||||||
|
.. [1] https://review.openstack.org/#/c/582767/
|
||||||
|
|
||||||
|
.. [2] https://review.openstack.org/#/c/595402/
|
Loading…
Reference in New Issue
Block a user