Skip to content

Traefik & Marathon

Traefik can be configured to use Marathon as a provider.

For additional information, refer to Marathon user guide.

Configuration Examples

Configuring Marathon & Deploying / Exposing Applications

Enabling the Marathon provider

[providers.marathon]
providers:
  marathon: {}
--providers.marathon=true

Attaching labels to Marathon applications

{
    "id": "/whoami",
    "container": {
        "type": "DOCKER",
        "docker": {
            "image": "traefik/whoami",
            "network": "BRIDGE",
            "portMappings": [
                {
                    "containerPort": 80,
                    "hostPort": 0,
                    "protocol": "tcp"
                }
            ]
        }
    },
    "labels": {
        "traefik.http.Routers.app.Rule": "PathPrefix(`/app`)"
    }
}

Routing Configuration

See the dedicated section in routing.

Provider Configuration

basic

Optional

Enables Marathon basic authentication.

[providers.marathon.basic]
  httpBasicAuthUser = "foo"
  httpBasicPassword = "bar"
providers:
  marathon:
    basic:
      httpBasicAuthUser: foo
      httpBasicPassword: bar
--providers.marathon.basic.httpbasicauthuser=foo
--providers.marathon.basic.httpbasicpassword=bar

dcosToken

Optional

Datacenter Operating System (DCOS) Token for DCOS environment.

If set, it overrides the Authorization header.

[providers.marathon]
  dcosToken = "xxxxxx"
  # ...
providers:
  marathon:
    dcosToken: "xxxxxx"
    # ...
--providers.marathon.dcosToken=xxxxxx

defaultRule

Optional, Default=Host(`{{ normalize .Name }}`)

The default host rule for all services.

For a given application, if no routing rule was defined by a label, it is defined by this defaultRule instead.

It must be a valid Go template, and can include sprig template functions.

The app ID can be accessed with the Name identifier, and the template has access to all the labels defined on this Marathon application.

[providers.marathon]
  defaultRule = "Host(`{{ .Name }}.{{ index .Labels \"customLabel\"}}`)"
  # ...
providers:
  marathon:
    defaultRule: "Host(`{{ .Name }}.{{ index .Labels \"customLabel\"}}`)"
    # ...
--providers.marathon.defaultRule=Host(`{{ .Name }}.{{ index .Labels \"customLabel\"}}`)
# ...

dialerTimeout

Optional, Default=5s

Amount of time the Marathon provider should wait before timing out, when trying to open a TCP connection to a Marathon master.

The value of dialerTimeout should be provided in seconds or as a valid duration format, see time.ParseDuration.

[providers.marathon]
  dialerTimeout = "10s"
  # ...
providers:
  marathon:
    dialerTimeout: "10s"
    # ...
--providers.marathon.dialerTimeout=10s

endpoint

Optional, Default=http://127.0.0.1:8080

Marathon server endpoint.

You can optionally specify multiple endpoints.

[providers.marathon]
  endpoint = "http://10.241.1.71:8080,10.241.1.72:8080,10.241.1.73:8080"
  # ...
providers:
  marathon:
    endpoint: "http://10.241.1.71:8080,10.241.1.72:8080,10.241.1.73:8080"
    # ...
--providers.marathon.endpoint=http://10.241.1.71:8080,10.241.1.72:8080,10.241.1.73:8080

exposedByDefault

Optional, Default=true

Exposes Marathon applications by default through Traefik.

If set to false, applications that do not have a traefik.enable=true label are ignored from the resulting routing configuration.

For additional information, refer to Restrict the Scope of Service Discovery.

[providers.marathon]
  exposedByDefault = false
  # ...
providers:
  marathon:
    exposedByDefault: false
    # ...
--providers.marathon.exposedByDefault=false
# ...

constraints

Optional, Default=""

The constraints option can be set to an expression that Traefik matches against the application labels to determine whether to create any route for that application. If none of the application labels match the expression, no route for that application is created. In addition, the expression is also matched against the application constraints, such as described in Marathon constraints. If the expression is empty, all detected applications are included.

The expression syntax is based on the Label("key", "value"), and LabelRegex("key", "value") functions, as well as the usual boolean logic. In addition, to match against Marathon constraints, the function MarathonConstraint("field:operator:value") can be used, where the field, operator, and value parts are concatenated in a single string using the : separator.

Constraints Expression Examples
# Includes only applications having a label with key `a.label.name` and value `foo`
constraints = "Label(`a.label.name`, `foo`)"
# Excludes applications having any label with key `a.label.name` and value `foo`
constraints = "!Label(`a.label.name`, `value`)"
# With logical AND.
constraints = "Label(`a.label.name`, `valueA`) && Label(`another.label.name`, `valueB`)"
# With logical OR.
constraints = "Label(`a.label.name`, `valueA`) || Label(`another.label.name`, `valueB`)"
# With logical AND and OR, with precedence set by parentheses.
constraints = "Label(`a.label.name`, `valueA`) && (Label(`another.label.name`, `valueB`) || Label(`yet.another.label.name`, `valueC`))"
# Includes only applications having a label with key `a.label.name` and a value matching the `a.+` regular expression.
constraints = "LabelRegex(`a.label.name`, `a.+`)"
# Includes only applications having a Marathon constraint with field `A`, operator `B`, and value `C`.
constraints = "MarathonConstraint(`A:B:C`)"
# Uses both Marathon constraint and application label with logical operator.
constraints = "MarathonConstraint(`A:B:C`) && Label(`a.label.name`, `value`)"

