24a5dd9282
Change-Id: I342f4f86337cdc08668cf089e6a6ed90e12b00ff
211 lines
6.5 KiB
ReStructuredText
211 lines
6.5 KiB
ReStructuredText
..
|
|
This work is licensed under a Creative Commons Attribution 3.0 Unported
|
|
License.
|
|
|
|
http://creativecommons.org/licenses/by/3.0/legalcode
|
|
|
|
============================
|
|
Container Cinder Integration
|
|
============================
|
|
Related Launchpad Blueprint:
|
|
|
|
https://blueprints.launchpad.net/zun/+spec/cinder-zun-integration
|
|
|
|
Zun needs to manage containers as well as their associated IaaS resources,
|
|
such as IP addresses, security groups, ports, volumes, etc.
|
|
Zun containers should be able to use volumes which has multiple storage
|
|
vendors or plugins support.
|
|
|
|
As zun is project belongs to OpenStack ecosystem and zun has integration
|
|
with Cinder which is block storage service.
|
|
|
|
Fuxi is new OpenStack project which aims to integrate Cinder to docker
|
|
volumes. With Fuxi, Cinder can be used as the unified persistence storage
|
|
provider for virtual machine, baremetal and Docker container.
|
|
|
|
The implementation of Cinder is enabled using fuxi driver from zun. We need
|
|
to implement Cinder driver in Zun which manages volumes, let Fuxi control the
|
|
mount/unmount volume from Docker container.
|
|
|
|
Problem description
|
|
===================
|
|
To store some large amount data in container is not possible. In case of
|
|
of containers, all the storage resides in host storage which is not good
|
|
solution. If host goes down, storage wont be accessible.
|
|
We need to somehow use cloud storage, which is reliable and we can attach
|
|
it to container so that people use containers for workloads also.
|
|
|
|
Proposed change
|
|
===============
|
|
There are two approaches docker provides to add volume to Container.
|
|
|
|
1. Using Docker run
|
|
|
|
docker run -d --volume-driver= Fuxi -v my-named-volume --name web_app
|
|
|
|
2. Create volume first & then add it to Container
|
|
|
|
docker volume create --driver fuxi
|
|
--name test_vol
|
|
-o size=1
|
|
-o fstype=ext4
|
|
-o multiattach=true
|
|
|
|
docker run -d -v my-named-volume
|
|
--name web_app
|
|
|
|
I think, we can support both
|
|
|
|
1. To Implement first approach, we need following changes
|
|
* Introduce fields in Container API - volume-driver, vol-name, vol-size.
|
|
* We pass call to Volume Driver to create volume.
|
|
* Volume driver connects to Cinder & handles volume creation.
|
|
* Once volume is created in Cinder, then we finally go add volume-driver
|
|
as Fuxi & add volume name which created in cinder.
|
|
* Fuxi should be installed in Docker host and configured with Cinder engine.
|
|
|
|
2. To Implement Second approach, we need following changes
|
|
* Introduce Volume API in Zun which has fields volume-driver, volume-name,
|
|
volume-size etc.
|
|
* Volume API will connect to volume driver which will sit under
|
|
/zun/volume/driver.py.
|
|
* Volume Driver connects to Cinder and handles volume creation in Cinder.
|
|
* Once the volume is created in Cinder, it communicates to Docker Volume API
|
|
to attach the created volume in Docker.
|
|
* Docker Volume API use --driver=Fuxi which goes talks to Cinder and attach
|
|
created Volume in Docker.
|
|
* Prerequisite here is, Fuxi should be installed on docker host & configured
|
|
with Cinder. If not, it returns the 500 response.
|
|
* Also we need to introduce new Volume table which contains field vol-driver,
|
|
vol-name, vol-size fields.
|
|
* We need to add storage section in conf file, where we can specify some
|
|
default attributes like storage engine Cinder, Cinder endpoint etc.
|
|
* We also need to configure Cinder endpoint in Fuxi conf file.
|
|
* We can use same implementation for Flocker also as it supports Cinder.
|
|
* I think if we can create separate CinderDriver which calls from Volume
|
|
volume driver. This approach enables way to implement multiple storages
|
|
supports in the future and we can plug-in multiple storage implementation.
|
|
|
|
The diagram below offers an overview of the system architecture. The Zun
|
|
service may communicate with Fuxi and fuxi talks to Cinder for volumes.
|
|
|
|
::
|
|
|
|
+---------+
|
|
| CLI |
|
|
+----+----+
|
|
|
|
|
+----+----+
|
|
|+-+ REST +----- Zun ----+|
|
|
|+-- --+|
|
|
|+------------+----------+|
|
|
|
|
|
|+--------------------+ Volume Driver+-------------+|
|
|
|| | | |
|
|
|| | | |
|
|
|| | | |
|
|
|| +-----------+ +---------------+ |
|
|
|| | Cinder | | Docker Volume | |
|
|
|| +-----------+ +---------------+ |
|
|
|| | | |
|
|
|| +---------+ +-----------+ |
|
|
|| | Fuxi | | Flocker | |
|
|
|| +----+----+ +-----------+ |
|
|
|+------------+ +---------------+ +----------------+|
|
|
| |
|
|
+---------------------------------------------------+
|
|
|
|
|
|
Design Principles
|
|
-----------------
|
|
1. Similar user experience between VMs and containers. In particular, the ways
|
|
to configure volumes of a container should be similar as the VM equivalent.
|
|
2. Full-featured container APIs.
|
|
|
|
|
|
Alternatives
|
|
------------
|
|
1. We can use rexray for storage support, its again third party tool which
|
|
increases the dependency.
|
|
|
|
Data model impact
|
|
-----------------
|
|
Add volume-driver, vol-name, size field in the Volume Table.
|
|
Need to add volume_id to Container Table.
|
|
|
|
|
|
REST API impact
|
|
---------------
|
|
We need to add below APIs
|
|
1. Create a volume - POST /v1/volumes
|
|
2. List volumes - GET /v1/volumes
|
|
3. Inspect volume - GET /v1/volumes/<uuid>
|
|
4. Delect Volume - DELETE /v1/volumes/<uuid>
|
|
|
|
Security impact
|
|
---------------
|
|
None
|
|
|
|
|
|
Notifications impact
|
|
--------------------
|
|
None
|
|
|
|
|
|
Other end user impact
|
|
---------------------
|
|
None
|
|
|
|
|
|
Performance Impact
|
|
------------------
|
|
None
|
|
|
|
Other deployer impact
|
|
---------------------
|
|
Deployers need to deploy a Fuxi and Cinder.
|
|
|
|
|
|
Developer impact
|
|
----------------
|
|
None
|
|
|
|
|
|
Implementation
|
|
==============
|
|
|
|
|
|
Assignee(s)
|
|
-----------
|
|
|
|
Primary assignee:
|
|
Digambar
|
|
|
|
Other contributors:
|
|
|
|
|
|
Work Items
|
|
----------
|
|
1. We need to introduce new Volume API.
|
|
2. Implement volume driver in zun.
|
|
3. Implement Cinder calls under the volume driver.
|
|
4. Implement Docker volume support in Zun.
|
|
5. Add volume section in zun.conf.
|
|
6. Add volume-driver support in CLI.
|
|
7. Implement unit/integration test.
|
|
|
|
|
|
Dependencies
|
|
============
|
|
Add a dependency to Cinder.
|
|
|
|
|
|
Testing
|
|
=======
|
|
Each patch will have unit tests, and Tempest functional tests covered.
|
|
|
|
|
|
Documentation Impact
|
|
====================
|
|
A set of documentation for this new feature will be required.
|