Skip to content

Commit

Permalink
WeightedRoundRobin load balancer
Browse files Browse the repository at this point in the history
Co-authored-by: Ludovic Fernandez <ldez@users.noreply.github.com>
  • Loading branch information
2 people authored and traefiker committed Aug 26, 2019
1 parent 84de444 commit 6fed76a
Show file tree
Hide file tree
Showing 44 changed files with 1,611 additions and 832 deletions.
4 changes: 3 additions & 1 deletion docs/content/providers/kubernetes-crd.md
Original file line number Diff line number Diff line change
Expand Up @@ -198,11 +198,13 @@ spec:
# "Parameter", etc, to support simpler forms of rule matching, but for now we
# only support "Rule".
kind: Rule
# Priority disambiguates rules of the same length, for route matching.
# (optional) Priority disambiguates rules of the same length, for route matching.
priority: 12
services:
- name: whoami
port: 80
# (default 1) A weight used by the weighted round-robin strategy (WRR).
weight: 1

---
apiVersion: traefik.containo.us/v1alpha1
Expand Down
16 changes: 8 additions & 8 deletions docs/content/reference/dynamic-configuration/docker-labels.yml
Original file line number Diff line number Diff line change
Expand Up @@ -130,10 +130,10 @@
- "traefik.http.services.service0.loadbalancer.healthcheck.timeout=foobar"
- "traefik.http.services.service0.loadbalancer.passhostheader=true"
- "traefik.http.services.service0.loadbalancer.responseforwarding.flushinterval=foobar"
- "traefik.http.services.service0.loadbalancer.stickiness=true"
- "traefik.http.services.service0.loadbalancer.stickiness.cookiename=foobar"
- "traefik.http.services.service0.loadbalancer.stickiness.httponlycookie=true"
- "traefik.http.services.service0.loadbalancer.stickiness.securecookie=true"
- "traefik.http.services.service0.loadbalancer.sticky=true"
- "traefik.http.services.service0.loadbalancer.sticky.cookie.name=foobar"
- "traefik.http.services.service0.loadbalancer.sticky.cookie.httponly=true"
- "traefik.http.services.service0.loadbalancer.sticky.cookie.secure=true"
- "traefik.http.services.service0.loadbalancer.server.port=foobar"
- "traefik.http.services.service0.loadbalancer.server.scheme=foobar"
- "traefik.http.services.service1.loadbalancer.healthcheck.headers.name0=foobar"
Expand All @@ -146,10 +146,10 @@
- "traefik.http.services.service1.loadbalancer.healthcheck.timeout=foobar"
- "traefik.http.services.service1.loadbalancer.passhostheader=true"
- "traefik.http.services.service1.loadbalancer.responseforwarding.flushinterval=foobar"
- "traefik.http.services.service1.loadbalancer.stickiness=true"
- "traefik.http.services.service1.loadbalancer.stickiness.cookiename=foobar"
- "traefik.http.services.service1.loadbalancer.stickiness.httponlycookie=true"
- "traefik.http.services.service1.loadbalancer.stickiness.securecookie=true"
- "traefik.http.services.service1.loadbalancer.sticky=true"
- "traefik.http.services.service1.loadbalancer.sticky.cookie.name=foobar"
- "traefik.http.services.service1.loadbalancer.sticky.cookie.httponly=true"
- "traefik.http.services.service1.loadbalancer.sticky.cookie.secure=true"
- "traefik.http.services.service1.loadbalancer.server.port=foobar"
- "traefik.http.services.service1.loadbalancer.server.scheme=foobar"
- "traefik.tcp.routers.tcprouter0.entrypoints=foobar, foobar"
Expand Down
59 changes: 25 additions & 34 deletions docs/content/reference/dynamic-configuration/file.toml
Original file line number Diff line number Diff line change
Expand Up @@ -35,56 +35,47 @@
main = "foobar"
sans = ["foobar", "foobar"]
[http.services]
[http.services.Service0]
[http.services.Service0.loadBalancer]
[http.services.Service01]
[http.services.Service01.loadBalancer]
passHostHeader = true
[http.services.Service0.loadBalancer.stickiness]
cookieName = "foobar"
secureCookie = true
httpOnlyCookie = true
[http.services.Service01.loadBalancer.sticky]
[http.services.Service01.loadBalancer.sticky.cookie]
name = "foobar"
secure = true
httpOnly = true

[[http.services.Service0.loadBalancer.servers]]
[[http.services.Service01.loadBalancer.servers]]
url = "foobar"