For additional information, refer to Restrict the Scope of Service Discovery.

[providers.marathon]
  constraints = "Label(`a.label.name`,`foo`)"
  # ...
providers:
  marathon:
    constraints: "Label(`a.label.name`,`foo`)"
    # ...
--providers.marathon.constraints=Label(`a.label.name`,`foo`)
# ...

forceTaskHostname

Optional, Default=false

By default, the task IP address (as returned by the Marathon API) is used as backend server if an IP-per-task configuration can be found; otherwise, the name of the host running the task is used. The latter behavior can be enforced by setting this option to true.

[providers.marathon]
  forceTaskHostname = true
  # ...
providers:
  marathon:
    forceTaskHostname: true
    # ...
--providers.marathon.forceTaskHostname=true
# ...

keepAlive

Optional, Default=10s

Set the TCP Keep Alive duration for the Marathon HTTP Client. The value of keepAlive should be provided in seconds or as a valid duration format, see time.ParseDuration.

[providers.marathon]
  keepAlive = "30s"
  # ...
providers:
  marathon:
    keepAlive: "30s"
    # ...
--providers.marathon.keepAlive=30s
# ...

respectReadinessChecks

Optional, Default=false

Applications may define readiness checks which are probed by Marathon during deployments periodically, and these check results are exposed via the API. Enabling respectReadinessChecks causes Traefik to filter out tasks whose readiness checks have not succeeded. Note that the checks are only valid during deployments.

See the Marathon guide for details.

[providers.marathon]
  respectReadinessChecks = true
  # ...
providers:
  marathon:
    respectReadinessChecks: true
    # ...
--providers.marathon.respectReadinessChecks=true
# ...

responseHeaderTimeout

Optional, Default=60s

Amount of time the Marathon provider should wait before timing out when waiting for the first response header from a Marathon master.

The value of responseHeaderTimeout should be provided in seconds or as a valid duration format, see time.ParseDuration.

[providers.marathon]
  responseHeaderTimeout = "66s"
  # ...
providers:
  marathon:
    responseHeaderTimeout: "66s"
    # ...
--providers.marathon.responseHeaderTimeout=66s
# ...

tls

Optional

tls.ca

Certificate Authority used for the secure connection to Marathon.

[providers.marathon.tls]
  ca = "path/to/ca.crt"
providers:
  marathon:
    tls:
      ca: path/to/ca.crt
--providers.marathon.tls.ca=path/to/ca.crt

tls.caOptional

The value of tls.caOptional defines which policy should be used for the secure connection with TLS Client Authentication to Marathon.

If tls.ca is undefined, this option will be ignored, and no client certificate will be requested during the handshake. Any provided certificate will thus never be verified.

When this option is set to true, a client certificate is requested during the handshake but is not required. If a certificate is sent, it is required to be valid.

When this option is set to false, a client certificate is requested during the handshake, and at least one valid certificate should be sent by the client.

[providers.marathon.tls]
  caOptional = true
providers:
  marathon:
    tls:
      caOptional: true
--providers.marathon.tls.caOptional=true

tls.cert

Public certificate used for the secure connection to Marathon.

[providers.marathon.tls]
  cert = "path/to/foo.cert"
  key = "path/to/foo.key"
providers:
  marathon:
    tls:
      cert: path/to/foo.cert
      key: path/to/foo.key
--providers.marathon.tls.cert=path/to/foo.cert
--providers.marathon.tls.key=path/to/foo.key

tls.key

Private certificate used for the secure connection to Marathon.

[providers.marathon.tls]
  cert = "path/to/foo.cert"
  key = "path/to/foo.key"
providers:
  marathon:
    tls:
      cert: path/to/foo.cert
      key: path/to/foo.key
--providers.marathon.tls.cert=path/to/foo.cert
--providers.marathon.tls.key=path/to/foo.key

tls.insecureSkipVerify

If insecureSkipVerify is true, the TLS connection to Marathon accepts any certificate presented by the server regardless of the hostnames it covers.

[providers.marathon.tls]
  insecureSkipVerify = true
providers:
  marathon:
    tls:
      insecureSkipVerify: true
--providers.marathon.tls.insecureSkipVerify=true

tlsHandshakeTimeout

Optional, Default=5s

Amount of time the Marathon provider should wait before timing out, when waiting for the TLS handshake to complete.

The value of tlsHandshakeTimeout should be provided in seconds or as a valid duration format, see time.ParseDuration.

[providers.marathon]
  responseHeaderTimeout = "10s"
  # ...
providers:
  marathon:
    responseHeaderTimeout: "10s"
    # ...
--providers.marathon.responseHeaderTimeout=10s
# ...

trace

Optional, Default=false

Displays additional provider logs when available.

[providers.marathon]
  trace = true
  # ...
providers:
  marathon:
    trace: true
    # ...
--providers.marathon.trace=true
# ...

watch

Optional, Default=true

When set to true, watches for Marathon changes.

[providers.marathon]
  watch = false
  # ...
providers:
  marathon:
    watch: false
    # ...
--providers.marathon.watch=false
# ...