Change-Id: I342f4f86337cdc08668cf089e6a6ed90e12b00ff
7.8 KiB
Container Sandbox
Related Launchpad Blueprint:
https://blueprints.launchpad.net/zun/+spec/neutron-integration
Zun needs to manage containers as well as their associated IaaS
resources, such as IP addresses, security groups, ports, volumes, etc..
To decouple the management of containers from their associated
resources, we proposed to introduce a new concept called
sandbox
.
A sandbox represents an isolated environment for one or multiple containers. The primary responsibility of sandbox is to provision and manage IaaS resources associated with a container or a group of containers. In this model, each container must have a sandbox, and resources (i.e. Neutron ports) are attached to sandboxes (instead of directly being attached to containers).
The implementation of sandbox is driver-specific. Each driver needs to implement the sandbox interface (as well as the container interface). For docker driver, sandbox can be implemented by using docker container itself. In this case, creating a container in Zun might create two docker containers internally: a sandbox container and a 'real' container. The real container might use the sandbox container as a proxy for networking, storage, or others. Alternatively, users might create a container in an existing sandbox if they don't want to create an extra sandbox.
Problem description
Zun containers and Nova instances share the common needs for networking, storage, scheduling, host management, quota management, and many others. On the one hand, it is better to consolidate the management containers and Nova instances to minimize the duplication, but on the other hand, Zun needs to expose container-specific features that might go beyond the Nova APIs.
To provide a full-featured container experience with minimized duplication with Nova, an approach is to decouple the management of containers (implemented in Zun) from management of other resources (implemented in Nova). This motivates the introduction of sandbox that can be implemented as a docker container provisioned by Nova. As a result, we obtain flexibility to offload complex tasks to Nova.
Proposed change
- Introduce a new abstraction called
sandbox
. Sandbox represents an isolated environment for one or multiple containers. All drivers are required to implement the sandbox abstraction with business logic to create and manage the isolated environment. For Linux container, an isolated environment can be implemented by using various Linux namespaces (i.e. pid, net, or ipc namespace). - For docker container, its sandbox could be implemented by using
docker container itself. The sandbox container might not do anything
real, but has one or multiple Neutron ports (or other resources)
attached. The sandbox container is provisioned and managed by Nova (with
a Zun-provided docker virt-driver). After the sandbox container is
created, the real container can be created with the options
--net=container:<sandbox>
,--ipc=container:<sandbox>
,--pid=container:<sandbox>
and/or--volumes-from=<sandbox>
. This will create a container by joining the namespaces of the sandbox container so that resources in sandbox container can be shared. - The design should be extensible so that operators can plug-in their own drivers if they are not satisfied by the built-in sandbox implementation(s).
The diagram below offers an overview of the system architecture. The Zun service may communicate with Nova to create a sandbox that is actually a docker container. Like normal Nova instances, sandboxes are scheduled by Nova scheduler and have Neutron ports attached for providing networking. Containers are created by Zun, and run inside the namespaces of sandboxes. Note that a sandbox can contain one or multiple containers. All containers in a sandbox will be co-located and share the Linux namespaces of the sandbox.
+---------+
| CLI |
+----+----+
|
+----+----+
+-------- Nova -------+ +-+ REST +----- Zun -----+
| | | +---------+ |
| +--+ |
| | | |
+-----------+---------+ +---------------+-----------+
| |
+-----------|----+ Compute Host ---------|-----------+
| +------+-------+ +-----+-----+ |
| +--+ Nova Compute +--+ +---+ Zun Agent +-+ |
| | +--------------+ | | +-----------+ | |
| | | | | |
| | +-----+-------|---+ | |
| | | | | | |
| +-- Sandbox -+ +-- Sandbox --|-+ +-- Sandbox --|-+ |
| | | | | | | | | |
| | | | +-----------+ | | +-----------+ | |
| | | | | Container | | | | Container | | |
| | | | +-----------+ | | +-----------+ | |
| | | | | | +-----------+ | |
| | | | | | | Container | | |
| | | | | | +-----------+ | |
| | | | | | | |
| +------------+ +---------------+ +---------------+ |
| |
+----------------------------------------------------+
Design Principles
- Minimum duplication between Nova and Zun. If possibly, reuse everything that has been implemented in Nova.
- Similar user experience between VMs and containers. In particular, the ways to configure networking of a container should be similar as the VM equivalent.
- Full-featured container APIs.
Alternatives
- Directly bind resources (i.e. Neutron ports) to containers. This will have a large amount of duplication between Nova and Zun.
- Use Kuryr. Kuryr is designed for users who use native tool (i.e. docker CLI) to manage containers. In particular, what Kuryr provided to translate API calls to docker to API calls to Neutron. Zun doesn't expose native APIs to end-users so Kuryr cannot address Zun's use cases.
Data model impact
Add a 'sandbox' table. Add a foreign key 'sandbox_id' to the existing table 'container'.
REST API impact
- Add an new API endpoint /sandboxes to the REST API interface.
- In the API endpoint of creating a container, add a new option to specify the sandbox where the container will be created from. If the sandbox is not specified, Zun will create a new sandbox for the container.
Security impact
None
Notifications impact
None
Other end user impact
None
Performance Impact
Performance penalty is expected since provisioning sandboxes take extra compute resources. In addition, the Nova API will be used to create sandboxes, which might also incur performance penalty.
Other deployer impact
Deployers need to deploy a custom Nova virt-driver for provisioning sandboxes.
Developer impact
None
Implementation
Assignee(s)
Primary assignee: Hongbin Lu
Other contributors:
Work Items
- Implement a custom Nova virt-driver to provision sandboxes.
- Implement a new API endpoint for sandboxes.
- Implement unit/integration test.
Dependencies
Add a dependency to Nova
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.