Skip to content

dawanda/mmsd

Repository files navigation

Mesos Marathon Service Discovery Agent

mmsd links your cloud together.

Main features

  • simple
  • realtime update of runtime configuration state (haproxy, upstream-confd, ...)
  • modular handlers
    • haproxy handler to manage a load balancer service
    • upstream-confd handler to manage local upstream config files per application
  • filter apps to be exposed by load balancer (or service files) via labels from marathon app definitions.
  • first-class docker support.
  • DNS based service discovery (supports A and SRV query types).
  • TODO: provide simple rc scripts to run this agent (openrc/upstart/systemd)

Start me Up

mmsd  --marathon-host=localhost --marathon-port=8080

Docker Support

# build mmsd docker container image
docker build -t mmsd .

# run mmsd docker container in background
docker run --net=host -d --name mmsd mmsd \
           --marathon-host=$YOUR_MARATHON_IP --marathon-port=8080

Usage

Usage: mmsd [flags ...]

  --api-port uint
    MMSD API TCP port (default 8082)
  --bind-ip value
    IP address for handlers to bind (default 0.0.0.0)
  --dns-basename string
    DNS service discovery's base name (default "mmsd.")
  --dns-port uint
    DNS service discovery port (default 53)
  --dns-push-srv
    DNS service discovery to also push SRV on A
  --dns-ttl duration
    DNS service discovery's reply message TTL (default 5s)
  --enable-dns
    Enables DNS-based service discovery
  --enable-files
    enables file based service discovery (default true)
  --enable-gateway
    Enables gateway support
  --enable-health-checks
    Enable local health checks (if available) instead of relying on Marathon health checks alone. (default true)
  --enable-tcp
    enables haproxy TCP load balancing (default true)
  --enable-udp
    enables UDP load balancing (default true)
  --filter-groups string
    Application group filter (default "*")
  --gateway-bind value
    gateway bind address (default 0.0.0.0)
  --gateway-port-http uint
    gateway port for HTTP (default 80)
  --gateway-port-https uint
    gateway port for HTTPS (default 443)
  --haproxy-after-cmd string
    Command to execute after Haproxy start/reload
  --haproxy-before-cmd string
    Command to execute before Haproxy start/reload
  --haproxy-bin string
    path to haproxy binary (default "/usr/local/bin/haproxy")
  --haproxy-cfgtail string
    path to haproxy tail config file (default "/etc/mmsd/haproxy-tail.cfg")
  --haproxy-enable-reuse-socket
    Enable haproxy feature to share a socket for listing ports
  --haproxy-port uint
    haproxy management port (default 8081)
  --haproxy-reload-interval duration
    Interval between reload haproxy for bulk changes; default 5s (default 5s)
  --marathon-ip value
    Marathon endpoint TCP IP address (default 127.0.0.1)
  --marathon-port uint
    Marathon endpoint TCP port number (default 8080)
  --reconnect-delay duration
    Marathon reconnect delay (default 4s)
  --run-state-dir string
    Path to directory to keep run-state (default "/var/run/mmsd")
  -v, --verbose
    Set verbosity level
  -V, --version
    Shows version and exits

Upstream Config Files

An application, such as /developer/trapni/php will be written into a upstream-confd file with the name developer.trapni.php.instances with the following content

Service-Name: token
Service-Port: number
Service-Transport-Proto: tcp | udp
Service-Application-Proto: http | redis | redis-master | ...
Health-Check-Proto: tcp | http

host1:port1
host2:port2
host3:port3

Where hostN:portN is the actual host (Mesos Slave) your application has been spawned on.

Your application may read them upon startup and whenever this file changes (in realtime) to always have an up-to-date list of address:port pairs your other application is running on.

Marathon Label Definitions

Label proto = APP_PROTO

an app type name that identifies the given service, such as redis, smtp, ...

Label lb-accept-proxy = 1

Enables proxy-protocol on service port.

Label lb-proxy-protocol = 1 | 2

Enables proxy-protocol to the backend communication. 1 enables proxy-protocol version 1 (clear text) whereas 2 enables version 2 (binary). Any other value does not activate proxy-protocol.

Label lb-group = GROUP_NAME

Load-balancer group this app should be exposed to

Label lb-vhost = VHOST,...

list of virtual hosts to be served on gateway port 80

Label lb-vhost-default = PORT_INDEX

if set, this HTTP application (at port index) will serve as default application on port 80.

Label lb-vhost-ssl = VHOST,...

list of vhosts to be proxied via SSL, with SNI enabled, but no SSL termination performed.

Label lb-vhost-ssl-default = PORT_INDEX

if set, this HTTPS application (at port index) will serve as default application on the application gateway's SSL port (usually 443)

Label proto
  • tcp (default), TCP transport mode and simple TCP-connect health check
  • http HTTP transport mode, with HTTP health check
  • smtp SMTP protococol, enables SMTP-restrictive health check.
  • redis mode tcp and health check is using Redis text protocol
  • redis-master same as redis but only masters will be healthy
  • redis-slave same as redis but only slaves will be healthy
  • ... any other interesting text protocols we can map into haproxy?

Service Discovery HTTP endpoint

  • /v1/apps retrieves the list of all apps in Marathon, one app name by line
  • /v1/instances/NAME retrieves list of instances by hostname:port tuple in each line for given application path, for example: /v1/instances/production/sqltap1

Changelog

Version 0.12.0

New flags:

  • --haproxy-enable-reuse-socket

Version 0.11.0

Following flags are removed:

  • --haproxy-bind
  • --managed-ip

New flags:

  • --api-port
  • --bind-ip
  • --haproxy-before-cmd
  • --haproxy-after-cmd