Merge "Design spec for interactive mode support in Zun"
This commit is contained in:
commit
7489bb6430
145
specs/container-interactive-mode.rst
Normal file
145
specs/container-interactive-mode.rst
Normal file
@ -0,0 +1,145 @@
|
|||||||
|
..
|
||||||
|
This work is licensed under a Creative Commons Attribution 3.0 Unported
|
||||||
|
License.
|
||||||
|
|
||||||
|
http://creativecommons.org/licenses/by/3.0/legalcode
|
||||||
|
|
||||||
|
==========================
|
||||||
|
Container Interactive mode
|
||||||
|
==========================
|
||||||
|
Related Launchpad Blueprint:
|
||||||
|
|
||||||
|
https://blueprints.launchpad.net/zun/+spec/support-interactive-mode
|
||||||
|
|
||||||
|
Zun needs to support the function that the interactive mode which is the
|
||||||
|
basic function in Docker and rkt. Currently user can run commands inside a
|
||||||
|
container using zun. With interactive mode, users will be able to perform
|
||||||
|
interactive operations on these containers using Zun APIs.
|
||||||
|
|
||||||
|
The implementation of interactive mode is driver-specific. Each driver needs to
|
||||||
|
implement this function needs to do different thing about API command and
|
||||||
|
interactive interface. Take docker driver as the first container driver.
|
||||||
|
|
||||||
|
Problem description
|
||||||
|
===================
|
||||||
|
Zun containers now take Docker as the first container driver. Docker can use
|
||||||
|
"docker run -it" to enter into the interactive mode, where user can do operations
|
||||||
|
looks like chroot. Zun use docker-py as the interface to get access the docker
|
||||||
|
deamon.
|
||||||
|
|
||||||
|
To reach the goal of realizing the container interactive, zun needs to pass the
|
||||||
|
correct parameters when create container and start container at the time
|
||||||
|
it has been created, so that a tty will be created inside the container. User
|
||||||
|
can connect the stdin, stdout, stderr to get a pseudo tty in local client. Since
|
||||||
|
Kubernetes realize this function, refer to Kubernetes realization is a feasible way.
|
||||||
|
|
||||||
|
https://github.com/kubernetes/kubernetes/pull/3763
|
||||||
|
|
||||||
|
For Kubectl interactive description, go to:
|
||||||
|
http://kubernetes.io/docs/user-guide/kubectl/kubectl_run/
|
||||||
|
|
||||||
|
Proposed change
|
||||||
|
===============
|
||||||
|
1. Let each Docker daemon listens to 0.0.0.0:port, so that zun-api will easily talk
|
||||||
|
with Docker deamon. This might reduce the load on zun-compute a bit and let
|
||||||
|
zun-compute have more rooms to serve other workload.
|
||||||
|
2. For docker daemon, the new two paramaters about tty and stdin_open should
|
||||||
|
be added to the container field and corresponding database.
|
||||||
|
3. Zun api will wait for the container start and get the websocket link to zun CLIs.
|
||||||
|
4. For python-zunclient, it will filter the parameters and pick up the correct
|
||||||
|
for interactive mode. Then will open the connection to container at local
|
||||||
|
terminal after the "zun run" command return. Zun CLIs will directly connect the
|
||||||
|
websocket link from Docker daemon (for authorization problem, will fix it in the
|
||||||
|
follow bp/bug).
|
||||||
|
|
||||||
|
The diagram below offers an overview of the interactive mode architecture.
|
||||||
|
E.g : zun run -it --name test --image cirros --command "/bin/sh"
|
||||||
|
|
||||||
|
The sequence diagram is in this link:
|
||||||
|
https://github.com/kevin-zhaoshuai/workflow
|
||||||
|
|
||||||
|
Design Principles
|
||||||
|
-----------------
|
||||||
|
1. Keep commonality for Docker and other container driver. Easy for other driver
|
||||||
|
integration.
|
||||||
|
2. Take into account all the interactive conditions.
|
||||||
|
3. Pty connection functions need to be independent and extensible
|
||||||
|
|
||||||
|
|
||||||
|
Alternatives
|
||||||
|
------------
|
||||||
|
|
||||||
|
Data model impact
|
||||||
|
-----------------
|
||||||
|
Add some fields to container object, including "tty" "stdin_open" and a flag to show whether the
|
||||||
|
container has been attached, maybe "attached" = "true"/"false".
|
||||||
|
|
||||||
|
REST API impact
|
||||||
|
---------------
|
||||||
|
Add an new API for "zun attach"
|
||||||
|
Zun CLIs will first send the message to zun-api, zun-api will directly talk with Docker
|
||||||
|
daemon. Then after the container is successfully started, zun-api notify
|
||||||
|
zun CLIs with the attach url. Zun CLIs will attach its stdin ,stdout and stderr to
|
||||||
|
the container.
|
||||||
|
Since zun CLIs connect with the websocket in Docker daemon, so that will not hijack HTTP
|
||||||
|
request (from zun CLIs to zun api), user can do another zun api command in another terminal.
|
||||||
|
|
||||||
|
Security impact
|
||||||
|
---------------
|
||||||
|
None
|
||||||
|
|
||||||
|
|
||||||
|
Notifications impact
|
||||||
|
--------------------
|
||||||
|
None
|
||||||
|
|
||||||
|
|
||||||
|
Other end user impact
|
||||||
|
---------------------
|
||||||
|
None
|
||||||
|
|
||||||
|
|
||||||
|
Performance Impact
|
||||||
|
------------------
|
||||||
|
|
||||||
|
|
||||||
|
Other deployer impact
|
||||||
|
---------------------
|
||||||
|
|
||||||
|
|
||||||
|
Developer impact
|
||||||
|
----------------
|
||||||
|
In the future integration with other container driver, need to tweak some code
|
||||||
|
about client pty connection.
|
||||||
|
|
||||||
|
|
||||||
|
Implementation
|
||||||
|
==============
|
||||||
|
|
||||||
|
|
||||||
|
Assignee(s)
|
||||||
|
-----------
|
||||||
|
|
||||||
|
Primary assignee:
|
||||||
|
Kevin Zhao
|
||||||
|
|
||||||
|
Other contributors:
|
||||||
|
|
||||||
|
|
||||||
|
Work Items
|
||||||
|
----------
|
||||||
|
1. Implement a function for connect the tty inside the container.
|
||||||
|
2. Modify the zun run and zun exec code about the interactive.
|
||||||
|
3. Implement unit/integration test.
|
||||||
|
|
||||||
|
Dependencies
|
||||||
|
============
|
||||||
|
|
||||||
|
Testing
|
||||||
|
=======
|
||||||
|
Each patch will have unit tests.
|
||||||
|
|
||||||
|
|
||||||
|
Documentation Impact
|
||||||
|
====================
|
||||||
|
A set of documentation for this new feature will be required.
|
Loading…
Reference in New Issue
Block a user