Skip to content

Traefik & Rancher

A Story of Labels, Services & Containers

Rancher

Attach labels to your services and let Traefik do the rest!

This provider is specific to Rancher 1.x.

Rancher 2.x requires Kubernetes and does not have a metadata endpoint of its own for Traefik to query. As such, Rancher 2.x users should utilize the Kubernetes CRD provider directly.

Configuration Examples

Configuring Rancher & Deploying / Exposing Services

Enabling the Rancher provider

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

Attaching labels to services

labels:
  - traefik.http.services.my-service.rule=Host(`example.com`)

Routing Configuration

See the dedicated section in routing.

Provider Configuration

Browse the Reference

For an overview of all the options that can be set with the Rancher provider, see the following snippets:

# Enable Rancher Provider.
providers:
  rancher:

  # Expose Rancher services by default in Traefik.
  exposedByDefault: true

  # Enable watch Rancher changes.
  watch: true

  # Filter services with unhealthy states and inactive states.
  enableServiceHealthFilter: true

  # Defines the polling interval (in seconds).
  refreshSeconds: 15

  # Poll the Rancher metadata service for changes every `rancher.refreshSeconds`, which is less accurate
  intervalPoll: false

  # Prefix used for accessing the Rancher metadata service
  prefix: /latest
# Enable Rancher Provider.
[providers.rancher]

  # Expose Rancher services by default in Traefik.
  exposedByDefault = true

  # Enable watch Rancher changes.
  watch = true

  # Filter services with unhealthy states and inactive states.
  enableServiceHealthFilter = true

  # Defines the polling interval (in seconds).
  refreshSeconds = 15

  # Poll the Rancher metadata service for changes every `rancher.refreshSeconds`, which is less accurate
  intervalPoll = false

  # Prefix used for accessing the Rancher metadata service
  prefix = "/latest"
# Enable Rancher Provider.
--providers.rancher=true

# Expose Rancher services by default in Traefik.
--providers.rancher.exposedByDefault=true

# Enable watch Rancher changes.
--providers.rancher.watch=true

# Filter services with unhealthy states and inactive states.
--providers.rancher.enableServiceHealthFilter=true

# Defines the polling interval (in seconds).
--providers.rancher.refreshSeconds=15

# Poll the Rancher metadata service for changes every `rancher.refreshSeconds`, which is less accurate
--providers.rancher.intervalPoll=false

# Prefix used for accessing the Rancher metadata service
--providers.rancher.prefix=/latest

exposedByDefault

Optional, Default=true

Expose Rancher services by default in Traefik. If set to false, services 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:
  rancher:
    exposedByDefault: false
    # ...
[providers.rancher]
  exposedByDefault = false
  # ...
--providers.rancher.exposedByDefault=false
# ...

defaultRule

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

The default host rule for all services.

The defaultRule option defines what routing rule to apply to a container if no rule is defined by a label.

It must be a valid Go template, and can use sprig template functions. The service name can be accessed with the Name identifier, and the template has access to all the labels defined on this container.

This option can be overridden on a container basis with the traefik.http.routers.Router1.rule label.

providers:
  rancher:
    defaultRule: "Host(`{{ .Name }}.{{ index .Labels \"customLabel\"}}`)"
    # ...
[providers.rancher]
  defaultRule = "Host(`{{ .Name }}.{{ index .Labels \"customLabel\"}}`)"
  # ...
--providers.rancher.defaultRule='Host(`{{ .Name }}.{{ index .Labels "customLabel"}}`)'
# ...
Default rule and Traefik service

The exposure of the Traefik container, combined with the default rule mechanism, can lead to create a router targeting itself in a loop. In this case, to prevent an infinite loop, Traefik adds an internal middleware to refuse the request if it comes from the same router.

enableServiceHealthFilter

Optional, Default=true

Filter out services with unhealthy states and inactive states.

providers:
  rancher:
    enableServiceHealthFilter: false
    # ...
[providers.rancher]
  enableServiceHealthFilter = false
  # ...
--providers.rancher.enableServiceHealthFilter=false
# ...

refreshSeconds

Optional, Default=15

Defines the polling interval (in seconds).

providers:
  rancher:
    refreshSeconds: 30
    # ...
[providers.rancher]
  refreshSeconds = 30
  # ...
--providers.rancher.refreshSeconds=30
# ...

intervalPoll

Optional, Default=false

Poll the Rancher metadata service for changes every rancher.refreshSeconds, which is less accurate than the default long polling technique which provides near instantaneous updates to Traefik.

providers:
  rancher:
    intervalPoll: true
    # ...
[providers.rancher]
  intervalPoll = true
  # ...
--providers.rancher.intervalPoll=true
# ...

prefix

Optional, Default="/latest"

Prefix used for accessing the Rancher metadata service.

providers:
  rancher:
    prefix: "/test"
    # ...
[providers.rancher]
  prefix = "/test"
  # ...
--providers.rancher.prefix=/test
# ...

constraints

Optional, Default=""

The constraints option can be set to an expression that Traefik matches against the container labels to determine whether to create any route for that container. If none of the container tags match the expression, no route for that container is created. If the expression is empty, all detected containers are included.

The expression syntax is based on the Label("key", "value"), and LabelRegex("key", "value") functions, as well as the usual boolean logic, as shown in examples below.

Constraints Expression Examples
# Includes only containers having a label with key `a.label.name` and value `foo`
constraints = "Label(`a.label.name`, `foo`)"
# Excludes containers 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 containers having a label with key `a.label.name` and a value matching the `a.+` regular expression.
constraints = "LabelRegex(`a.label.name`, `a.+`)"

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

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