[[http.services.Service0.loadBalancer.servers]]
[[http.services.Service01.loadBalancer.servers]]
url = "foobar"
[http.services.Service0.loadBalancer.healthCheck]
[http.services.Service01.loadBalancer.healthCheck]
scheme = "foobar"
path = "foobar"
port = 42
interval = "foobar"
timeout = "foobar"
hostname = "foobar"
[http.services.Service0.loadBalancer.healthCheck.headers]
[http.services.Service01.loadBalancer.healthCheck.headers]
name0 = "foobar"
name1 = "foobar"
[http.services.Service0.loadBalancer.responseForwarding]
[http.services.Service01.loadBalancer.responseForwarding]
flushInterval = "foobar"
[http.services.Service1]
[http.services.Service1.loadBalancer]
passHostHeader = true
[http.services.Service1.loadBalancer.stickiness]
cookieName = "foobar"
secureCookie = true
httpOnlyCookie = true
[http.services.Service02]
[http.services.Service02.weighted]

[[http.services.Service1.loadBalancer.servers]]
url = "foobar"
[[http.services.Service02.weighted.services]]
name = "foobar"
weight = 42

[[http.services.Service1.loadBalancer.servers]]
url = "foobar"
[http.services.Service1.loadBalancer.healthCheck]
scheme = "foobar"
path = "foobar"
port = 42
interval = "foobar"
timeout = "foobar"
hostname = "foobar"
[http.services.Service1.loadBalancer.healthCheck.headers]
name0 = "foobar"
name1 = "foobar"
[http.services.Service1.loadBalancer.responseForwarding]
flushInterval = "foobar"
[[http.services.Service02.weighted.services]]
name = "foobar"
weight = 42
[http.services.Service02.weighted.sticky]
[http.services.Service02.weighted.sticky.cookie]
name = "foobar"
secure = true
httpOnly = true
[http.middlewares]
[http.middlewares.Middleware00]
[http.middlewares.Middleware00.addPrefix]
Expand Down
45 changes: 18 additions & 27 deletions docs/content/reference/dynamic-configuration/file.yaml
Original file line number Diff line number Diff line change
Expand Up @@ -45,34 +45,13 @@ http:
- foobar
- foobar
services:
Service0:
Service01:
loadBalancer:
stickiness:
cookieName: foobar
secureCookie: true
httpOnlyCookie: true
servers:
- url: foobar
- url: foobar
healthCheck:
scheme: foobar
path: foobar
port: 42
interval: foobar
timeout: foobar
hostname: foobar
headers:
name0: foobar
name1: foobar
passHostHeader: true
responseForwarding:
flushInterval: foobar
Service1:
loadBalancer:
stickiness:
cookieName: foobar
secureCookie: true
httpOnlyCookie: true
sticky:
cookie:
name: foobar
secure: true
httpOnly: true
servers:
- url: foobar
- url: foobar
Expand All @@ -89,6 +68,18 @@ http:
passHostHeader: true
responseForwarding:
flushInterval: foobar
Service02:
weighted:
services:
- name: foobar
weight: 42
- name: foobar
weight: 42
sticky:
cookie:
name: foobar
secure: true
httpOnly: true
middlewares:
Middleware00:
addPrefix:
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -130,10 +130,10 @@
"traefik.http.services.service0.loadbalancer.healthcheck.timeout": "foobar",
"traefik.http.services.service0.loadbalancer.passhostheader": "true",
"traefik.http.services.service0.loadbalancer.responseforwarding.flushinterval": "foobar",
"traefik.http.services.service0.loadbalancer.stickiness": "true",
"traefik.http.services.service0.loadbalancer.stickiness.cookiename": "foobar",
"traefik.http.services.service0.loadbalancer.stickiness.httponlycookie": "true",
"traefik.http.services.service0.loadbalancer.stickiness.securecookie": "true",
"traefik.http.services.service0.loadbalancer.sticky": "true",
"traefik.http.services.service0.loadbalancer.sticky.cookie.name": "foobar",
"traefik.http.services.service0.loadbalancer.sticky.cookie.httponly": "true",
"traefik.http.services.service0.loadbalancer.sticky.cookie.secure": "true",
"traefik.http.services.service0.loadbalancer.server.port": "foobar",
"traefik.http.services.service0.loadbalancer.server.scheme": "foobar",
"traefik.http.services.service1.loadbalancer.healthcheck.headers.name0": "foobar",
Expand All @@ -146,10 +146,10 @@
"traefik.http.services.service1.loadbalancer.healthcheck.timeout": "foobar",
"traefik.http.services.service1.loadbalancer.passhostheader": "true",
"traefik.http.services.service1.loadbalancer.responseforwarding.flushinterval": "foobar",
"traefik.http.services.service1.loadbalancer.stickiness": "true",
"traefik.http.services.service1.loadbalancer.stickiness.cookiename": "foobar",
"traefik.http.services.service1.loadbalancer.stickiness.httponlycookie": "true",
"traefik.http.services.service1.loadbalancer.stickiness.securecookie": "true",
"traefik.http.services.service1.loadbalancer.sticky": "true",
"traefik.http.services.service1.loadbalancer.sticky.cookie.name": "foobar",
"traefik.http.services.service1.loadbalancer.sticky.cookie.secure": "true",
"traefik.http.services.service1.loadbalancer.sticky.cookie.httponly": "true",
"traefik.http.services.service1.loadbalancer.server.port": "foobar",
"traefik.http.services.service1.loadbalancer.server.scheme": "foobar",
"traefik.tcp.routers.tcprouter0.entrypoints": "foobar, foobar",
Expand Down
83 changes: 65 additions & 18 deletions docs/content/routing/services/index.md
Original file line number Diff line number Diff line change
Expand Up @@ -54,13 +54,7 @@ The `Services` are responsible for configuring how to reach the actual services

