Skip to content
This repository has been archived by the owner on Jun 1, 2021. It is now read-only.

docker compose setup #15

Open
wants to merge 5 commits into
base: master
Choose a base branch
from
Open
Show file tree
Hide file tree
Changes from 4 commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
2 changes: 2 additions & 0 deletions .gitignore
Original file line number Diff line number Diff line change
Expand Up @@ -2,3 +2,5 @@
.idea/
# name of executable when built using command 'go build'
elektron
# test log directory name.
Elektron-Test-Run*
62 changes: 62 additions & 0 deletions Dockerfile
Original file line number Diff line number Diff line change
@@ -0,0 +1,62 @@
# Copyright (C) 2018 spdfg
#
# This file is part of Elektron.
#
# Elektron is free software: you can redistribute it and/or modify
# it under the terms of the GNU General Public License as published by
# the Free Software Foundation, either version 3 of the License, or
# (at your option) any later version.
#
# Elektron is distributed in the hope that it will be useful,
# but WITHOUT ANY WARRANTY; without even the implied warranty of
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
# GNU General Public License for more details.
#
# You should have received a copy of the GNU General Public License
# along with Elektron. If not, see <http://www.gnu.org/licenses/>.
#

FROM ubuntu:xenial

RUN apt-get update && apt-get -y install \
apt-transport-https \
ca-certificates \
curl \
software-properties-common && \
apt-get install -yq ssh git

RUN add-apt-repository ppa:deadsnakes/ppa && \
apt-get update && \
apt-get install -y python3.7

# Installing performance co-pilot.
RUN apt-get install -y pcp pcp-gui

# The name of the elektron executable.
ARG elektronexecutablename=elektron
ENV ELEKTRON_EXECUTABLE_NAME=$elektronexecutablename

# HOST:PORT of the mesos master.
ARG elektronmesosmasterlocation=localhost:5050
ENV ELEKTRON_MESOS_MASTER_LOCATION=$elektronmesosmasterlocation

# Workload to be scheduled.
ARG elektronworkload=workload_sample.json
ENV ELEKTRON_WORKLOAD=$elektronworkload

# Prefix of the log directory.
ARG elektronlogdirprefix=Elektron-Test-Run
ENV ELEKTRON_LOGDIR_PREFIX=$elektronlogdirprefix

# Hostname/IP Address of the physical machine on which the docker containers are being run.
# This is used to create the pcp config file.
ARG hostip=""
ENV HOST_IP=$hostip

# Creating directory into which the current directory is going to be mounted.
RUN mkdir /elektron
ADD ./ /elektron
WORKDIR /elektron
RUN chmod 777 /elektron/entrypoint.sh

ENTRYPOINT ["/elektron/entrypoint.sh"]
54 changes: 52 additions & 2 deletions README.md
Original file line number Diff line number Diff line change
Expand Up @@ -55,14 +55,64 @@ If vendoring dependencies, then use the below commands after cloning _elektron_.

An alternative is to clone _elektron_ using the command `git clone --recurse-submodules [email protected]:spdfg/elektron.git`.


## Build and Run
## Build
Compile the source code using the `go build` tool as shown below.
```commandline
go build -o elektron
```
Use the `-h` option to get information about other command-line options.

