Merge "New VIF type to allow routing VM data instead of bridging it"
This commit is contained in:
242
specs/kilo/approved/vif-type-tap.rst
Normal file
242
specs/kilo/approved/vif-type-tap.rst
Normal file
@@ -0,0 +1,242 @@
|
|||||||
|
..
|
||||||
|
This work is licensed under a Creative Commons Attribution 3.0 Unported
|
||||||
|
License.
|
||||||
|
|
||||||
|
http://creativecommons.org/licenses/by/3.0/legalcode
|
||||||
|
|
||||||
|
============================================================
|
||||||
|
New VIF type to allow routing VM data instead of bridging it
|
||||||
|
============================================================
|
||||||
|
|
||||||
|
https://blueprints.launchpad.net/nova/+spec/vif-type-tap
|
||||||
|
|
||||||
|
We propose to add a new VIF type, VIF_TYPE_TAP, whose meaning is that
|
||||||
|
the host side of a VNIC to a VM is - at least initially - a simple TAP
|
||||||
|
interface that is not plugged into a bridge or vSwitch. A Neutron
|
||||||
|
agent can continue the process of deciding how to handle data from
|
||||||
|
that interface, and how to deliver data to it - but this is beyond the
|
||||||
|
scope of the initial TAP interface setup that Nova needs to provide.
|
||||||
|
|
||||||
|
|
||||||
|
Problem description
|
||||||
|
===================
|
||||||
|
|
||||||
|
For Project Calico (http://www.projectcalico.org/), we'd like the host
|
||||||
|
side of the pipe into a VM to be a simple, unbridged TAP interface,
|
||||||
|
and currently there is no VIF_TYPE that I can use to get this.
|
||||||
|
|
||||||
|
VIF_TYPE_MIDONET, VIF_TYPE_IOVISOR and VIF_TYPE_IVS (without firewall
|
||||||
|
or hybrid plug) all create an unbridged TAP interface, but then do
|
||||||
|
additional things to it (within the Nova code) to connect that TAP
|
||||||
|
interface into the host's networking system. Other VIF_TYPEs involve
|
||||||
|
bridges or vSwitches, or 'direct' attachments to physical host
|
||||||
|
interfaces.
|
||||||
|
|
||||||
|
Use Cases
|
||||||
|
---------
|
||||||
|
|
||||||
|
One application is that VIF_TYPE_TAP makes it possible for data
|
||||||
|
to/from VMs, and also between VMs on the same host, to be routed by
|
||||||
|
their immediate compute host instead of being bridged. This is of
|
||||||
|
interest in deployments where VMs only require services at layer 3
|
||||||
|
(IP) and above, and it is still possible to implement, through
|
||||||
|
iptables and route distribution filters, all of the detailed
|
||||||
|
connectivity and security policies that are implied by any given set
|
||||||
|
of OpenStack's networking, security group and router configurations.
|
||||||
|
For more on how that can work please see Project Calico
|
||||||
|
(http://www.projectcalico.org/) and
|
||||||
|
https://blueprints.launchpad.net/neutron/+spec/calico-mechanism-driver.
|
||||||
|
|
||||||
|
The applicability of VIF_TYPE_TAP should however be wider than just
|
||||||
|
that one project. It enables a class of experimental future
|
||||||
|
networking implementations to be explored in Neutron (with plugin,
|
||||||
|
mechanism driver and agent code) without needing to change or patch
|
||||||
|
any Nova code.
|
||||||
|
|
||||||
|
Project Priority
|
||||||
|
----------------
|
||||||
|
|
||||||
|
Not applicable. (As advised by John Garbutt.)
|
||||||
|
|
||||||
|
(However we would argue that VIF_TYPE_TAP supports the
|
||||||
|
"Nova-network/Neutron migration" priority listed at
|
||||||
|
https://github.com/openstack/nova-specs/blob/master/priorities/kilo-priorities.rst,
|
||||||
|
in that it allows some forms of network connectivity to be explored
|
||||||
|
and developed without needing further changes to the Nova code.)
|
||||||
|
|
||||||
|
|
||||||
|
Proposed change
|
||||||
|
===============
|
||||||
|
|
||||||
|
Add VIF_TYPE_TAP in nova/network/model.py.
|
||||||
|
|
||||||
|
Add get_config_tap, plug_tap and unplug_tap methods in
|
||||||
|
nova/virt/libvirt/vif.py, with implementations that simply configure,
|
||||||
|
create and delete a TAP device.
|
||||||
|
|
||||||
|
The libvirt config for VIF_TYPE_TAP would be an <interface
|
||||||
|
type="ethernet"> element with a null script, just as for the existing
|
||||||
|
VIF_TYPE_MIDONET and VIF_TYPE_IOVISOR cases, prepared by calling
|
||||||
|
self.get_base_config and
|
||||||
|
designer.set_vif_host_backend_ethernet_config.
|
||||||
|
|
||||||
|
When a VM is to be launched using VIF_TYPE_TAP:
|
||||||
|
|
||||||
|
- Nova creates the TAP interface, in plug_tap(), by calling
|
||||||
|
linux_net.create_tap_dev
|
||||||
|
|
||||||
|
- libvirt launches the VM, with the config described just above, to
|
||||||
|
match the created TAP interface.
|
||||||
|
|
||||||
|
Alternatives
|
||||||
|
------------
|
||||||
|
|
||||||
|
None. All existing VIF_TYPEs whose plugging is implemented in
|
||||||
|
nova/virt/libvirt/vif.py are unsuitable, as described in Problem
|
||||||
|
Description above. Pre-Juno it was possible to configure use of an
|
||||||
|
out-of-tree VIF driver (with the virt_driver setting), but this was
|
||||||
|
deprecated and has now been removed.
|
||||||
|
|
||||||
|
Data model impact
|
||||||
|
-----------------
|
||||||
|
|
||||||
|
None.
|
||||||
|
|
||||||
|
REST API impact
|
||||||
|
---------------
|
||||||
|
|
||||||
|
None.
|
||||||
|
|
||||||
|
Security impact
|
||||||
|
---------------
|
||||||
|
|
||||||
|
A compute host can guard against IP address spoofing (by a VM) on a
|
||||||
|
VIF_TYPE_TAP interface by installing iptables rules that require each
|
||||||
|
packet from a VM to have the expected source IP address.
|
||||||
|
|
||||||
|
If a VIF_TYPE_TAP interface is not plugged into a bridge, MAC address
|
||||||
|
spoofing by a VM has no impact. If a VIF_TYPE_TAP interface _is_
|
||||||
|
plugged into a bridge, that bridge can implement similar protections
|
||||||
|
against MAC spoofing as for existing bridged VIF_TYPEs.
|
||||||
|
|
||||||
|
Notifications impact
|
||||||
|
--------------------
|
||||||
|
|
||||||
|
None.
|
||||||
|
|
||||||
|
Other end user impact
|
||||||
|
---------------------
|
||||||
|
|
||||||
|
None.
|
||||||
|
|
||||||
|
Performance Impact
|
||||||
|
------------------
|
||||||
|
|
||||||
|
Unless the VIF_TYPE_TAP vif type is explicitly requested (e.g. by a
|
||||||
|
Neutron/ML2 mechanism driver class), there is no possible performance
|
||||||
|
impact on a standard OpenStack system.
|
||||||
|
|
||||||
|
Other deployer impact
|
||||||
|
---------------------
|
||||||
|
|
||||||
|
The Nova extension proposed here will have no effect on existing or
|
||||||
|
newly deployed OpenStack systems, unless the VIF_TYPE_TAP vif type
|
||||||
|
is explicitly requested somewhere (e.g. by a Neutron/ML2 mechanism
|
||||||
|
driver class).
|
||||||
|
|
||||||
|
Developer impact
|
||||||
|
----------------
|
||||||
|
|
||||||
|
None.
|
||||||
|
|
||||||
|
|
||||||
|
Implementation
|
||||||
|
==============
|
||||||
|
|
||||||
|
Assignee(s)
|
||||||
|
-----------
|
||||||
|
|
||||||
|
Primary assignee:
|
||||||
|
neil-jerram
|
||||||
|
|
||||||
|
Other contributors:
|
||||||
|
lukasaoz
|
||||||
|
cliljenstolpe
|
||||||
|
|
||||||
|
Work Items
|
||||||
|
----------
|
||||||
|
|
||||||
|
The changes required for this spec have already been implemented by
|
||||||
|
us, based on the Icehouse release code, and fairly extensively
|
||||||
|
tested.
|
||||||
|
|
||||||
|
An up to date base is of course appropriate for this spec, so the
|
||||||
|
changes rebased onto the current proposed/juno branch can be seen at
|
||||||
|
the following URL:
|
||||||
|
|
||||||
|
* https://github.com/Metaswitch/calico-nova/commit/bde91e1afd32c4c033c527e078ec4e5c721302c5
|
||||||
|
|
||||||
|
Remaining work items are as follows:
|
||||||
|
|
||||||
|
* Implement unit and 3rd party CI tests as described below.
|
||||||
|
* Verify that proposed changes pass all existing tests (including code
|
||||||
|
style), as well as new tests.
|
||||||
|
* Submit changes formally for review.
|
||||||
|
* Participate in resulting discussions, mark up and re-review
|
||||||
|
processes.
|
||||||
|
* Repeat until done!
|
||||||
|
|
||||||
|
|
||||||
|
Dependencies
|
||||||
|
============
|
||||||
|
|
||||||
|
There are two related Neutron specs that I have proposed as part of
|
||||||
|
the Project Calico approach, and that build on the capability that
|
||||||
|
VIF_TYPE_TAP provides.
|
||||||
|
|
||||||
|
* https://blueprints.launchpad.net/neutron/+spec/dhcp-for-routed-ifs
|
||||||
|
enhances the Neutron DHCP agent code to handle DHCP for routed TAP
|
||||||
|
interfaces.
|
||||||
|
|
||||||
|
* https://blueprints.launchpad.net/neutron/+spec/calico-mechanism-driver
|
||||||
|
provides a Neutron/ML2 mechanism driver that implements routed
|
||||||
|
networking by using VIF_TYPE_TAP.
|
||||||
|
|
||||||
|
As already stated above, however, I expect the long term applicability
|
||||||
|
of VIF_TYPE_TAP to be wider than just for Project Calico.
|
||||||
|
|
||||||
|
|
||||||
|
Testing
|
||||||
|
=======
|
||||||
|
|
||||||
|
Within the OpenStack ecosystem, this change will be tested at
|
||||||
|
unit-test level, by adding a test case to
|
||||||
|
nova/tests/virt/libvirt/test_vif.py, that creates and verifies a
|
||||||
|
virtual interface with type VIF_TYPE_TAP.
|
||||||
|
|
||||||
|
(It will also be extensively tested at the system level by continuing
|
||||||
|
related development and testing at Project Calico
|
||||||
|
(http://www.projectcalico.org/), which uses VIF_TYPE_TAP, and such
|
||||||
|
work will generally be conducted and reported in public.
|
||||||
|
|
||||||
|
We understand, though, that this is not formally verifiable testing
|
||||||
|
within the OpenStack ecosystem; so it is mentioned here for
|
||||||
|
information only.)
|
||||||
|
|
||||||
|
|
||||||
|
Documentation Impact
|
||||||
|
====================
|
||||||
|
|
||||||
|
No documentation changes for Nova are anticipated. VIF_TYPE_TAP will
|
||||||
|
be automatically enabled by a related Neutron/ML2 driver, where
|
||||||
|
appropriate.
|
||||||
|
|
||||||
|
|
||||||
|
References
|
||||||
|
==========
|
||||||
|
|
||||||
|
http://www.projectcalico.org/
|
||||||
|
|
||||||
|
https://github.com/Metaswitch/calico-nova
|
||||||
|
|
||||||
|
https://github.com/Metaswitch/calico-neutron
|
||||||
Reference in New Issue
Block a user