Marathoner is a service discovery for marathon. It publishes
service ports from marathon on desired interface so you always
talk to 127.0.0.1
and known port. It manages haproxy and
ensures that configuration is updated as soon as there are
changes in running marathon tasks.
Marathoner consists of two parts:
You would probably want to run 3-5 updaters (one per marathon server) and listeners on each node for high availability.
You can also run optional logger to log every state change that happens.
+---------+ +---------+ +---------+
|marathon1| |marathon2| |marathon3|
+----^----+ +----^----+ +----^----+
| | |
| | |
^-------------^-------------^ polling random alive marathon
| | |
+---+---+ +---+---+ +---+---+
|updater| |updater| |updater|
+---+---+ +---+---+ +---+---+
| | |
| | | pushing to every connected client
| | |
+-----v------+------v------+------v------+
| | | |
| | | |
+----v----+ +----v----+ +----v----+ +----v----+
|listener1| |listener1| |listener1| |listener1|
+----+----+ +----+----+ +----+----+ +----+----+
| | | |
| | | | reloading local haproxy
| | | |
+---v---+ +---v---+ +---v---+ +---v---+
|haproxy| |haproxy| |haproxy| |haproxy|
+---^---+ +---^---+ +---^---+ +---^---+
| | | |
| | | | apps talk to local haproxy
| | | |
+-+-+ +-+-+ +-+-+ +-+-+
|app| |app| |app| |app|
+---+ +---+ +---+ +---+
Marathoner is designed to run in docker containers.
The following command runs marathoner updater with update interval of 1 second and two marathon hosts. Updater is reachable at port 7676.
docker run -d -p 7676:7676 bobrik/marathoner-updater:1.10 \
-m http://marathon1:8080,http://marathon2:8080 -i 1
The following command runs marathoner listener with
two updaters and publishes apps on 127.0.0.1
.
Notice that you need to run listener with --net=host
.
docker run -d --net=host bobrik/marathoner-listener:1.10 \
-u marathoner-updater1:7676,marathoner-updater2:7676 -b 127.0.0.1
The following command runs marathoner logger with specified updater and logs state changes to stdout:
docker run --rm bobrik/marathoner-logger:1.10 -u marathoner-updater1:7676
Marathon apps that needs to be exported should have label
marathoner_haproxy_enabled
set to true
.
If you made some changes and wish to check how they work, ./containers/make.sh
could help you with building containers. Just run:
# build listener image with the name my-listener
./containers/make.sh listener my-listener
# build updater image with the name my-updater
./containers/make.sh updater my-updater
# build logger image with the name my-logger
./containers/make.sh updater my-logger
/v2/apps?embed=apps.tasks
instead of /v2/tasks
startedAt
from marathon