## Run
Elektron can be run on bare-metal or using a docker-compose environment.
### Bare-Metal
Follow instructions [here](http://mesos.apache.org/documentation/latest/building/) to setup a Mesos cluster.
In addition, the following software should be installed.

| Software | Target Machines |
|-----------------------|---------------------------|
| [Performance Co-Pilot](http://pcp.io/) | Mesos master nodes + agent nodes |
| [Docker](https://docs.docker.com/install/linux/docker-ce/ubuntu/) | Mesos agent nodes |

If power consumption needs to be monitored, install the perfevent PMDA by following the instructions [here](https://pcp.io/man/man1/pmdaperfevent.1.html).
_Note: You might need to update the exposed event names for RAPL depending on the architecture_.
For example, update _perfevent.conf_ with the following events if measuring both CPU and DRAM power.
```
rapl::RAPL_ENERGY_PKG node
rapl::RAPL_ENERGY_DRAM node
```

**_Detail document on the bare-metal setup coming up soon!_**

### Docker-Compose
For local testing purposes, the docker-compose setup can be used. Follow instructions [here](https://docs.docker.com/compose/install/) to install docker-compose.

The [entrypoint](./entrypoint.sh) script requires the IP address of the host machine to generate the [PCP config](./config).
On a linux machine, the below command can be used to set it.
```commandline
export HOST_IP=$(curl ifconfig.me)
```

#### Environment Variables
The following are the environment variables required to run _elektron_.

| Environment Variable | Description | Commandline Option (if any) |
|--------------------------------|-------------------------------|-----------------------------|
| ELEKTRON_EXECUTABLE_NAME | Name of the elektron executable. Default = elektron |
| ELEKTRON_MESOS_MASTER_LOCATION | HOST:PORT of the mesos master. Default = localhost:5050 | `-master` |
| ELEKTRON_WORKLOAD | Filename of workload json to be scheduled. Default = workload_sample.json | `-workload` |
| ELEKLTRON_LOGDIR_PREFIX | Prefix of the log directory generated. Default = Elektron-Test-Run | `-logPrefix` |

Use the below command to run elektron using the docker-compose setup.
```commandline
docker-compose run elektron
```
The Mesos master UI can be viewed from the host machine using _http://localhost:5050_.

If any other commandline options need to be specified, for example using the [bin-packing](./schedulers/bin-packing.go) scheduling policy, use the below command.
```commandline
docker-compose run elektron -schedPolicy bin-packing
```

### Workload
Use the `-workload` option to specify the location of the workload json file. Below is an example workload.
```json
Expand Down
103 changes: 103 additions & 0 deletions docker-compose.yaml
Original file line number Diff line number Diff line change
@@ -0,0 +1,103 @@
# Copyright (C) 2018 spdfg
#
# This file is part of Elektron.
#
# Elektron is free software: you can redistribute it and/or modify
# it under the terms of the GNU General Public License as published by
# the Free Software Foundation, either version 3 of the License, or
# (at your option) any later version.
#
# Elektron is distributed in the hope that it will be useful,
# but WITHOUT ANY WARRANTY; without even the implied warranty of
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
# GNU General Public License for more details.
#
# You should have received a copy of the GNU General Public License
# along with Elektron. If not, see <http://www.gnu.org/licenses/>.
#
version: "2"

services:
zk:
image: rdelvalle/zookeeper
restart: on-failure
ports:
- "2181:2181"
environment:
ZK_CONFIG: tickTime=2000,initLimit=10,syncLimit=5,maxClientCnxns=128,forceSync=no,clientPort=2181
ZK_ID: 1
networks:
elektron-cluster:
ipv4_address: 19.16.4.3
logging:
driver: none

mesos-master:
image: rdelvalle/mesos-master:1.5.1
restart: on-failure
ports:
- "5050:5050"
environment:
MESOS_ZK: zk://19.16.4.3:2181/mesos
MESOS_QUORUM: 1
MESOS_HOSTNAME: localhost
MESOS_CLUSTER: test-cluster
MESOS_REGISTRY: replicated_log
MESOS_WORK_DIR: /tmp/mesos
networks:
elektron-cluster:
ipv4_address: 19.16.4.4
logging:
driver: none
depends_on:
- zk

mesos-agent:
image: pkaushi1/mesos-agent-elektron:1.5.1
Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

We own the organization spdf at dockerhub https://hub.docker.com/orgs/spdf/repositories

Copy link
Collaborator Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Good to know. I'll push the image there then.

pid: host
restart: on-failure
ports:
- "5051:5051"
environment:
MESOS_MASTER: zk://19.16.4.3:2181/mesos
MESOS_CONTAINERIZERS: mesos,docker
MESOS_ISOLATION: cgroups/cpu
MESOS_PORT: 5051
MESOS_HOSTNAME: localhost
MESOS_RESOURCES: ports(*):[11000-11999]
MESOS_SYSTEMD_ENABLE_SUPPORT: 'false'
MESOS_WORK_DIR: /tmp/mesos
networks:
elektron-cluster:
ipv4_address: 19.16.4.5
logging:
driver: none
volumes:
- /sys/fs/cgroup:/sys/fs/cgroup
- /var/run/docker.sock:/var/run/docker.sock
depends_on:
- mesos-master

elektron:
image: pkaushi1/elektron:v1
restart: on-failure
environment:
ELEKTRON_EXECUTABLE_NAME: elektron
ELEKTRON_WORKLOAD: workload_sample.json
ELEKTRON_MESOS_MASTER_LOCATION: 19.16.4.4:5050
ELEKTRON_LOGDIR_PREFIX: Elektron-Test-Run
HOST_IP: ${HOST_IP}
networks:
elektron-cluster:
ipv4_address: 19.16.4.6
volumes:
- ./:/elektron
depends_on:
- mesos-agent

networks:
elektron-cluster:
ipam:
config:
- subnet: 19.16.4.0/16
gateway: 19.16.4.1
33 changes: 33 additions & 0 deletions entrypoint.sh
Original file line number Diff line number Diff line change
@@ -0,0 +1,33 @@
#!/usr/bin/env bash
# Copyright (C) 2018 spdfg
#
# This file is part of Elektron.
#
# Elektron is free software: you can redistribute it and/or modify
# it under the terms of the GNU General Public License as published by
# the Free Software Foundation, either version 3 of the License, or
# (at your option) any later version.
#
# Elektron is distributed in the hope that it will be useful,
# but WITHOUT ANY WARRANTY; without even the implied warranty of
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
# GNU General Public License for more details.
#
# You should have received a copy of the GNU General Public License
# along with Elektron. If not, see <http://www.gnu.org/licenses/>.
#

# Accessing host machine's ip address.
hostip=$HOST_IP

# setting up metrics to be monitored.
# creating PCP config with the cpu and memory usage metrics to be monitored.
cat >config <<EOL
${hostip}:kernel.all.cpu.user
${hostip}:kernel.all.cpu.sys
${hostip}:kernel.all.cpu.idle
${hostip}:mem.util.free
${hostip}:mem.util.used
EOL

./$ELEKTRON_EXECUTABLE_NAME -m $ELEKTRON_MESOS_MASTER_LOCATION -w $ELEKTRON_WORKLOAD -p $ELEKTRON_LOGDIR_PREFIX $@