Ecosyste.ms: Awesome
An open API service indexing awesome lists of open source software.
https://github.com/bobrik/marathoner
Service discovery for marathon
https://github.com/bobrik/marathoner
Last synced: 2 months ago
JSON representation
Service discovery for marathon
- Host: GitHub
- URL: https://github.com/bobrik/marathoner
- Owner: bobrik
- Created: 2015-01-06T09:32:23.000Z (over 9 years ago)
- Default Branch: master
- Last Pushed: 2015-08-25T09:04:28.000Z (almost 9 years ago)
- Last Synced: 2024-04-14T15:52:49.673Z (2 months ago)
- Language: Go
- Size: 252 KB
- Stars: 26
- Watchers: 6
- Forks: 5
- Open Issues: 1
-
Metadata Files:
- Readme: README.md
Lists
- awesome-mesos - Marathoner - Service discovery in Marathon (Service discovery and Load balancing / Networking)
README
# Marathoner
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:
* Listeners listen for updates and handles config update and haproxy reload.
* Updaters keep track of running and healthy apps and pushes changes to listeners.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.
## Ascii view
```
+---------+ +---------+ +---------+
|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|
+---+ +---+ +---+ +---+```
## Features
* Nearly zero configuration, everything needed is in marathon.
* Both components are independent and share nothing for high availability.
* Marathon api is only used by updaters, thus reducing load on marathon.
* Health check awareness, only healthy tasks are added to haproxy.
* Nothing breaks if marathon goes down for some reason.
* Listeners do nothing if no changes happen in marathon, no polling involved.
* Graceful restarts and config checking for haproxy to avoid downtime.
* Services available externally and internally without any app code changes.## Usage
Marathoner is designed to run in docker containers.
### Updater
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
```### Listener
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
```### Logger
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
```### Exposing apps
Marathon apps that needs to be exported should have label
`marathoner_haproxy_enabled` set to `true`.## Building
If you made some changes and wish to check how they work, `./containers/make.sh`
could help you with building containers. Just run:```sh
# 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
```## Version history
* 1.10
* Updater: only asking for apps with marathoner enabled
* 1.9
* Updater: 20 second timeout for getting state from marathon
* 1.8
* Listener: Configuring timeout to kill previous haproxy instances
* 1.7
* Listener: Fixed backports repo for haproxy
* Listener: Haproxy is launched and managed entirely from listener
* Listener: Constant retry in listener loop
* Listener: Externalized haproxy template
* Listener: Added labels to HaproxyApp structure
* Listener: Only apps with marathoner_haproxy_enabled label set to true appear in haproxy
* 1.6
* Higher timeouts for idle connections, more connections (only listener)
* 1.5
* Removed port range support since it required coordination
* Logging current updater endpoint in listener and logger
* Worakround for https://github.com/mesosphere/marathon/issues/1106
* 1.4
* Added labels for apps
* Using `/v2/apps?embed=apps.tasks` instead of `/v2/tasks`
* Using `startedAt` from marathon
* Depends on unreleased yet marathon 0.8.0
* Port range support
* golint fixes
* 1.3
* seeding random generator for better load distribution
* 1.2
* added logger container
* 1.1
* updater: avoid adding tasks that are not started
* 1.0
* first public version## TODO
* tagged automated builds with godep maybe
* exit trap in listener for faster exit