Skip to content

tnolet/mesos_on_coreos

Repository files navigation

Mesos-on-coreos

An Ubuntu container for Apache Mesos and Marathon on CoreOS. You can use Deimos in conjunction with Marathon and Mesos to run Docker containers on the CoreOS host that is hosting this container. For more info on Mesos and Marathon, please visit mesosphere.io

Usage

This container has a basic install of Zookeeper, Mesos, Marathon and Deimos. It kick starts a mesos_bootstrap.sh script to configure all the components. For this, it needs some environment variables to be passed in using the -e flag. The MAIN_IP and DOCKER0_IP are required and have no default.

$MAIN_IP         - the IP of the CoreOS host running Docker to which Mesos master and slave can bind (required)
$DOCKER0_IP      - the IP assigned to the docker0 interface on the CoreOS host (required)
$ETCD_PORT       - the port on which ETCD runs on CoreOS (default: 4001)
$ETCD_MESOS_PATH - the path in ETCD where we store Mesos related data (default: /mesos)
$ETCD_TTL        - the TTL used in retrying ETCD calls in seconds (default: 10)

This container relies on a working ETCD connection, typically used with CoreOS.

When no arguments are passed into this script, it will try to dynamically configure a Mesos cluster consisting of:

  • 1 node running a Master, Zookeeper, Marathon and a local slave. Marathon runs in a separate docker container.
  • x slave nodes, depending on the amount of nodes you spin up. The slaves only run the Mesos slave process and Deimos.

Discovery of the Master's IP is done using ETCD. For this to work, all nodes should be in the same ETCD cluster. If automagic setup doesn't work, you can also pass in arguments and the --etcd=false flag to set up Mesos manually.

Example: auto-discovery with ETCD

For example, when you want to start up the whole shebang using auto-discovery.

docker run --rm --name mesos \ 
                --net=host \
                -p 5050:5050 \
                -p 5051:5051 \
                -p 2181:2181 \
                -e MAIN_IP=172.17.8.101 \
                -e DOCKER0_IP=`ifconfig docker0 | grep 'inet ' | awk '{print $2}'` \
                -v /var/lib/docker/btrfs/subvolumes:/var/lib/docker/btrfs/subvolumes \
                -v /var/run/docker.sock:/var/run/docker.sock \
                tnolet/mesos-on-coreos:1.0

Notice we are passing in the PUBLIC_IP environment variable and dynamically grabbing the docker0 IP. Also, we do not run in bridged mode but use the hosts IP network stack. This is important for Mesos masters and slaves for reporting the hosts IP address using Zookeeper.

After the whole thing is started up, the normal API and dashboards are available at the master's IP, e.g 172.17.8.101:5050 for the Mesos dashboard and 172.17.8.101:8080 for Marathon.

Example: manual configuration

When using ETCD for auto-discovery, you need to first start a master passing in the --etcd=false flag. This will start a master and a zookeeper instance in the same container

...
tnolet/mesos-on-coreos:1.0 master --etcd=false

Then start a Marathon container, passing in the zookeeper address for the master. No need to specify the extra etcd flag.

...
tnolet/mesos-on-coreos:1.0 master marathon --master=zk://172.17.8.101:2181/mesos 

Then start a slave container, passing in the zookeeper address for the master. You can boot up as many slaves as you want on as many containers. As longs as they are reachable over the network.

...
tnolet/mesos-on-coreos:1.0 master slave --master=zk://172.17.8.101:2181/mesos

Systemd and Cloud-config

CoreOS uses systemd and cloudconfig to control running services on startup. You can find examples of the above commands in the a handy user-data.yml which you can use with CoreOS to get all this running instantly at boot. You can find it in the https://github.com/tnolet/mesos_on_coreos repo.

AWS and Vagrant

In the https://github.com/tnolet/mesos_on_coreos repo you can also find a pre-configured Vagrantfile and AWS Cloudformation template (aws_cfn_template.json). Passing in a fresh ETCD discovery URL into either using the user-data.yml should get you up and running very fast.

Vagrant example

Set the num_instances option to the total amount of boxes you want to spin up. This includes the master. You can also set the memory and amount of CPU's if you like.

# Vagrantfile
CLOUD_CONFIG_PATH = "./user-data.yml"

$num_instances = 3
$vb_memory = 1024
$vb_cpus = 1

Open the accompanying user-data.yml an paste in a discovery URL from ETCD (found here: http://discovery.etcd.io/new)

#user-data.yml
coreos:
  etcd:
      #generate a new token for each unique cluster from https://discovery.etcd.io/new
      discovery: https://discovery.etcd.io/27f2c10f29cd24a466a634aaabf64b2d

Then do a vagrant up and grab some coffee. It will downloaded CoreOS once and the mesos-on-coreos docker container for each box.

Quick Tip

If you are fed up with downloading containers when developing, save the container to disk and import it when you are booting your Vagrant boxes. It saves a lot of time when you are destroying your Vagrant boxes a lot.

    $ docker save tnolet/mesos-on-coreos > tnolet_mesos-on-coreos.tar

Just mount your disk to Vagrant and import it using this snippet in your Vagrantfile:

DOCKER_UBUNTU_MESOS="tnolet_mesos-on-coreos.tar"

config.vm.synced_folder ".", "/home/core/share", id: "core", :nfs => true, :mount_options => ['nolock,vers=3,udp']
config.vm.provision :shell, :inline => "export TMPDISK=/", :privileged => false
if File.exist?(DOCKER_UBUNTU_MESOS)
    config.vm.provision :shell, :inline => "docker load -i /home/core/share/#{DOCKER_UBUNTU_MESOS}", :privileged => false
end

This was tested on OSX Mavericks.

Todo

  • replace flags with REAL flags that don't depend on the position in cmd line