## Networking support in Mesos ### Table of contents - [Introduction](#introduction) - [Attaching containers to IP networks](#attaching-containers) - [Mesos containerizer](#attaching-containers-mesos) - [Docker containerizer](#attaching-containers-docker) - [Limitations of Docker containerizer](#limitations-docker) - [Retrieving network information for a container](#retrieve-network-info) ### Introduction Mesos supports two container runtime engines, the `MesosContainerizer` and the `DockerContainerizer`. Both the container run time engines provide IP-per-container support allowing containers to be attached to different types of IP networks. However, the two container run time engines differ in the way IP-per-container support is implemented. The `MesosContainerizer` uses the `network/cni` isolator to implement the [Container Network Interface (CNI)](https://github.com/containernetworking/cni/blob/master/SPEC.md) to provide networking support for Mesos containers, while the `DockerContainerizer` relies on the Docker daemon to provide networking support using Docker's [Container Network Model](https://github.com/docker/libnetwork). Note that while IP-per-container is one way to achieve network isolation between containers, there are other alternatives to implement network isolation within `MesosContainerizer`, e.g., using the [port-mapping network isolator](isolators/network-port-mapping.md). While the two container run-time engines use different mechanisms to provide networking support for containers, the interface to specify the network that a container needs to join, and the interface to retrieve networking information for a container remain the same. The `NetworkInfo` protobuf, described below, is the interface provided by Mesos to specify network related information for a container and to learn network information associated with a container. ```{.proto} message NetworkInfo { enum Protocol { IPv4 = 1; IPv6 = 2; } message IPAddress { optional Protocol protocol = 1; optional string ip_address = 2; } repeated IPAddress ip_addresses = 5; optional string name = 6; repeated string groups = 3; optional Labels labels = 4; }; ``` This document describes the usage of the `NetworkInfo` protobuf, by frameworks, to attach containers to IP networks. It also describes the interfaces provided to retrieve IP address and other network related information for a container, once the container has been attached to an IP network. ### Attaching containers to IP networks #### Mesos containerizer `MesosContainerizer` has the [`network/cni`](cni.md) isolator enabled by default, which implements CNI (Container Network Interface). The `network/cni` isolator identifies CNI networks by using canonical names. When frameworks want to associate containers to a specific CNI network they specify a network name in the `name` field of the ` NetworkInfo` protobuf. Details about the configuration and interaction of Mesos containers with CNI networks can be found in the documentation describing ["CNI support for Mesos containers"](cni.md). #### Docker containerizer Starting docker 1.9, there are four networking modes available in Docker: NONE, HOST, BRIDGE and USER. ["Docker container networks"](https://docs.docker.com/engine/userguide/networking/dockernetworks/) provides more details about the various networking modes available in docker. Mesos supports all the four networking modes provided by Docker. To connect a docker container using a specific mode the framework needs to specify the network mode in the `DockerInfo` protobuf. ```{.proto} message DockerInfo { // The docker image that is going to be passed to the registry. required string image = 1; // Network options. enum Network { HOST = 1; BRIDGE = 2; NONE = 3; USER = 4; } optional Network network = 2 [default = HOST]; }; ``` For `NONE`, `HOST`, and `BRIDGE` network mode the framework only needs to specify the network mode in the `DockerInfo` protobuf. To use other networks, such as `MACVLAN` on Linux, `TRANSPARENT` and `L2BRIDGE` on Windows, or any other user-defined network, the network needs to be created beforehand and the `USER` network mode needs to be chosen. For the `USER` mode, since a user-defined docker network is identified by a canonical network name (similar to CNI networks) apart from setting the network mode in `DockerInfo` the framework also needs to specify the `name` field in the `NetworkInfo` protobuf corresponding to the name of the user-defined docker network. Note that on Windows, the `HOST` network mode is not supported. Although the `BRIDGE` network mode does not exist on Windows, it has an equivalent mode called `NAT`, so on Windows agents, the `BRIDGE` mode will be interpretted as `NAT`. If the network mode is not specified, then the default mode will be chosen, which is `HOST` on Linux and `NAT` on Windows. #### Limitations of Docker containerizer One limitation that the `DockerContainerizer` imposes on the containers using the USER network mode is that these containers cannot be attached to multiple docker networks. The reason this limitation exists is that to connect a container to multiple Docker networks, Docker requires the container to be created first and then attached to the different networks. This model of orchestration does not fit the current implementation of the `DockerContainerizer` and hence the restriction of limiting docker container to a single network. ### Retrieving network information for a container Whenever a task runs on a Mesos agent, the executor associated with the task returns a `TaskStatus` protobuf associated with the task. Containerizers (Mesos or Docker) responsible for the container will populate the `ContainerStatus` protobuf associated with the `TaskStatus`. The `ContainerStatus` will contain multiple `NetworkInfo` protobuf instances, one each for the interfaces associated with the container. Any IP address associated with the container will be reflected in the `NetworkInfo` protobuf instances. The `TaskStatus` associated with each task can be accessed at the Agent's `state` endpoint on which the task is running or it can be accessed in the Master's `state` endpoint.