Distributed Image Import spec
As planned in the glance meeting today, this adds a new spec for distributed image import, in total isolation, with a proposal to start with the simple case and moving to use image location metadata when available. Change-Id: Ic11be7628535f87b9002b69f845150bd02b9f0d7
This commit is contained in:
parent
e518123237
commit
434abee27e
245
specs/wallaby/approved/glance/distributed-image-import.rst
Normal file
245
specs/wallaby/approved/glance/distributed-image-import.rst
Normal file
@ -0,0 +1,245 @@
|
||||
..
|
||||
This work is licensed under a Creative Commons Attribution 3.0 Unported
|
||||
License.
|
||||
|
||||
http://creativecommons.org/licenses/by/3.0/legalcode
|
||||
|
||||
================================
|
||||
Distributed Image Import Support
|
||||
================================
|
||||
|
||||
https://blueprints.launchpad.net/glance/+spec/distributed-image-import
|
||||
|
||||
Glance is moving towards supporting rich operations on images, mostly
|
||||
during create time, via the import mechanism. This opens the door to
|
||||
things like metadata injection, format conversion, and copying between
|
||||
stores. Currently in order for this to work for what the user would
|
||||
consider the closest analog to ``image-upload`` (which is the
|
||||
``glance-direct`` import method), the API nodes require access to
|
||||
shared storage which is a real blocker to adoption by deployers, and
|
||||
is the subject of this spec.
|
||||
|
||||
Problem description
|
||||
===================
|
||||
|
||||
Currently, when images are uploaded via the import mechanism, they are
|
||||
stored in a special area called "staging." This is implemented under
|
||||
the covers as a ``glance_store`` but it must be a locally-accessible
|
||||
directory on the host filesystem. When using multiple API worker nodes
|
||||
(as any real deployment would), the staging directories of all worker
|
||||
nodes must be shared (i.e. mounted on a common NFS server) in order to
|
||||
support the ``glance-direct`` import method. This is obviously a
|
||||
problem for HA, performance, and a non-starter for any arrangement
|
||||
where some glance API workers are located in remote sites.
|
||||
|
||||
In order to get an image from zero to usable with a ``glance-direct``
|
||||
import, there are multiple API requests that are required. One of
|
||||
these is the "staging" of the image data, which is followed by an
|
||||
"import" operation which moves the data from the staging area to its
|
||||
final destination(s). In a multi-node load-balanced scenario, the
|
||||
"stage" operation will almost definitely hit a different worker than
|
||||
the "import" operation, which will result in the latter not having
|
||||
access to the staged image data in its staging store, and thus a
|
||||
failure.
|
||||
|
||||
|
||||
Proposed change
|
||||
===============
|
||||
|
||||
The goal of the work outlined by this spec, is to allow the API
|
||||
workers to keep their staging store directories local and
|
||||
un-shared, but still enabling the import operation to work. In order
|
||||
to do this, we will:
|
||||
|
||||
#. Record the URL by which the staging worker can be reached from the
|
||||
other workers in the database, and
|
||||
#. Proxy the import request to the host that has it staged via that
|
||||
URL if the image is not local.
|
||||
#. Any delete request while the image is staged also needs to be
|
||||
proxied, to ensure that the temporary file is deleted from the
|
||||
staging directory on the appropriate node.
|
||||
|
||||
With the above change, we can eliminate the need for shared storage
|
||||
between the API worker nodes, allowing them to be isolated from an HA
|
||||
point of view, as well as distributed geographically. It requires very
|
||||
little actual change, as the non-local recipient node simply proxies
|
||||
the request it receives to the node that has it staged and returns the
|
||||
result. Both the ``import`` and ``delete`` operations are quick and do
|
||||
not require a chained client -> proxy -> destination arrangement to
|
||||
persist for long periods of time.
|
||||
|
||||
Alternatives
|
||||
------------
|
||||
|
||||
One alternative is always to do nothing. We could continue to require
|
||||
shared storage for the staging area between the API nodes to support
|
||||
the import feature. We could also direct users to use image uploading
|
||||
instead of importing in cases where a shared directory is not
|
||||
feasible.
|
||||
|
||||
Another alternative would be to do effectively the same thing as
|
||||
described here, but over RabbitMQ or some other RPC mechanism. That
|
||||
has the disadvantage of needing additional supporting infrastructure
|
||||
that glance does not currently require today, as well as new code to
|
||||
handle sending and receiving those RPC calls and directing them to the
|
||||
appropriate internal actions.
|
||||
|
||||
Data model impact
|
||||
-----------------
|
||||
|
||||
In order to do this, we only need to store one new piece of
|
||||
information, and only for a short period of time. That is the direct
|
||||
URL of the API worker node that has staged an image. When the image is
|
||||
finally imported (which usually happens immediately after staging),
|
||||
that URL is no longer needed (nor relevant).
|
||||
|
||||
Initially, this implementation will use the reserved and
|
||||
quota-independent ``os_glance`` namespace to store the URL in the
|
||||
image's ``extra_properties``.
|
||||
|
||||
Later, when work is done to complete the usage of the staging
|
||||
directory as a proper glance store, we may be able to store the URL in
|
||||
the location metadata when the staging image data is registered
|
||||
there. When this happens and assuming there is an appropriate
|
||||
interface to use that location metadata, the plan will be to make this
|
||||
implementation use that metadata store instead.
|
||||
|
||||
REST API impact
|
||||
---------------
|
||||
|
||||
None.
|
||||
|
||||
Security impact
|
||||
---------------
|
||||
|
||||
The proxy behavior will be done with the user's token, as presented to
|
||||
the worker that the load balancer selects. No additional authorization
|
||||
is added, and that token is used to make the request to the
|
||||
appropriate worker on the user's behalf. Thus, this operation is
|
||||
entirely transparent from a security perspective.
|
||||
|
||||
Notifications impact
|
||||
--------------------
|
||||
|
||||
None.
|
||||
|
||||
Other end user impact
|
||||
---------------------
|
||||
|
||||
More users will be able to use the image import functionality after
|
||||
this is implemented as operators unwilling or unable to provide shared
|
||||
storage between their workers will no longer need to disable
|
||||
``glance-direct`` import for their users.
|
||||
|
||||
Performance Impact
|
||||
------------------
|
||||
|
||||
Eliminating the use of a shared NFS (or similar) storage location for
|
||||
the staging store should improve performance of upload and import,
|
||||
since the staging directory can be local. It also vastly reduces the
|
||||
need to move a potentially very large image back and forth over the
|
||||
network multiple times in the process of doing a single image import
|
||||
(reduces from a minimum of four round-trips of the image data to two).
|
||||
|
||||
Other deployer impact
|
||||
---------------------
|
||||
|
||||
Deployers may wish to enable image import after upgrading to a release
|
||||
that supports this, where previously they needed to disable the
|
||||
feature (or just ``glance-direct``. They will need to configure each
|
||||
API worker with an additional element indicating the direct URL by
|
||||
which they can be reached, and ensure that API nodes are able to
|
||||
communicate with each other in this way.
|
||||
|
||||
Deployers that currently support import via shared storage may want to
|
||||
quiesce image activity while they split the workers from the shared
|
||||
storage location to local directories.
|
||||
|
||||
Deployers wishing to keep the shared storage for image staging may
|
||||
choose to do so with no impact or action required.
|
||||
|
||||
Deployers wishing to keep the import feature (or just the
|
||||
``glance-direct`` method) disabled, may also do so with no impact or
|
||||
action required.
|
||||
|
||||
Developer impact
|
||||
----------------
|
||||
|
||||
When we move to the location-based metadata approach detailed above,
|
||||
we will need to change the API from using the image
|
||||
``extra_properties`` dict to passing that information through to the
|
||||
store routines. It is expected that this will be less than ten lines
|
||||
of code.
|
||||
|
||||
Implementation
|
||||
==============
|
||||
|
||||
Assignee(s)
|
||||
-----------
|
||||
|
||||
Primary assignee:
|
||||
danms
|
||||
|
||||
Work Items
|
||||
----------
|
||||
|
||||
#. Build a mechanism by which we can use the user's authorization
|
||||
token to make an outbound call to another service
|
||||
#. Add a configuration element allowing the operators to teach the API
|
||||
workers what their externally-visible URL is.
|
||||
#. Make the API workers record their own URL on the image during the
|
||||
image ``stage`` operation.
|
||||
#. Make the ``import`` and ``delete`` operations proxy to the
|
||||
appropriate URL when it is determined appropriate to do so.
|
||||
|
||||
Dependencies
|
||||
============
|
||||
|
||||
* Devstack needs support for starting additional glance workers in
|
||||
order to properly test this.
|
||||
* Tempest needs support for looking up alternative image services in
|
||||
the service catalog.
|
||||
|
||||
Testing
|
||||
=======
|
||||
|
||||
Unit tests for the API behaviors and import tasks are sufficient, as
|
||||
the changes are minimal.
|
||||
|
||||
Functional tests for the image proxying.
|
||||
|
||||
A set of tempest tests that stage and import/delete images on
|
||||
different glance workers with separate staging directories will be
|
||||
written to ensure CI coverage for this behavior in a realistic sense.
|
||||
|
||||
|
||||
Documentation Impact
|
||||
====================
|
||||
|
||||
Since this just makes something work that did not before, no large
|
||||
amount of documentation will need to be written. As mentioned above,
|
||||
deployers will have one new config option to set on API nodes as well
|
||||
as network and firewall considerations to address in order for this to
|
||||
work, which will be covered in the documentation.
|
||||
|
||||
References
|
||||
==========
|
||||
|
||||
Much discussion on this was done on another spec:
|
||||
|
||||
* https://review.opendev.org/c/openstack/glance-specs/+/763574
|
||||
|
||||
The code implementation for this also has discussion relevant to the
|
||||
topic:
|
||||
|
||||
* https://review.opendev.org/c/openstack/glance/+/769976
|
||||
|
||||
This was discussed at the Wallaby PTG in the glance sessions, under
|
||||
the topic of "Cluster Awareness":
|
||||
|
||||
* https://etherpad.opendev.org/p/glance-wallaby-ptg
|
||||
|
||||
This has been discussed in multiple glance meetings:
|
||||
|
||||
* http://eavesdrop.openstack.org/meetings/glance/2021/glance.2021-01-28-14.01.log.html#l-26
|
||||
* http://eavesdrop.openstack.org/meetings/glance/2021/glance.2021-02-04-14.00.log.html#l-30
|
Loading…
Reference in New Issue
Block a user