## Configuring HTTP Services

### General

Currently, `LoadBalancer` is the only supported kind of HTTP `Service` (see below).
However, since Traefik is an ever evolving project, other kind of HTTP Services will be available in the future,
reason why you have to specify it.

### Load Balancer
### Servers Load Balancer

The load balancers are able to load balance the requests between multiple instances of your programs.

Expand Down Expand Up @@ -161,37 +155,39 @@ On subsequent requests, the client is forwarded to the same server.
```toml tab="TOML"
[http.services]
[http.services.my-service]
[http.services.my-service.loadBalancer.stickiness]
[http.services.my-service.loadBalancer.sticky.cookie]
```

```yaml tab="YAML"
http:
services:
my-service:
loadBalancer:
stickiness: {}
sticky:
cookie: {}
```

??? example "Adding Stickiness with a Custom Cookie Name"
??? example "Adding Stickiness with custom Options"

```toml tab="TOML"
[http.services]
[http.services.my-service]
[http.services.my-service.loadBalancer.stickiness]
cookieName = "my_stickiness_cookie_name"
secureCookie = true
httpOnlyCookie = true
[http.services.my-service.loadBalancer.sticky.cookie]
name = "my_sticky_cookie_name"
secure = true
httpOnly = true
```

```yaml tab="YAML"
http:
services:
my-service:
loadBalancer:
stickiness:
cookieName: my_stickiness_cookie_name
secureCookie: true
httpOnlyCookie: true
sticky:
cookie:
name: my_sticky_cookie_name
secure: true
httpOnly: true
```

#### Health Check
Expand Down Expand Up @@ -306,6 +302,57 @@ Below are the available options for the health check mechanism:
My-Header: bar
```

### Weighted Round Robin (service)

The WRR is able to load balance the requests between multiple services based on weights.

This strategy is only available to load balance between [services](./index.md) and not between [servers](./index.md#servers).

This strategy can be defined only with [File](../../providers/file.md).

```toml tab="TOML"
[http.services]
[http.services.canary]
[[http.services.canary.weighted.services]]
name = "appv1"
weight = 3
[[http.services.canary.weighted.services]]
name = "appv2"
weight = 1

[http.services.appv1]
[http.services.appv1.loadBalancer]
[[http.services.appv1.loadBalancer.servers]]
url = "http://private-ip-server-1/"

[http.services.appv2]
[http.services.appv2.loadBalancer]
[[http.services.appv2.loadBalancer.servers]]
url = "http://private-ip-server-2/"
```

```yaml tab="YAML"
http:
services:
canary:
weighted:
services:
- name: appv1
weight: 3
- name: appv2
weight: 1

appv1:
loadBalancer:
servers:
- url: "http://private-ip-server-1/"

appv2:
loadBalancer:
servers:
- url: "http://private-ip-server-2/"
```

## Configuring TCP Services

### General
Expand Down
1 change: 0 additions & 1 deletion integration/fixtures/tcp/multi-tls-options.toml
Original file line number Diff line number Diff line change
Expand Up @@ -34,7 +34,6 @@

[tcp.services.whoami-no-cert]
[tcp.services.whoami-no-cert.loadBalancer]
method = "wrr"
[[tcp.services.whoami-no-cert.loadBalancer.servers]]
address = "localhost:8083"

Expand Down
38 changes: 38 additions & 0 deletions integration/fixtures/wrr.toml
Original file line number Diff line number Diff line change
@@ -0,0 +1,38 @@
[global]
checkNewVersion = false
sendAnonymousUsage = false

[api]

[log]
level = "DEBUG"

[entryPoints]

[entryPoints.web]
address = ":8000"

[providers.file]
filename = "{{ .SelfFilename }}"

## dynamic configuration ##

[http.routers]
[http.routers.router]
service = "wrr"
rule = "Path(`/whoami`)"

[http.services]
[[http.services.wrr.weighted.services]]
name = "service1"
weight = 3
[[http.services.wrr.weighted.services]]
name = "service2"

[http.services.service1.loadBalancer]
[[http.services.service1.loadBalancer.servers]]
url = "{{ .Server1 }}"
[http.services.service2.loadBalancer]
[[http.services.service2.loadBalancer.servers]]
url = "{{ .Server2 }}"

0 comments on commit 6fed76a

Please sign in to comment.