Merge "Repropose "vm-boot-with-unaddressed-port" spec"
This commit is contained in:
commit
54ddb3a6af
228
specs/xena/approved/vm-boot-with-unaddressed-port.rst
Normal file
228
specs/xena/approved/vm-boot-with-unaddressed-port.rst
Normal file
@ -0,0 +1,228 @@
|
|||||||
|
..
|
||||||
|
This work is licensed under a Creative Commons Attribution 3.0 Unported
|
||||||
|
License.
|
||||||
|
|
||||||
|
http://creativecommons.org/licenses/by/3.0/legalcode
|
||||||
|
|
||||||
|
==================================
|
||||||
|
Boot a VM with an unaddressed port
|
||||||
|
==================================
|
||||||
|
|
||||||
|
https://blueprints.launchpad.net/nova/+spec/boot-vm-with-unaddressed-port
|
||||||
|
|
||||||
|
This blueprint aims to allow a VM to boot with an attached port without any IP
|
||||||
|
assigned.
|
||||||
|
|
||||||
|
|
||||||
|
Problem description
|
||||||
|
===================
|
||||||
|
|
||||||
|
Currently Neutron permits users to create a port assigned to a network with
|
||||||
|
corresponding subnets and IP pools, without an IP address assigned. However
|
||||||
|
Nova only allows users to create a VM with a port without an IP only if this
|
||||||
|
address assignment is deferred; that means that the port is expected to have
|
||||||
|
an IP address but Neutron deferred the IP allocation until the host to which
|
||||||
|
the port will be bound is populated.
|
||||||
|
|
||||||
|
However, there are some network applications (e.g.: service function
|
||||||
|
forwarding, service function classifier, CMTS) that often forward traffic that
|
||||||
|
is not intended for them. Those applications have an interface without a
|
||||||
|
primary L3 address which may be receiving traffic for so many disparate
|
||||||
|
addresses that configuring all of them in Neutron is a burden.
|
||||||
|
|
||||||
|
Use Cases
|
||||||
|
---------
|
||||||
|
|
||||||
|
A typical use case is when a user wishes to deploy a VM which accepts traffic
|
||||||
|
that is neither IPv4 nor IPv6 in nature. For example, a CMTS (Cable Modem
|
||||||
|
Termination System).
|
||||||
|
|
||||||
|
Another use case could be a VM that accepts traffic for a very wide address
|
||||||
|
range (for either forwarding or termination) and where the port has no primary
|
||||||
|
address. In such cases, the VM is not a conventional application VM.
|
||||||
|
|
||||||
|
|
||||||
|
Proposed change
|
||||||
|
===============
|
||||||
|
|
||||||
|
This spec proposes to allow to spawn a VM with a manually created port without
|
||||||
|
IP address assignation.
|
||||||
|
|
||||||
|
When a port in Neutron is created with the option "--no-fixed-ip", the port
|
||||||
|
parameter ``ip_allocation`` [1]_ will be populated with "none" [2]_. This way
|
||||||
|
Neutron marks a port not to have an IP address. Nova, during the instance
|
||||||
|
creation, validates the build options; in particular the ports provided to be
|
||||||
|
bound to this new VM. To be able to use an unaddressed port, Nova needs to
|
||||||
|
modify the logic where IP assignation is tested [3]_.
|
||||||
|
|
||||||
|
Alternatives
|
||||||
|
------------
|
||||||
|
|
||||||
|
As commented in the use cases, some applications will accept traffic that is
|
||||||
|
neither IPv4 nor IPv6. Having an IP address is irrelevant on those ports but
|
||||||
|
doesn't affect the application.
|
||||||
|
|
||||||
|
In other cases, like in a routing application, there is no alternative. It's
|
||||||
|
not possible to define in Neutron all the possible IP addresses.
|
||||||
|
|
||||||
|
Data model impact
|
||||||
|
-----------------
|
||||||
|
|
||||||
|
None
|
||||||
|
|
||||||
|
The Neutron port contains the information needed in the ``ip_allocation``
|
||||||
|
parameter and the ``connectivity`` parameter inside the
|
||||||
|
``binding:vif_details``.
|
||||||
|
|
||||||
|
|
||||||
|
REST API impact
|
||||||
|
---------------
|
||||||
|
|
||||||
|
None
|
||||||
|
|
||||||
|
|
||||||
|
Security impact
|
||||||
|
---------------
|
||||||
|
|
||||||
|
Those ports without an assigned IP don't work with the Neutron in-tree
|
||||||
|
firewalls (iptables and OVS Open Flows based). Both firewalls will filter the
|
||||||
|
egress and the ingress traffic depending on several parameters, including the
|
||||||
|
IP address. To let the traffic come into the virtual interface, the firewall
|
||||||
|
should be disabled in the compute node hosting the VM. This mandatory
|
||||||
|
configuration will be documented.
|
||||||
|
|
||||||
|
Once the Nova feature is implemented and tested, a new feature will be
|
||||||
|
requested to Neutron, in order to allow those ports without an IP address to
|
||||||
|
work correctly with the in-tree firewalls.
|
||||||
|
|
||||||
|
Notifications impact
|
||||||
|
--------------------
|
||||||
|
|
||||||
|
None
|
||||||
|
|
||||||
|
Other end user impact
|
||||||
|
---------------------
|
||||||
|
|
||||||
|
To be able to remotely access to the created VM, the user needs to add an
|
||||||
|
addressed port to the VM. This "management" port must have an IP address.
|
||||||
|
|
||||||
|
Performance Impact
|
||||||
|
------------------
|
||||||
|
|
||||||
|
None
|
||||||
|
|
||||||
|
Other deployer impact
|
||||||
|
---------------------
|
||||||
|
|
||||||
|
Some L2 driver, like "l2-pop", may have problems when dealing with this kind of
|
||||||
|
port because they use proxy ARP to answer ARP requests from known IP address.
|
||||||
|
|
||||||
|
The ["novnc"] service won't work with a port without an IP address. This is why
|
||||||
|
it's recommended to create a VM with at least one management port, with an
|
||||||
|
assigned IP address.
|
||||||
|
|
||||||
|
Developer impact
|
||||||
|
----------------
|
||||||
|
|
||||||
|
None
|
||||||
|
|
||||||
|
Upgrade impact
|
||||||
|
--------------
|
||||||
|
|
||||||
|
None
|
||||||
|
|
||||||
|
|
||||||
|
Implementation
|
||||||
|
==============
|
||||||
|
|
||||||
|
Assignee(s)
|
||||||
|
-----------
|
||||||
|
|
||||||
|
Primary assignee:
|
||||||
|
stephenfinucane
|
||||||
|
|
||||||
|
Other contributors:
|
||||||
|
Rodolfo Alonso <rodolfo-alonso-hernandez> (ralonsoh@redhat.com)
|
||||||
|
|
||||||
|
Feature Liaison
|
||||||
|
---------------
|
||||||
|
|
||||||
|
Feature liaison:
|
||||||
|
stephenfinucane
|
||||||
|
|
||||||
|
|
||||||
|
Work Items
|
||||||
|
----------
|
||||||
|
|
||||||
|
Work items:
|
||||||
|
|
||||||
|
- Change the logic of how the IP assignation is tested [3]_.
|
||||||
|
- Implement the tempest test described.
|
||||||
|
- Create a new Neutron feature request to change the in-tree firewalls to work
|
||||||
|
correctly with those ports without IP address assigned.
|
||||||
|
|
||||||
|
|
||||||
|
Dependencies
|
||||||
|
============
|
||||||
|
|
||||||
|
None. The necessary work in neutron has already been accomplished via two
|
||||||
|
specs. The main neutron change was allowing for the creation of an unaddressed
|
||||||
|
port and mark it, by populating the ``ip_allocation`` parameter with ``none``.
|
||||||
|
This was covered by the "Allow vm to boot without l3 address(subnet)" [5]_
|
||||||
|
spec. The changes introduced as part of the "Port binding event extended
|
||||||
|
information for Nova" [4]_ spec means neutron will now provide the type of
|
||||||
|
back-end to which the port is bound, with the parameter ``connectivity``,
|
||||||
|
included now in ``binding:vif_details``. Nova can determine whether a given
|
||||||
|
driver back-end has "l2" connectivity and, if so, know that a port without an
|
||||||
|
IP address can be assigned to a virtual machine.
|
||||||
|
|
||||||
|
|
||||||
|
Testing
|
||||||
|
=======
|
||||||
|
|
||||||
|
Apart from the needed functional and unit testing, a tempest test could cover
|
||||||
|
this feature. This tempest test will spawn three VMs, each one with a
|
||||||
|
management port, to be able to SSH to the machine. Then two traffic networks
|
||||||
|
will be created, net1 and net2.
|
||||||
|
|
||||||
|
The first machine will have a port, with an IP assigned, connected to net1.
|
||||||
|
The third machine will have a port, with an IP assigned, connected to net2.
|
||||||
|
And finally, the second machine, in the middle of the first and the third one,
|
||||||
|
with be connected to net1 and net2 with two ports without an IP address.
|
||||||
|
The second machine will have the needed iptables rules to NAT the traffic
|
||||||
|
between the first VM and the third VM port.
|
||||||
|
|
||||||
|
Both the first and the third machine will need a manual entry in the ARP table
|
||||||
|
to force the traffic going out trough the traffic port.
|
||||||
|
|
||||||
|
|
||||||
|
Documentation Impact
|
||||||
|
====================
|
||||||
|
|
||||||
|
- Make a reference of this feature in the user document "Launch instances"
|
||||||
|
[6]_.
|
||||||
|
|
||||||
|
|
||||||
|
References
|
||||||
|
==========
|
||||||
|
|
||||||
|
.. [1] https://github.com/openstack/neutron/blob/stable/rocky/releasenotes/notes/add-port-ip-allocation-attr-294a580641998240.yaml
|
||||||
|
.. [2] https://github.com/openstack/neutron/blob/stable/rocky/neutron/db/db_base_plugin_v2.py#L1323
|
||||||
|
.. [3] https://github.com/openstack/nova/blob/stable/rocky/nova/network/neutronv2/api.py#L2078-L2086
|
||||||
|
.. [4] https://review.opendev.org/#/c/645173/
|
||||||
|
.. [5] https://blueprints.launchpad.net/neutron/+spec/vm-without-l3-address
|
||||||
|
.. [6] https://github.com/openstack/nova/blob/stable/rocky/doc/source/user/launch-instances.rst
|
||||||
|
|
||||||
|
|
||||||
|
History
|
||||||
|
=======
|
||||||
|
|
||||||
|
.. list-table:: Revisions
|
||||||
|
:header-rows: 1
|
||||||
|
|
||||||
|
* - Release Name
|
||||||
|
- Description
|
||||||
|
* - Train
|
||||||
|
- Introduced
|
||||||
|
* - Xena
|
||||||
|
- Reproposed
|
Loading…
Reference in New Issue
Block a user