From dc52abf4ce05ae5c2235d418549ae636b3db5f15 Mon Sep 17 00:00:00 2001 From: Owen Marshall Date: Fri, 13 May 2016 10:22:11 -0400 Subject: [PATCH 01/10] Add sticky session support to Traefik. This change adds sticky session support, by using the new oxy/rr/StickySession feature. To use it, set traefik.backend.sticky to true. This is currently only implemented in the wrr load balancer, and against the Marathon backend, but lifting it should be very doable. In the wrr load balancer, a cookie called _TRAEFIK_SERVERNAME will be set with the backend to use. If the cookie is altered to an invalid backend server, or the server is removed from the load balancer, the next server will be used instead. Otherwise, the cookie will be checked in Oxy's rr on access and if valid the connection will be wired through to it. --- provider/marathon.go | 8 ++++++++ provider/marathon_test.go | 2 +- server.go | 10 ++++++++++ templates/marathon.tmpl | 1 + types/types.go | 1 + 5 files changed, 21 insertions(+), 1 deletion(-) diff --git a/provider/marathon.go b/provider/marathon.go index ecf736c78..2dc7c27bc 100644 --- a/provider/marathon.go +++ b/provider/marathon.go @@ -138,6 +138,7 @@ func (provider *Marathon) loadMarathonConfig() *types.Configuration { "getMaxConnAmount": provider.getMaxConnAmount, "getLoadBalancerMethod": provider.getLoadBalancerMethod, "getCircuitBreakerExpression": provider.getCircuitBreakerExpression, + "getSticky": provider.getSticky, } applications, err := provider.marathonClient.Applications(nil) @@ -347,6 +348,13 @@ func (provider *Marathon) getProtocol(task marathon.Task, applications []maratho return "http" } +func (provider *Marathon) getSticky(application marathon.Application) string { + if sticky, err := provider.getLabel(application, "traefik.backend.sticky"); err == nil { + return sticky + } + return "false" +} + func (provider *Marathon) getPassHostHeader(application marathon.Application) string { if passHostHeader, err := provider.getLabel(application, "traefik.frontend.passHostHeader"); err == nil { return passHostHeader diff --git a/provider/marathon_test.go b/provider/marathon_test.go index cb4edea27..4211f1d26 100644 --- a/provider/marathon_test.go +++ b/provider/marathon_test.go @@ -107,7 +107,7 @@ func TestMarathonLoadConfig(t *testing.T) { }, }, CircuitBreaker: nil, - LoadBalancer: nil, + LoadBalancer: &types.LoadBalancer{Sticky: false}, }, }, }, diff --git a/server.go b/server.go index 0d6cf7fb6..ab51614c5 100644 --- a/server.go +++ b/server.go @@ -537,12 +537,16 @@ func (server *Server) loadConfig(configurations configs, globalConfiguration Glo log.Errorf("Skipping frontend %s...", frontendName) continue frontend } + lbMethod, err := types.NewLoadBalancerMethod(configuration.Backends[frontend.Backend].LoadBalancer) if err != nil { log.Errorf("Error loading load balancer method '%+v' for frontend %s: %v", configuration.Backends[frontend.Backend].LoadBalancer, frontendName, err) log.Errorf("Skipping frontend %s...", frontendName) continue frontend } + + stickysession := configuration.Backends[frontend.Backend].LoadBalancer.Sticky + switch lbMethod { case types.Drr: log.Debugf("Creating load-balancer drr") @@ -565,6 +569,12 @@ func (server *Server) loadConfig(configurations configs, globalConfiguration Glo } case types.Wrr: log.Debugf("Creating load-balancer wrr") + if stickysession { + cookiename := "_TRAEFIK_SERVERNAME" + log.Debugf("... setting to sticky session with cookie named %v", cookiename) + sticky := roundrobin.NewStickySession(cookiename) + rr, _ = roundrobin.New(saveBackend, roundrobin.EnableStickySession(sticky)) + } lb = rr for serverName, server := range configuration.Backends[frontend.Backend].Servers { url, err := url.Parse(server.URL) diff --git a/templates/marathon.tmpl b/templates/marathon.tmpl index fbd2bf801..04a6912c2 100644 --- a/templates/marathon.tmpl +++ b/templates/marathon.tmpl @@ -14,6 +14,7 @@ {{ if hasLoadBalancerLabels . }} [backends.backend{{getFrontendBackend . }}.loadbalancer] method = "{{getLoadBalancerMethod . }}" + sticky = {{getSticky .}} {{end}} {{ if hasCircuitBreakerLabels . }} [backends.backend{{getFrontendBackend . }}.circuitbreaker] diff --git a/types/types.go b/types/types.go index 8b4d2a264..d5a0f0ead 100644 --- a/types/types.go +++ b/types/types.go @@ -24,6 +24,7 @@ type MaxConn struct { // LoadBalancer holds load balancing configuration. type LoadBalancer struct { Method string `json:"method,omitempty"` + Sticky bool `json:"sticky,omitempty"` } // CircuitBreaker holds circuit breaker configuration. From d78c419627c27b37a941c4aed1c82bb449a3d8bf Mon Sep 17 00:00:00 2001 From: Owen Marshall Date: Thu, 26 May 2016 13:38:55 -0400 Subject: [PATCH 02/10] Add sticky support to DRR lb --- server.go | 14 +++++++++++--- 1 file changed, 11 insertions(+), 3 deletions(-) diff --git a/server.go b/server.go index ab51614c5..d8c728c2b 100644 --- a/server.go +++ b/server.go @@ -546,11 +546,21 @@ func (server *Server) loadConfig(configurations configs, globalConfiguration Glo } stickysession := configuration.Backends[frontend.Backend].LoadBalancer.Sticky + if stickysession { + sticky := roundrobin.NewStickySession(cookiename) + cookiename := "_TRAEFIK_SERVERNAME" + + } switch lbMethod { case types.Drr: log.Debugf("Creating load-balancer drr") - rebalancer, _ := roundrobin.NewRebalancer(rr, roundrobin.RebalancerLogger(oxyLogger)) + if stickysession { + log.Debugf("... setting to sticky session with cookie named %v", cookiename) + rebalancer, _ := roundrobin.NewRebalancer(rr, roundrobin.RebalancerLogger(oxyLogger), roundrobin.RebalancerStickySession(sticky)) + } else { + rebalancer, _ := roundrobin.NewRebalancer(rr, roundrobin.RebalancerLogger(oxyLogger)) + } lb = rebalancer for serverName, server := range configuration.Backends[frontend.Backend].Servers { url, err := url.Parse(server.URL) @@ -570,9 +580,7 @@ func (server *Server) loadConfig(configurations configs, globalConfiguration Glo case types.Wrr: log.Debugf("Creating load-balancer wrr") if stickysession { - cookiename := "_TRAEFIK_SERVERNAME" log.Debugf("... setting to sticky session with cookie named %v", cookiename) - sticky := roundrobin.NewStickySession(cookiename) rr, _ = roundrobin.New(saveBackend, roundrobin.EnableStickySession(sticky)) } lb = rr From be5b1fd92b12df57feb61b0a2a52efc6d747af7c Mon Sep 17 00:00:00 2001 From: Owen Marshall Date: Thu, 2 Jun 2016 14:36:14 -0400 Subject: [PATCH 03/10] docs, sticky session for Docker --- docs/basics.md | 11 +++++++++++ docs/toml.md | 1 + provider/docker.go | 7 +++++++ templates/docker.tmpl | 1 + 4 files changed, 20 insertions(+) diff --git a/docs/basics.md b/docs/basics.md index df967f308..e0c700a16 100644 --- a/docs/basics.md +++ b/docs/basics.md @@ -222,6 +222,17 @@ For example: - Another possible value for `extractorfunc` is `client.ip` which will categorize requests based on client source ip. - Lastly `extractorfunc` can take the value of `request.header.ANY_HEADER` which will categorize requests based on `ANY_HEADER` that you provide. +Sticky sessions are supported with both load balancers. When sticky sessions are enabled, a cookie called `_TRAEFIK_BACKEND` is set on the initial +request. On subsequent requests, the client will be directed to the backend stored in the cookie if it is still healthy. If not, a new backend +will be assigned. + +For example: +```toml +[backends] + [backends.backend1] + [backends.backend1.loadbalancer] + sticky = true +``` ## Servers Servers are simply defined using a `URL`. You can also apply a custom `weight` to each server (this will be used by load-balancing). diff --git a/docs/toml.md b/docs/toml.md index 0c5557d04..bd6dfb11e 100644 --- a/docs/toml.md +++ b/docs/toml.md @@ -716,6 +716,7 @@ Labels can be used on containers to override default behaviour: - `traefik.protocol=https`: override the default `http` protocol - `traefik.weight=10`: assign this weight to the container - `traefik.enable=false`: disable this container in Træfɪk +- `traefik.stickysession=true`: enable backend sticky sessions - `traefik.frontend.rule=Host:test.traefik.io`: override the default frontend rule (Default: `Host:{containerName}.{domain}`). - `traefik.frontend.passHostHeader=true`: forward client `Host` header to the backend. - `traefik.frontend.priority=10`: override default frontend priority diff --git a/provider/docker.go b/provider/docker.go index e33c11831..eb08b6afb 100644 --- a/provider/docker.go +++ b/provider/docker.go @@ -439,6 +439,13 @@ func (provider *Docker) getWeight(container dockerData) string { return "1" } +func (provider *Docker) getSticky(container dockertypes.ContainerJSON) string { + if label, err := getLabel(container, "traefik.stickysession"); err == nil { + return true + } + return false +} + func (provider *Docker) getDomain(container dockerData) string { if label, err := getLabel(container, "traefik.domain"); err == nil { return label diff --git a/templates/docker.tmpl b/templates/docker.tmpl index 5b9acce33..943a89237 100644 --- a/templates/docker.tmpl +++ b/templates/docker.tmpl @@ -7,6 +7,7 @@ {{if hasLoadBalancerLabel .}} [backends.backend-{{getBackend .}}.loadbalancer] method = "{{getLoadBalancerMethod .}}" + sticky = {{getSticky . }} {{end}} {{if hasMaxConnLabels .}} From c9d4c5ae3eed0cc353b503e53e78cf7d60e93c19 Mon Sep 17 00:00:00 2001 From: Owen Marshall Date: Wed, 8 Jun 2016 15:08:03 -0400 Subject: [PATCH 04/10] Fix Docker integration problems --- provider/docker.go | 18 +++++++++++++----- provider/docker_test.go | 4 ++-- templates/docker.tmpl | 4 ---- 3 files changed, 15 insertions(+), 11 deletions(-) diff --git a/provider/docker.go b/provider/docker.go index eb08b6afb..0c7ace0cf 100644 --- a/provider/docker.go +++ b/provider/docker.go @@ -252,6 +252,7 @@ func (provider *Docker) loadDockerConfig(containersInspected []dockerData) *type "hasMaxConnLabels": provider.hasMaxConnLabels, "getMaxConnAmount": provider.getMaxConnAmount, "getMaxConnExtractorFunc": provider.getMaxConnExtractorFunc, + "getSticky": provider.getSticky, "replace": replace, } @@ -260,19 +261,26 @@ func (provider *Docker) loadDockerConfig(containersInspected []dockerData) *type return provider.containerFilter(container) }, containersInspected).([]dockerData) + // sticky backends + stickycontainers := map[string][]dockerData{} + frontends := map[string][]dockerData{} for _, container := range filteredContainers { frontendName := provider.getFrontendName(container) frontends[frontendName] = append(frontends[frontendName], container) + frontends[frontendName] = append(frontends[frontendName], container) + stickycontainers[provider.getBackend(container)] = container } templateObjects := struct { - Containers []dockerData - Frontends map[string][]dockerData - Domain string + Containers []dockerData + Frontends map[string][]dockerData + StickyContainers map[string][]dockerData + Domain string }{ filteredContainers, frontends, + stickycontainers, provider.Domain, } @@ -441,9 +449,9 @@ func (provider *Docker) getWeight(container dockerData) string { func (provider *Docker) getSticky(container dockertypes.ContainerJSON) string { if label, err := getLabel(container, "traefik.stickysession"); err == nil { - return true + return "true" } - return false + return "false" } func (provider *Docker) getDomain(container dockerData) string { diff --git a/provider/docker_test.go b/provider/docker_test.go index c344eb5f1..976469e76 100644 --- a/provider/docker_test.go +++ b/provider/docker_test.go @@ -940,7 +940,7 @@ func TestDockerLoadDockerConfig(t *testing.T) { }, }, CircuitBreaker: nil, - LoadBalancer: nil, + LoadBalancer: &types.LoadBalancer{Sticky: false, Method: ""}, }, }, }, @@ -1027,7 +1027,7 @@ func TestDockerLoadDockerConfig(t *testing.T) { }, }, CircuitBreaker: nil, - LoadBalancer: nil, + LoadBalancer: &types.LoadBalancer{Sticky: false, Method: ""}, }, }, }, diff --git a/templates/docker.tmpl b/templates/docker.tmpl index 943a89237..6a5f98803 100644 --- a/templates/docker.tmpl +++ b/templates/docker.tmpl @@ -16,10 +16,6 @@ extractorfunc = "{{getMaxConnExtractorFunc . }}" {{end}} - [backends.backend-{{getBackend .}}.servers.server-{{.Name | replace "/" "" | replace "." "-"}}] - url = "{{getProtocol .}}://{{getIPAddress .}}:{{getPort .}}" - weight = {{getWeight .}} -{{end}} [frontends]{{range $frontend, $containers := .Frontends}} [frontends."frontend-{{$frontend}}"]{{$container := index $containers 0}} From 81fddb4ccfb1b5df7c3056f6f77be2ba9d93a6a7 Mon Sep 17 00:00:00 2001 From: Owen Marshall Date: Wed, 8 Jun 2016 15:18:38 -0400 Subject: [PATCH 05/10] missed a cherry pick, good start :=/ --- provider/docker.go | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/provider/docker.go b/provider/docker.go index 0c7ace0cf..baa5c110a 100644 --- a/provider/docker.go +++ b/provider/docker.go @@ -448,7 +448,7 @@ func (provider *Docker) getWeight(container dockerData) string { } func (provider *Docker) getSticky(container dockertypes.ContainerJSON) string { - if label, err := getLabel(container, "traefik.stickysession"); err == nil { + if _, err := getLabel(container, "traefik.stickysession"); err == nil { return "true" } return "false" From 3d7c44735a6fe792ad7fc9f074034a260e53bb0d Mon Sep 17 00:00:00 2001 From: Owen Marshall Date: Wed, 10 Aug 2016 12:19:02 -0400 Subject: [PATCH 06/10] Reorder sticky session definitions --- server.go | 13 +++++++------ 1 file changed, 7 insertions(+), 6 deletions(-) diff --git a/server.go b/server.go index d8c728c2b..68deee605 100644 --- a/server.go +++ b/server.go @@ -546,20 +546,21 @@ func (server *Server) loadConfig(configurations configs, globalConfiguration Glo } stickysession := configuration.Backends[frontend.Backend].LoadBalancer.Sticky - if stickysession { - sticky := roundrobin.NewStickySession(cookiename) - cookiename := "_TRAEFIK_SERVERNAME" + var cookiename string + var sticky *roundrobin.StickySession + if stickysession { + sticky = roundrobin.NewStickySession(cookiename) + cookiename = "_TRAEFIK_SERVERNAME" } switch lbMethod { case types.Drr: log.Debugf("Creating load-balancer drr") + rebalancer, _ := roundrobin.NewRebalancer(rr, roundrobin.RebalancerLogger(oxyLogger)) if stickysession { log.Debugf("... setting to sticky session with cookie named %v", cookiename) - rebalancer, _ := roundrobin.NewRebalancer(rr, roundrobin.RebalancerLogger(oxyLogger), roundrobin.RebalancerStickySession(sticky)) - } else { - rebalancer, _ := roundrobin.NewRebalancer(rr, roundrobin.RebalancerLogger(oxyLogger)) + rebalancer, _ = roundrobin.NewRebalancer(rr, roundrobin.RebalancerLogger(oxyLogger), roundrobin.RebalancerStickySession(sticky)) } lb = rebalancer for serverName, server := range configuration.Backends[frontend.Backend].Servers { From 592e981bd2575db851a96170bfde3ca7130029dc Mon Sep 17 00:00:00 2001 From: Owen Marshall Date: Wed, 10 Aug 2016 12:19:15 -0400 Subject: [PATCH 07/10] glide up --- glide.lock | 111 +++++++++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 111 insertions(+) diff --git a/glide.lock b/glide.lock index 9caaf5b2c..b9ea065d8 100644 --- a/glide.lock +++ b/glide.lock @@ -1,10 +1,24 @@ +<<<<<<< 3d7c44735a6fe792ad7fc9f074034a260e53bb0d hash: c0ac205a859d78847e21d3cd63f427ffba985755c6ae84373e4a20364ba39b05 updated: 2016-09-28T16:50:04.352639437+01:00 +======= +<<<<<<< HEAD +hash: b82175c1aafff6c4e98c8ac4baea3832895c9600beac445c10af4c004982ef05 +updated: 2016-09-20T16:03:26.379383173+02:00 +======= +hash: f7ade4acdfd43efe6a0c1a1444776dd02d556e40bf122a495ca2fc226c880d0b +updated: 2016-08-10T11:55:40.961089942-04:00 +>>>>>>> 2848e10... glide up +>>>>>>> glide up imports: - name: github.com/abbot/go-http-auth version: cb4372376e1e00e9f6ab9ec142e029302c9e7140 - name: github.com/boltdb/bolt +<<<<<<< HEAD version: fff57c100f4dea1905678da7e90d92429dff2904 +======= + version: 94c8db596809690a3f7046fa83c7b0dda13a3222 +>>>>>>> 2848e10... glide up - name: github.com/BurntSushi/toml version: 99064174e013895bbd9b025c31100bd1d9b590ca - name: github.com/BurntSushi/ty @@ -18,13 +32,34 @@ imports: - name: github.com/codegangsta/cli version: 1efa31f08b9333f1bd4882d61f9d668a70cd902e - name: github.com/codegangsta/negroni +<<<<<<< HEAD version: 3f7ce7b928e14ff890b067e5bbbc80af73690a9c +======= + version: 6edff56736fa7bd546812f149e8cdaae61e5a38f +>>>>>>> 2848e10... glide up - name: github.com/containous/flaeg version: a731c034dda967333efce5f8d276aeff11f8ff87 - name: github.com/containous/mux version: a819b77bba13f0c0cbe36e437bc2e948411b3996 - name: github.com/containous/staert +<<<<<<< HEAD version: 044bdfee6c8f5e8fb71f70d5ba1cf4cb11a94e97 +======= + version: 21164fe201578bea96317a87752953ea5d9dc6d1 +- name: github.com/containous/traefik + version: 4cd08e88f6baf56f33163077c1e226691d56bfa9 + subpackages: + - acme + - autogen + - middlewares + - provider + - safe + - types + - version + - provider/k8s + - integration/utils + - mocks +>>>>>>> 2848e10... glide up - name: github.com/coreos/etcd version: 1c9e0a0e33051fed6c05c141e6fcbfe5c7f2a899 subpackages: @@ -36,7 +71,15 @@ imports: subpackages: - spew - name: github.com/docker/distribution +<<<<<<< 3d7c44735a6fe792ad7fc9f074034a260e53bb0d version: 99cb7c0946d2f5a38015443e515dc916295064d7 +======= +<<<<<<< HEAD + version: b6e0cfbdaa1ddc3a17c95142c7bf6e42c5567370 +======= + version: 9000745401d186602c2ae63ffca12ed4233a968b +>>>>>>> 2848e10... glide up +>>>>>>> glide up subpackages: - context - digest @@ -116,13 +159,21 @@ imports: - types/time - types/versions - name: github.com/docker/go-connections +<<<<<<< HEAD version: 988efe982fdecb46f01d53465878ff1f2ff411ce +======= + version: 0bad1a3951398f88ef4dd75fdb42af374430be89 +>>>>>>> 2848e10... glide up subpackages: - nat - sockets - tlsconfig - name: github.com/docker/go-units +<<<<<<< HEAD version: f2145db703495b2e525c59662db69a7344b00bb8 +======= + version: eb879ae3e2b84e2a142af415b679ddeda47ec71c +>>>>>>> 2848e10... glide up - name: github.com/docker/libcompose version: d1876c1d68527a49c0aac22a0b161acc7296b740 subpackages: @@ -151,13 +202,25 @@ imports: - name: github.com/donovanhide/eventsource version: fd1de70867126402be23c306e1ce32828455d85b - name: github.com/elazarl/go-bindata-assetfs +<<<<<<< HEAD version: 9a6736ed45b44bf3835afeebb3034b57ed329f3e +======= + version: e1a2a7ec64b07d04ac9ebb072404fe8b7b60de1b +>>>>>>> 2848e10... glide up - name: github.com/gambol99/go-marathon version: a558128c87724cd7430060ef5aedf39f83937f55 - name: github.com/go-check/check version: 11d3bc7aa68e238947792f30573146a3231fc0f1 - name: github.com/gogo/protobuf +<<<<<<< 3d7c44735a6fe792ad7fc9f074034a260e53bb0d version: 89f1976ff373a3e549675d2f212c10f98b6c6316 +======= +<<<<<<< HEAD + version: a11c89fbb0ad4acfa8abc4a4d5f7e27c477169b1 +======= + version: a4cceea7a401a73fefafd1a21fedbd4694124a82 +>>>>>>> 2848e10... glide up +>>>>>>> glide up subpackages: - proto - name: github.com/golang/glog @@ -169,13 +232,29 @@ imports: - name: github.com/gorilla/context version: 08b5f424b9271eedf6f9f0ce86cb9396ed337a42 - name: github.com/hashicorp/consul +<<<<<<< 3d7c44735a6fe792ad7fc9f074034a260e53bb0d version: d5b7530ec593f1ec2a8f8a7c145bcadafa88b572 +======= +<<<<<<< HEAD + version: 67a03d57b5851011e5601ee6e7e3d05699548462 +======= + version: d6aa033793a68b509d336b3bac6ebe36ac0ef818 +>>>>>>> 2848e10... glide up +>>>>>>> glide up subpackages: - api - name: github.com/hashicorp/go-cleanhttp version: ad28ea4487f05916463e2423a55166280e8254b5 - name: github.com/hashicorp/serf +<<<<<<< 3d7c44735a6fe792ad7fc9f074034a260e53bb0d version: b7a120a5fc494f6dd5e858f42fd0fd4022d6320f +======= +<<<<<<< HEAD + version: 555e0dcbb180ecbd03431adc28226bb3192558bc +======= + version: a01569795d12afbdb3698739b614e057ee289fa0 +>>>>>>> 2848e10... glide up +>>>>>>> glide up subpackages: - coordinate - name: github.com/jarcoal/httpmock @@ -227,11 +306,23 @@ imports: - name: github.com/ogier/pflag version: 45c278ab3607870051a2ea9040bb85fcb8557481 - name: github.com/opencontainers/runc +<<<<<<< 3d7c44735a6fe792ad7fc9f074034a260e53bb0d version: d9fec4c63b089ddfc267194ecb6cda58a13f072c +======= +<<<<<<< HEAD + version: 38e0df9ec67c05e73b656c02c9222f24c1683d73 +>>>>>>> glide up subpackages: - libcontainer/user - name: github.com/parnurzeal/gorequest version: 29ced6f360a5ac3823a3675b4e29fbab336cc186 +======= + version: 0f764571384a3ff16c6fed25ace5b7c83f0f0379 + subpackages: + - libcontainer/user +- name: github.com/parnurzeal/gorequest + version: e213a02fb0082d41e66996deeaab5ae96039d913 +>>>>>>> 2848e10... glide up - name: github.com/pmezard/go-difflib version: d8ed2627bdf02c080bf22230dbb337003b7aba2d subpackages: @@ -245,7 +336,11 @@ imports: - name: github.com/Sirupsen/logrus version: 3ec0642a7fb6488f65b06f9040adc67e3990296a - name: github.com/streamrail/concurrent-map +<<<<<<< HEAD version: 8bf1e9bacbf65b10c81d0f4314cf2b1ebef728b5 +======= + version: 430cc620f036386dacc40e603921cc607f37366b +>>>>>>> 2848e10... glide up - name: github.com/stretchr/objx version: cbeaeb16a013161a98496fad62933b1d21786672 - name: github.com/stretchr/testify @@ -262,7 +357,11 @@ imports: subpackages: - codec - name: github.com/unrolled/render +<<<<<<< HEAD version: 3f4913244021dede105b62caecfb01f0c1eebeda +======= + version: 7bc415efc1b94ad17b0fc642cb50b3e2465027e7 +>>>>>>> 2848e10... glide up - name: github.com/vdemeester/docker-events version: be74d4929ec1ad118df54349fda4b0cba60f849b - name: github.com/vdemeester/shakers @@ -318,7 +417,15 @@ imports: subpackages: - bson - name: gopkg.in/square/go-jose.v1 +<<<<<<< 3d7c44735a6fe792ad7fc9f074034a260e53bb0d version: aa2e30fdd1fe9dd3394119af66451ae790d50e0d +======= +<<<<<<< HEAD + version: 139276ceb5afbf13e636c44e9382f0ca75c12ba3 +======= + version: a3927f83df1b1516f9e9dec71839c93e6bcf1db0 +>>>>>>> 2848e10... glide up +>>>>>>> glide up subpackages: - cipher - json @@ -348,4 +455,8 @@ testImports: - name: github.com/xeipuuv/gojsonreference version: e02fc20de94c78484cd5ffb007f8af96be030a45 - name: github.com/xeipuuv/gojsonschema +<<<<<<< HEAD version: 00f9fafb54d2244d291b86ab63d12c38bd5c3886 +======= + version: e4f482d0deea5bfc0522ab4582c5fdbd2edc98ad +>>>>>>> 2848e10... glide up From df225d9170aa2efb251cb74f0a58b2952315fe2b Mon Sep 17 00:00:00 2001 From: Owen Marshall Date: Thu, 11 Aug 2016 12:22:37 -0400 Subject: [PATCH 08/10] Change cookie name to match documentation --- server.go | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/server.go b/server.go index 68deee605..40b772d98 100644 --- a/server.go +++ b/server.go @@ -551,7 +551,7 @@ func (server *Server) loadConfig(configurations configs, globalConfiguration Glo if stickysession { sticky = roundrobin.NewStickySession(cookiename) - cookiename = "_TRAEFIK_SERVERNAME" + cookiename = "_TRAEFIK_BACKEND" } switch lbMethod { From 291c3b6dbc275ff612a6115ee0692065beaeb13b Mon Sep 17 00:00:00 2001 From: Emile Vauge Date: Wed, 28 Sep 2016 13:28:20 +0200 Subject: [PATCH 09/10] Fix sticky sessions Docker/Marathon labels --- glide.lock | 100 +++++++++++++++++++----------------------- provider/docker.go | 20 ++++----- provider/marathon.go | 6 ++- server.go | 4 +- templates/docker.tmpl | 6 ++- 5 files changed, 64 insertions(+), 72 deletions(-) diff --git a/glide.lock b/glide.lock index b9ea065d8..e745fe24d 100644 --- a/glide.lock +++ b/glide.lock @@ -1,3 +1,4 @@ +<<<<<<< df225d9170aa2efb251cb74f0a58b2952315fe2b <<<<<<< 3d7c44735a6fe792ad7fc9f074034a260e53bb0d hash: c0ac205a859d78847e21d3cd63f427ffba985755c6ae84373e4a20364ba39b05 updated: 2016-09-28T16:50:04.352639437+01:00 @@ -10,15 +11,15 @@ hash: f7ade4acdfd43efe6a0c1a1444776dd02d556e40bf122a495ca2fc226c880d0b updated: 2016-08-10T11:55:40.961089942-04:00 >>>>>>> 2848e10... glide up >>>>>>> glide up +======= +hash: b82175c1aafff6c4e98c8ac4baea3832895c9600beac445c10af4c004982ef05 +updated: 2016-09-28T13:05:02.84360542+02:00 +>>>>>>> Fix sticky sessions Docker/Marathon labels imports: - name: github.com/abbot/go-http-auth version: cb4372376e1e00e9f6ab9ec142e029302c9e7140 - name: github.com/boltdb/bolt -<<<<<<< HEAD - version: fff57c100f4dea1905678da7e90d92429dff2904 -======= version: 94c8db596809690a3f7046fa83c7b0dda13a3222 ->>>>>>> 2848e10... glide up - name: github.com/BurntSushi/toml version: 99064174e013895bbd9b025c31100bd1d9b590ca - name: github.com/BurntSushi/ty @@ -32,34 +33,13 @@ imports: - name: github.com/codegangsta/cli version: 1efa31f08b9333f1bd4882d61f9d668a70cd902e - name: github.com/codegangsta/negroni -<<<<<<< HEAD - version: 3f7ce7b928e14ff890b067e5bbbc80af73690a9c -======= version: 6edff56736fa7bd546812f149e8cdaae61e5a38f ->>>>>>> 2848e10... glide up - name: github.com/containous/flaeg version: a731c034dda967333efce5f8d276aeff11f8ff87 - name: github.com/containous/mux version: a819b77bba13f0c0cbe36e437bc2e948411b3996 - name: github.com/containous/staert -<<<<<<< HEAD version: 044bdfee6c8f5e8fb71f70d5ba1cf4cb11a94e97 -======= - version: 21164fe201578bea96317a87752953ea5d9dc6d1 -- name: github.com/containous/traefik - version: 4cd08e88f6baf56f33163077c1e226691d56bfa9 - subpackages: - - acme - - autogen - - middlewares - - provider - - safe - - types - - version - - provider/k8s - - integration/utils - - mocks ->>>>>>> 2848e10... glide up - name: github.com/coreos/etcd version: 1c9e0a0e33051fed6c05c141e6fcbfe5c7f2a899 subpackages: @@ -67,10 +47,11 @@ imports: - pkg/pathutil - pkg/types - name: github.com/davecgh/go-spew - version: 6d212800a42e8ab5c146b8ace3490ee17e5225f9 + version: 5215b55f46b2b919f50a1df0eaa5886afe4e3b3d subpackages: - spew - name: github.com/docker/distribution +<<<<<<< df225d9170aa2efb251cb74f0a58b2952315fe2b <<<<<<< 3d7c44735a6fe792ad7fc9f074034a260e53bb0d version: 99cb7c0946d2f5a38015443e515dc916295064d7 ======= @@ -80,6 +61,9 @@ imports: version: 9000745401d186602c2ae63ffca12ed4233a968b >>>>>>> 2848e10... glide up >>>>>>> glide up +======= + version: 9000745401d186602c2ae63ffca12ed4233a968b +>>>>>>> Fix sticky sessions Docker/Marathon labels subpackages: - context - digest @@ -159,21 +143,13 @@ imports: - types/time - types/versions - name: github.com/docker/go-connections -<<<<<<< HEAD - version: 988efe982fdecb46f01d53465878ff1f2ff411ce -======= version: 0bad1a3951398f88ef4dd75fdb42af374430be89 ->>>>>>> 2848e10... glide up subpackages: - nat - sockets - tlsconfig - name: github.com/docker/go-units -<<<<<<< HEAD - version: f2145db703495b2e525c59662db69a7344b00bb8 -======= version: eb879ae3e2b84e2a142af415b679ddeda47ec71c ->>>>>>> 2848e10... glide up - name: github.com/docker/libcompose version: d1876c1d68527a49c0aac22a0b161acc7296b740 subpackages: @@ -192,7 +168,7 @@ imports: - version - yaml - name: github.com/docker/libkv - version: 3fce6a0f26e07da3eac45796a8e255547a47a750 + version: aabc039ad04deb721e234f99cd1b4aa28ac71a40 subpackages: - store - store/boltdb @@ -202,16 +178,13 @@ imports: - name: github.com/donovanhide/eventsource version: fd1de70867126402be23c306e1ce32828455d85b - name: github.com/elazarl/go-bindata-assetfs -<<<<<<< HEAD - version: 9a6736ed45b44bf3835afeebb3034b57ed329f3e -======= version: e1a2a7ec64b07d04ac9ebb072404fe8b7b60de1b ->>>>>>> 2848e10... glide up - name: github.com/gambol99/go-marathon version: a558128c87724cd7430060ef5aedf39f83937f55 - name: github.com/go-check/check version: 11d3bc7aa68e238947792f30573146a3231fc0f1 - name: github.com/gogo/protobuf +<<<<<<< df225d9170aa2efb251cb74f0a58b2952315fe2b <<<<<<< 3d7c44735a6fe792ad7fc9f074034a260e53bb0d version: 89f1976ff373a3e549675d2f212c10f98b6c6316 ======= @@ -221,6 +194,9 @@ imports: version: a4cceea7a401a73fefafd1a21fedbd4694124a82 >>>>>>> 2848e10... glide up >>>>>>> glide up +======= + version: a4cceea7a401a73fefafd1a21fedbd4694124a82 +>>>>>>> Fix sticky sessions Docker/Marathon labels subpackages: - proto - name: github.com/golang/glog @@ -230,8 +206,9 @@ imports: subpackages: - query - name: github.com/gorilla/context - version: 08b5f424b9271eedf6f9f0ce86cb9396ed337a42 + version: aed02d124ae4a0e94fea4541c8effd05bf0c8296 - name: github.com/hashicorp/consul +<<<<<<< df225d9170aa2efb251cb74f0a58b2952315fe2b <<<<<<< 3d7c44735a6fe792ad7fc9f074034a260e53bb0d version: d5b7530ec593f1ec2a8f8a7c145bcadafa88b572 ======= @@ -241,11 +218,15 @@ imports: version: d6aa033793a68b509d336b3bac6ebe36ac0ef818 >>>>>>> 2848e10... glide up >>>>>>> glide up +======= + version: d6aa033793a68b509d336b3bac6ebe36ac0ef818 +>>>>>>> Fix sticky sessions Docker/Marathon labels subpackages: - api - name: github.com/hashicorp/go-cleanhttp version: ad28ea4487f05916463e2423a55166280e8254b5 - name: github.com/hashicorp/serf +<<<<<<< df225d9170aa2efb251cb74f0a58b2952315fe2b <<<<<<< 3d7c44735a6fe792ad7fc9f074034a260e53bb0d version: b7a120a5fc494f6dd5e858f42fd0fd4022d6320f ======= @@ -255,6 +236,9 @@ imports: version: a01569795d12afbdb3698739b614e057ee289fa0 >>>>>>> 2848e10... glide up >>>>>>> glide up +======= + version: a01569795d12afbdb3698739b614e057ee289fa0 +>>>>>>> Fix sticky sessions Docker/Marathon labels subpackages: - coordinate - name: github.com/jarcoal/httpmock @@ -306,6 +290,7 @@ imports: - name: github.com/ogier/pflag version: 45c278ab3607870051a2ea9040bb85fcb8557481 - name: github.com/opencontainers/runc +<<<<<<< df225d9170aa2efb251cb74f0a58b2952315fe2b <<<<<<< 3d7c44735a6fe792ad7fc9f074034a260e53bb0d version: d9fec4c63b089ddfc267194ecb6cda58a13f072c ======= @@ -317,12 +302,13 @@ imports: - name: github.com/parnurzeal/gorequest version: 29ced6f360a5ac3823a3675b4e29fbab336cc186 ======= +======= +>>>>>>> Fix sticky sessions Docker/Marathon labels version: 0f764571384a3ff16c6fed25ace5b7c83f0f0379 subpackages: - libcontainer/user - name: github.com/parnurzeal/gorequest version: e213a02fb0082d41e66996deeaab5ae96039d913 ->>>>>>> 2848e10... glide up - name: github.com/pmezard/go-difflib version: d8ed2627bdf02c080bf22230dbb337003b7aba2d subpackages: @@ -330,17 +316,13 @@ imports: - name: github.com/ryanuber/go-glob version: 572520ed46dbddaed19ea3d9541bdd0494163693 - name: github.com/samuel/go-zookeeper - version: 87e1bca4477a3cc767ca71be023ced183d74e538 + version: e64db453f3512cade908163702045e0f31137843 subpackages: - zk - name: github.com/Sirupsen/logrus - version: 3ec0642a7fb6488f65b06f9040adc67e3990296a + version: a283a10442df8dc09befd873fab202bf8a253d6a - name: github.com/streamrail/concurrent-map -<<<<<<< HEAD - version: 8bf1e9bacbf65b10c81d0f4314cf2b1ebef728b5 -======= version: 430cc620f036386dacc40e603921cc607f37366b ->>>>>>> 2848e10... glide up - name: github.com/stretchr/objx version: cbeaeb16a013161a98496fad62933b1d21786672 - name: github.com/stretchr/testify @@ -357,11 +339,7 @@ imports: subpackages: - codec - name: github.com/unrolled/render -<<<<<<< HEAD - version: 3f4913244021dede105b62caecfb01f0c1eebeda -======= version: 7bc415efc1b94ad17b0fc642cb50b3e2465027e7 ->>>>>>> 2848e10... glide up - name: github.com/vdemeester/docker-events version: be74d4929ec1ad118df54349fda4b0cba60f849b - name: github.com/vdemeester/shakers @@ -383,7 +361,11 @@ imports: - name: github.com/vulcand/route version: cb89d787ddbb1c5849a7ac9f79004c1fd12a4a32 - name: github.com/vulcand/vulcand +<<<<<<< df225d9170aa2efb251cb74f0a58b2952315fe2b version: 643ca8acff8386e3b276f6feb8ba9b5893dbc4a2 +======= + version: 28a4e5c0892167589737b95ceecbcef00295be50 +>>>>>>> Fix sticky sessions Docker/Marathon labels subpackages: - conntracker - plugin @@ -413,6 +395,7 @@ imports: - name: gopkg.in/fsnotify.v1 version: a8a77c9133d2d6fd8334f3260d06f60e8d80a5fb - name: gopkg.in/mgo.v2 +<<<<<<< df225d9170aa2efb251cb74f0a58b2952315fe2b version: 22287bab4379e1fbf6002fb4eb769888f3fb224c subpackages: - bson @@ -426,6 +409,13 @@ imports: version: a3927f83df1b1516f9e9dec71839c93e6bcf1db0 >>>>>>> 2848e10... glide up >>>>>>> glide up +======= + version: 29cc868a5ca65f401ff318143f9408d02f4799cc + subpackages: + - bson +- name: gopkg.in/square/go-jose.v1 + version: a3927f83df1b1516f9e9dec71839c93e6bcf1db0 +>>>>>>> Fix sticky sessions Docker/Marathon labels subpackages: - cipher - json @@ -443,7 +433,11 @@ testImports: - name: github.com/libkermit/docker-check version: cbe0ef03b3d23070eac4d00ba8828f2cc7f7e5a3 - name: github.com/spf13/pflag +<<<<<<< df225d9170aa2efb251cb74f0a58b2952315fe2b version: 08b1a584251b5b62f458943640fc8ebd4d50aaa5 +======= + version: 5644820622454e71517561946e3d94b9f9db6842 +>>>>>>> Fix sticky sessions Docker/Marathon labels - name: github.com/vbatts/tar-split version: bd4c5d64c3e9297f410025a3b1bd0c58f659e721 subpackages: @@ -455,8 +449,4 @@ testImports: - name: github.com/xeipuuv/gojsonreference version: e02fc20de94c78484cd5ffb007f8af96be030a45 - name: github.com/xeipuuv/gojsonschema -<<<<<<< HEAD - version: 00f9fafb54d2244d291b86ab63d12c38bd5c3886 -======= version: e4f482d0deea5bfc0522ab4582c5fdbd2edc98ad ->>>>>>> 2848e10... glide up diff --git a/provider/docker.go b/provider/docker.go index baa5c110a..a04345d11 100644 --- a/provider/docker.go +++ b/provider/docker.go @@ -261,26 +261,20 @@ func (provider *Docker) loadDockerConfig(containersInspected []dockerData) *type return provider.containerFilter(container) }, containersInspected).([]dockerData) - // sticky backends - stickycontainers := map[string][]dockerData{} - frontends := map[string][]dockerData{} for _, container := range filteredContainers { frontendName := provider.getFrontendName(container) frontends[frontendName] = append(frontends[frontendName], container) frontends[frontendName] = append(frontends[frontendName], container) - stickycontainers[provider.getBackend(container)] = container } templateObjects := struct { - Containers []dockerData - Frontends map[string][]dockerData - StickyContainers map[string][]dockerData - Domain string + Containers []dockerData + Frontends map[string][]dockerData + Domain string }{ filteredContainers, frontends, - stickycontainers, provider.Domain, } @@ -299,7 +293,9 @@ func (provider *Docker) hasCircuitBreakerLabel(container dockerData) bool { } func (provider *Docker) hasLoadBalancerLabel(container dockerData) bool { - if _, err := getLabel(container, "traefik.backend.loadbalancer.method"); err != nil { + _, errMethod := getLabel(container, "traefik.backend.loadbalancer.method") + _, errSticky := getLabel(container, "traefik.backend.loadbalancer.sticky") + if errMethod != nil && errSticky != nil { return false } return true @@ -447,8 +443,8 @@ func (provider *Docker) getWeight(container dockerData) string { return "1" } -func (provider *Docker) getSticky(container dockertypes.ContainerJSON) string { - if _, err := getLabel(container, "traefik.stickysession"); err == nil { +func (provider *Docker) getSticky(container dockerData) string { + if _, err := getLabel(container, "traefik.backend.loadbalancer.sticky"); err == nil { return "true" } return "false" diff --git a/provider/marathon.go b/provider/marathon.go index 2dc7c27bc..10b99f999 100644 --- a/provider/marathon.go +++ b/provider/marathon.go @@ -349,7 +349,7 @@ func (provider *Marathon) getProtocol(task marathon.Task, applications []maratho } func (provider *Marathon) getSticky(application marathon.Application) string { - if sticky, err := provider.getLabel(application, "traefik.backend.sticky"); err == nil { + if sticky, err := provider.getLabel(application, "traefik.backend.loadbalancer.sticky"); err == nil { return sticky } return "false" @@ -419,7 +419,9 @@ func (provider *Marathon) hasCircuitBreakerLabels(application marathon.Applicati } func (provider *Marathon) hasLoadBalancerLabels(application marathon.Application) bool { - if _, err := provider.getLabel(application, "traefik.backend.loadbalancer.method"); err != nil { + _, errMethod := provider.getLabel(application, "traefik.backend.loadbalancer.method") + _, errSticky := provider.getLabel(application, "traefik.backend.loadbalancer.sticky") + if errMethod != nil && errSticky != nil { return false } return true diff --git a/server.go b/server.go index 40b772d98..e7c62bea5 100644 --- a/server.go +++ b/server.go @@ -559,7 +559,7 @@ func (server *Server) loadConfig(configurations configs, globalConfiguration Glo log.Debugf("Creating load-balancer drr") rebalancer, _ := roundrobin.NewRebalancer(rr, roundrobin.RebalancerLogger(oxyLogger)) if stickysession { - log.Debugf("... setting to sticky session with cookie named %v", cookiename) + log.Debugf("Sticky session with cookie %v", cookiename) rebalancer, _ = roundrobin.NewRebalancer(rr, roundrobin.RebalancerLogger(oxyLogger), roundrobin.RebalancerStickySession(sticky)) } lb = rebalancer @@ -581,7 +581,7 @@ func (server *Server) loadConfig(configurations configs, globalConfiguration Glo case types.Wrr: log.Debugf("Creating load-balancer wrr") if stickysession { - log.Debugf("... setting to sticky session with cookie named %v", cookiename) + log.Debugf("Sticky session with cookie %v", cookiename) rr, _ = roundrobin.New(saveBackend, roundrobin.EnableStickySession(sticky)) } lb = rr diff --git a/templates/docker.tmpl b/templates/docker.tmpl index 6a5f98803..503cec5af 100644 --- a/templates/docker.tmpl +++ b/templates/docker.tmpl @@ -15,7 +15,11 @@ amount = {{getMaxConnAmount . }} extractorfunc = "{{getMaxConnExtractorFunc . }}" {{end}} - + + [backends.backend-{{getBackend .}}.servers.server-{{.Name | replace "/" "" | replace "." "-"}}] + url = "{{getProtocol .}}://{{getIPAddress .}}:{{getPort .}}" + weight = {{getWeight .}} +{{end}} [frontends]{{range $frontend, $containers := .Frontends}} [frontends."frontend-{{$frontend}}"]{{$container := index $containers 0}} From 462d8b3e748170e400184f421ab8c185e1597dc0 Mon Sep 17 00:00:00 2001 From: Emile Vauge Date: Wed, 28 Sep 2016 16:29:19 +0200 Subject: [PATCH 10/10] Fix Docker & KV templates for sticky Signed-off-by: Emile Vauge --- docs/toml.md | 3 +- glide.lock | 148 +++++++------------------------------- provider/docker.go | 10 ++- provider/docker_test.go | 2 - provider/marathon_test.go | 1 - server.go | 3 +- templates/docker.tmpl | 37 +++++----- templates/kv.tmpl | 2 + 8 files changed, 59 insertions(+), 147 deletions(-) diff --git a/docs/toml.md b/docs/toml.md index bd6dfb11e..95feaa327 100644 --- a/docs/toml.md +++ b/docs/toml.md @@ -711,12 +711,12 @@ Labels can be used on containers to override default behaviour: - `traefik.backend.maxconn.amount=10`: set a maximum number of connections to the backend. Must be used in conjunction with the below label to take effect. - `traefik.backend.maxconn.extractorfunc=client.ip`: set the function to be used against the request to determine what to limit maximum connections to the backend by. Must be used in conjunction with the above label to take effect. - `traefik.backend.loadbalancer.method=drr`: override the default `wrr` load balancer algorithm +- `traefik.backend.loadbalancer.sticky=true`: enable backend sticky sessions - `traefik.backend.circuitbreaker.expression=NetworkErrorRatio() > 0.5`: create a [circuit breaker](/basics/#backends) to be used against the backend - `traefik.port=80`: register this port. Useful when the container exposes multiples ports. - `traefik.protocol=https`: override the default `http` protocol - `traefik.weight=10`: assign this weight to the container - `traefik.enable=false`: disable this container in Træfɪk -- `traefik.stickysession=true`: enable backend sticky sessions - `traefik.frontend.rule=Host:test.traefik.io`: override the default frontend rule (Default: `Host:{containerName}.{domain}`). - `traefik.frontend.passHostHeader=true`: forward client `Host` header to the backend. - `traefik.frontend.priority=10`: override default frontend priority @@ -811,6 +811,7 @@ Labels can be used on containers to override default behaviour: - `traefik.backend.maxconn.amount=10`: set a maximum number of connections to the backend. Must be used in conjunction with the below label to take effect. - `traefik.backend.maxconn.extractorfunc=client.ip`: set the function to be used against the request to determine what to limit maximum connections to the backend by. Must be used in conjunction with the above label to take effect. - `traefik.backend.loadbalancer.method=drr`: override the default `wrr` load balancer algorithm +- `traefik.backend.loadbalancer.sticky=true`: enable backend sticky sessions - `traefik.backend.circuitbreaker.expression=NetworkErrorRatio() > 0.5`: create a [circuit breaker](/basics/#backends) to be used against the backend - `traefik.portIndex=1`: register port by index in the application's ports array. Useful when the application exposes multiple ports. - `traefik.port=80`: register the explicit application port value. Cannot be used alongside `traefik.portIndex`. diff --git a/glide.lock b/glide.lock index e745fe24d..4097907e3 100644 --- a/glide.lock +++ b/glide.lock @@ -1,25 +1,10 @@ -<<<<<<< df225d9170aa2efb251cb74f0a58b2952315fe2b -<<<<<<< 3d7c44735a6fe792ad7fc9f074034a260e53bb0d hash: c0ac205a859d78847e21d3cd63f427ffba985755c6ae84373e4a20364ba39b05 -updated: 2016-09-28T16:50:04.352639437+01:00 -======= -<<<<<<< HEAD -hash: b82175c1aafff6c4e98c8ac4baea3832895c9600beac445c10af4c004982ef05 -updated: 2016-09-20T16:03:26.379383173+02:00 -======= -hash: f7ade4acdfd43efe6a0c1a1444776dd02d556e40bf122a495ca2fc226c880d0b -updated: 2016-08-10T11:55:40.961089942-04:00 ->>>>>>> 2848e10... glide up ->>>>>>> glide up -======= -hash: b82175c1aafff6c4e98c8ac4baea3832895c9600beac445c10af4c004982ef05 -updated: 2016-09-28T13:05:02.84360542+02:00 ->>>>>>> Fix sticky sessions Docker/Marathon labels +updated: 2016-09-30T10:57:42.336729457+02:00 imports: - name: github.com/abbot/go-http-auth version: cb4372376e1e00e9f6ab9ec142e029302c9e7140 - name: github.com/boltdb/bolt - version: 94c8db596809690a3f7046fa83c7b0dda13a3222 + version: 5cc10bbbc5c141029940133bb33c9e969512a698 - name: github.com/BurntSushi/toml version: 99064174e013895bbd9b025c31100bd1d9b590ca - name: github.com/BurntSushi/ty @@ -33,7 +18,7 @@ imports: - name: github.com/codegangsta/cli version: 1efa31f08b9333f1bd4882d61f9d668a70cd902e - name: github.com/codegangsta/negroni - version: 6edff56736fa7bd546812f149e8cdaae61e5a38f + version: dc6b9d037e8dab60cbfc09c61d6932537829be8b - name: github.com/containous/flaeg version: a731c034dda967333efce5f8d276aeff11f8ff87 - name: github.com/containous/mux @@ -51,19 +36,7 @@ imports: subpackages: - spew - name: github.com/docker/distribution -<<<<<<< df225d9170aa2efb251cb74f0a58b2952315fe2b -<<<<<<< 3d7c44735a6fe792ad7fc9f074034a260e53bb0d - version: 99cb7c0946d2f5a38015443e515dc916295064d7 -======= -<<<<<<< HEAD - version: b6e0cfbdaa1ddc3a17c95142c7bf6e42c5567370 -======= - version: 9000745401d186602c2ae63ffca12ed4233a968b ->>>>>>> 2848e10... glide up ->>>>>>> glide up -======= - version: 9000745401d186602c2ae63ffca12ed4233a968b ->>>>>>> Fix sticky sessions Docker/Marathon labels + version: 87917f30529e6a7fca8eaff2932424915fb11225 subpackages: - context - digest @@ -143,13 +116,13 @@ imports: - types/time - types/versions - name: github.com/docker/go-connections - version: 0bad1a3951398f88ef4dd75fdb42af374430be89 + version: 990a1a1a70b0da4c4cb70e117971a4f0babfbf1a subpackages: - nat - sockets - tlsconfig - name: github.com/docker/go-units - version: eb879ae3e2b84e2a142af415b679ddeda47ec71c + version: f2d77a61e3c169b43402a0a1e84f06daf29b8190 - name: github.com/docker/libcompose version: d1876c1d68527a49c0aac22a0b161acc7296b740 subpackages: @@ -168,7 +141,7 @@ imports: - version - yaml - name: github.com/docker/libkv - version: aabc039ad04deb721e234f99cd1b4aa28ac71a40 + version: 35d3e2084c650109e7bcc7282655b1bc8ba924ff subpackages: - store - store/boltdb @@ -178,25 +151,13 @@ imports: - name: github.com/donovanhide/eventsource version: fd1de70867126402be23c306e1ce32828455d85b - name: github.com/elazarl/go-bindata-assetfs - version: e1a2a7ec64b07d04ac9ebb072404fe8b7b60de1b + version: 57eb5e1fc594ad4b0b1dbea7b286d299e0cb43c2 - name: github.com/gambol99/go-marathon version: a558128c87724cd7430060ef5aedf39f83937f55 - name: github.com/go-check/check - version: 11d3bc7aa68e238947792f30573146a3231fc0f1 + version: 4f90aeace3a26ad7021961c297b22c42160c7b25 - name: github.com/gogo/protobuf -<<<<<<< df225d9170aa2efb251cb74f0a58b2952315fe2b -<<<<<<< 3d7c44735a6fe792ad7fc9f074034a260e53bb0d - version: 89f1976ff373a3e549675d2f212c10f98b6c6316 -======= -<<<<<<< HEAD - version: a11c89fbb0ad4acfa8abc4a4d5f7e27c477169b1 -======= - version: a4cceea7a401a73fefafd1a21fedbd4694124a82 ->>>>>>> 2848e10... glide up ->>>>>>> glide up -======= - version: a4cceea7a401a73fefafd1a21fedbd4694124a82 ->>>>>>> Fix sticky sessions Docker/Marathon labels + version: e33835a643a970c11ac74f6333f5f6866387a101 subpackages: - proto - name: github.com/golang/glog @@ -208,39 +169,16 @@ imports: - name: github.com/gorilla/context version: aed02d124ae4a0e94fea4541c8effd05bf0c8296 - name: github.com/hashicorp/consul -<<<<<<< df225d9170aa2efb251cb74f0a58b2952315fe2b -<<<<<<< 3d7c44735a6fe792ad7fc9f074034a260e53bb0d - version: d5b7530ec593f1ec2a8f8a7c145bcadafa88b572 -======= -<<<<<<< HEAD - version: 67a03d57b5851011e5601ee6e7e3d05699548462 -======= - version: d6aa033793a68b509d336b3bac6ebe36ac0ef818 ->>>>>>> 2848e10... glide up ->>>>>>> glide up -======= - version: d6aa033793a68b509d336b3bac6ebe36ac0ef818 ->>>>>>> Fix sticky sessions Docker/Marathon labels + version: fce7d75609a04eeb9d4bf41c8dc592aac18fc97d subpackages: - api - name: github.com/hashicorp/go-cleanhttp - version: ad28ea4487f05916463e2423a55166280e8254b5 + version: 875fb671b3ddc66f8e2f0acc33829c8cb989a38d - name: github.com/hashicorp/serf -<<<<<<< df225d9170aa2efb251cb74f0a58b2952315fe2b -<<<<<<< 3d7c44735a6fe792ad7fc9f074034a260e53bb0d - version: b7a120a5fc494f6dd5e858f42fd0fd4022d6320f -======= -<<<<<<< HEAD - version: 555e0dcbb180ecbd03431adc28226bb3192558bc -======= - version: a01569795d12afbdb3698739b614e057ee289fa0 ->>>>>>> 2848e10... glide up ->>>>>>> glide up -======= - version: a01569795d12afbdb3698739b614e057ee289fa0 ->>>>>>> Fix sticky sessions Docker/Marathon labels + version: 6c4672d66fc6312ddde18399262943e21175d831 subpackages: - coordinate + - serf - name: github.com/jarcoal/httpmock version: 145b10d659265440f062c31ea15326166bae56ee - name: github.com/libkermit/compose @@ -282,7 +220,7 @@ imports: - name: github.com/miekg/dns version: 5d001d020961ae1c184f9f8152fdc73810481677 - name: github.com/mitchellh/mapstructure - version: ca63d7c062ee3c9f34db231e352b60012b4fd0c1 + version: d2dd0262208475919e1a362f675cfc0e7c10e905 - name: github.com/moul/http2curl version: b1479103caacaa39319f75e7f57fc545287fca0d - name: github.com/NYTimes/gziphandler @@ -290,25 +228,11 @@ imports: - name: github.com/ogier/pflag version: 45c278ab3607870051a2ea9040bb85fcb8557481 - name: github.com/opencontainers/runc -<<<<<<< df225d9170aa2efb251cb74f0a58b2952315fe2b -<<<<<<< 3d7c44735a6fe792ad7fc9f074034a260e53bb0d - version: d9fec4c63b089ddfc267194ecb6cda58a13f072c -======= -<<<<<<< HEAD - version: 38e0df9ec67c05e73b656c02c9222f24c1683d73 ->>>>>>> glide up + version: 1a81e9ab1f138c091fe5c86d0883f87716088527 subpackages: - libcontainer/user - name: github.com/parnurzeal/gorequest - version: 29ced6f360a5ac3823a3675b4e29fbab336cc186 -======= -======= ->>>>>>> Fix sticky sessions Docker/Marathon labels - version: 0f764571384a3ff16c6fed25ace5b7c83f0f0379 - subpackages: - - libcontainer/user -- name: github.com/parnurzeal/gorequest - version: e213a02fb0082d41e66996deeaab5ae96039d913 + version: 045012d33ef41ea146c1b675df9296d0dc1a212d - name: github.com/pmezard/go-difflib version: d8ed2627bdf02c080bf22230dbb337003b7aba2d subpackages: @@ -322,16 +246,16 @@ imports: - name: github.com/Sirupsen/logrus version: a283a10442df8dc09befd873fab202bf8a253d6a - name: github.com/streamrail/concurrent-map - version: 430cc620f036386dacc40e603921cc607f37366b + version: 65a174a3a4188c0b7099acbc6cfa0c53628d3287 - name: github.com/stretchr/objx version: cbeaeb16a013161a98496fad62933b1d21786672 - name: github.com/stretchr/testify - version: 976c720a22c8eb4eb6a0b4348ad85ad12491a506 + version: d77da356e56a7428ad25149ca77381849a6a5232 subpackages: - assert - mock - name: github.com/thoas/stats - version: 152b5d051953fdb6e45f14b6826962aadc032324 + version: 79b768ff1780f4e5b0ed132e192bfeefe9f85a9c - name: github.com/tv42/zbase32 version: 03389da7e0bf9844767f82690f4d68fc097a1306 - name: github.com/ugorji/go @@ -339,7 +263,7 @@ imports: subpackages: - codec - name: github.com/unrolled/render - version: 7bc415efc1b94ad17b0fc642cb50b3e2465027e7 + version: 198ad4d8b8a4612176b804ca10555b222a086b40 - name: github.com/vdemeester/docker-events version: be74d4929ec1ad118df54349fda4b0cba60f849b - name: github.com/vdemeester/shakers @@ -361,11 +285,7 @@ imports: - name: github.com/vulcand/route version: cb89d787ddbb1c5849a7ac9f79004c1fd12a4a32 - name: github.com/vulcand/vulcand -<<<<<<< df225d9170aa2efb251cb74f0a58b2952315fe2b - version: 643ca8acff8386e3b276f6feb8ba9b5893dbc4a2 -======= version: 28a4e5c0892167589737b95ceecbcef00295be50 ->>>>>>> Fix sticky sessions Docker/Marathon labels subpackages: - conntracker - plugin @@ -395,27 +315,11 @@ imports: - name: gopkg.in/fsnotify.v1 version: a8a77c9133d2d6fd8334f3260d06f60e8d80a5fb - name: gopkg.in/mgo.v2 -<<<<<<< df225d9170aa2efb251cb74f0a58b2952315fe2b - version: 22287bab4379e1fbf6002fb4eb769888f3fb224c - subpackages: - - bson -- name: gopkg.in/square/go-jose.v1 -<<<<<<< 3d7c44735a6fe792ad7fc9f074034a260e53bb0d - version: aa2e30fdd1fe9dd3394119af66451ae790d50e0d -======= -<<<<<<< HEAD - version: 139276ceb5afbf13e636c44e9382f0ca75c12ba3 -======= - version: a3927f83df1b1516f9e9dec71839c93e6bcf1db0 ->>>>>>> 2848e10... glide up ->>>>>>> glide up -======= version: 29cc868a5ca65f401ff318143f9408d02f4799cc subpackages: - bson - name: gopkg.in/square/go-jose.v1 - version: a3927f83df1b1516f9e9dec71839c93e6bcf1db0 ->>>>>>> Fix sticky sessions Docker/Marathon labels + version: e3f973b66b91445ec816dd7411ad1b6495a5a2fc subpackages: - cipher - json @@ -433,13 +337,9 @@ testImports: - name: github.com/libkermit/docker-check version: cbe0ef03b3d23070eac4d00ba8828f2cc7f7e5a3 - name: github.com/spf13/pflag -<<<<<<< df225d9170aa2efb251cb74f0a58b2952315fe2b - version: 08b1a584251b5b62f458943640fc8ebd4d50aaa5 -======= version: 5644820622454e71517561946e3d94b9f9db6842 ->>>>>>> Fix sticky sessions Docker/Marathon labels - name: github.com/vbatts/tar-split - version: bd4c5d64c3e9297f410025a3b1bd0c58f659e721 + version: 6810cedb21b2c3d0b9bb8f9af12ff2dc7a2f14df subpackages: - archive/tar - tar/asm @@ -449,4 +349,4 @@ testImports: - name: github.com/xeipuuv/gojsonreference version: e02fc20de94c78484cd5ffb007f8af96be030a45 - name: github.com/xeipuuv/gojsonschema - version: e4f482d0deea5bfc0522ab4582c5fdbd2edc98ad + version: 00f9fafb54d2244d291b86ab63d12c38bd5c3886 diff --git a/provider/docker.go b/provider/docker.go index a04345d11..f816b3130 100644 --- a/provider/docker.go +++ b/provider/docker.go @@ -262,19 +262,27 @@ func (provider *Docker) loadDockerConfig(containersInspected []dockerData) *type }, containersInspected).([]dockerData) frontends := map[string][]dockerData{} + backends := map[string]dockerData{} + servers := map[string][]dockerData{} for _, container := range filteredContainers { frontendName := provider.getFrontendName(container) frontends[frontendName] = append(frontends[frontendName], container) - frontends[frontendName] = append(frontends[frontendName], container) + backendName := provider.getBackend(container) + backends[backendName] = container + servers[backendName] = append(servers[backendName], container) } templateObjects := struct { Containers []dockerData Frontends map[string][]dockerData + Backends map[string]dockerData + Servers map[string][]dockerData Domain string }{ filteredContainers, frontends, + backends, + servers, provider.Domain, } diff --git a/provider/docker_test.go b/provider/docker_test.go index 976469e76..45f5ccbd8 100644 --- a/provider/docker_test.go +++ b/provider/docker_test.go @@ -940,7 +940,6 @@ func TestDockerLoadDockerConfig(t *testing.T) { }, }, CircuitBreaker: nil, - LoadBalancer: &types.LoadBalancer{Sticky: false, Method: ""}, }, }, }, @@ -1027,7 +1026,6 @@ func TestDockerLoadDockerConfig(t *testing.T) { }, }, CircuitBreaker: nil, - LoadBalancer: &types.LoadBalancer{Sticky: false, Method: ""}, }, }, }, diff --git a/provider/marathon_test.go b/provider/marathon_test.go index 4211f1d26..030cc2fb8 100644 --- a/provider/marathon_test.go +++ b/provider/marathon_test.go @@ -107,7 +107,6 @@ func TestMarathonLoadConfig(t *testing.T) { }, }, CircuitBreaker: nil, - LoadBalancer: &types.LoadBalancer{Sticky: false}, }, }, }, diff --git a/server.go b/server.go index e7c62bea5..9587ba872 100644 --- a/server.go +++ b/server.go @@ -546,12 +546,11 @@ func (server *Server) loadConfig(configurations configs, globalConfiguration Glo } stickysession := configuration.Backends[frontend.Backend].LoadBalancer.Sticky - var cookiename string + cookiename := "_TRAEFIK_BACKEND" var sticky *roundrobin.StickySession if stickysession { sticky = roundrobin.NewStickySession(cookiename) - cookiename = "_TRAEFIK_BACKEND" } switch lbMethod { diff --git a/templates/docker.tmpl b/templates/docker.tmpl index 503cec5af..e67232ebc 100644 --- a/templates/docker.tmpl +++ b/templates/docker.tmpl @@ -1,24 +1,29 @@ -[backends]{{range .Containers}} - {{if hasCircuitBreakerLabel .}} - [backends.backend-{{getBackend .}}.circuitbreaker] - expression = "{{getCircuitBreakerExpression .}}" +{{$backendServers := .Servers}} +[backends]{{range $backendName, $backend := .Backends}} + {{if hasCircuitBreakerLabel $backend}} + [backends.backend-{{$backendName}}.circuitbreaker] + expression = "{{getCircuitBreakerExpression $backend}}" {{end}} - {{if hasLoadBalancerLabel .}} - [backends.backend-{{getBackend .}}.loadbalancer] - method = "{{getLoadBalancerMethod .}}" - sticky = {{getSticky . }} + {{if hasLoadBalancerLabel $backend}} + [backends.backend-{{$backendName}}.loadbalancer] + method = "{{getLoadBalancerMethod $backend}}" + sticky = {{getSticky $backend}} {{end}} - {{if hasMaxConnLabels .}} - [backends.backend-{{getBackend .}}.maxconn] - amount = {{getMaxConnAmount . }} - extractorfunc = "{{getMaxConnExtractorFunc . }}" + {{if hasMaxConnLabels $backend}} + [backends.backend-{{$backendName}}.maxconn] + amount = {{getMaxConnAmount $backend}} + extractorfunc = "{{getMaxConnExtractorFunc $backend}}" {{end}} - - [backends.backend-{{getBackend .}}.servers.server-{{.Name | replace "/" "" | replace "." "-"}}] - url = "{{getProtocol .}}://{{getIPAddress .}}:{{getPort .}}" - weight = {{getWeight .}} + + {{$servers := index $backendServers $backendName}} + {{range $serverName, $server := $servers}} + [backends.backend-{{$backendName}}.servers.server-{{$server.Name | replace "/" "" | replace "." "-"}}] + url = "{{getProtocol $server}}://{{getIPAddress $server}}:{{getPort $server}}" + weight = {{getWeight $server}} + {{end}} + {{end}} [frontends]{{range $frontend, $containers := .Frontends}} diff --git a/templates/kv.tmpl b/templates/kv.tmpl index 153f12b9c..c642ff7b1 100644 --- a/templates/kv.tmpl +++ b/templates/kv.tmpl @@ -12,9 +12,11 @@ {{end}} {{$loadBalancer := Get "" . "/loadbalancer/" "method"}} +{{$sticky := Get "false" . "/loadbalancer/" "sticky"}} {{with $loadBalancer}} [backends."{{Last $backend}}".loadBalancer] method = "{{$loadBalancer}}" + sticky = {{$sticky}} {{end}} {{$maxConnAmt := Get "" . "/maxconn/" "amount"}}