Search code examples
dockerdocker-composedocker-swarmtraefik

How can I use Sticky sessions on Docker using Traefik v2.3?


How can I use Sticky sessions in Traefik v2.3?

When I enable the below line in my docker compose file, my docker services (e.g. http://192.168.0.1:9086) don't work.

- "traefik.http.services.mynginximage2.loadBalancer.sticky.cookie=true"

Do you have any idea why a sticky session doesn't work?

And is it possible to make a session affinity by the labels of a service?

The following is my docker compose file:

version: "3.8"

services:
  traefik:
    image: traefik:v2.3
    deploy:
      mode: global
    networks:
      - traefik-net
    command:
      #- "--log.level=DEBUG"
      - "--api.insecure=true"
      - "--providers.docker=true"
      - "--providers.docker.exposedbydefault=false"
      - "--entrypoints.web.address=:80"
      - "--entrypoints.mynginximage2_ep.address=:8086"
    ports:
      - 80:80
      - 9086:8086
      - 8080:8080
    volumes:
      - "/var/run/docker.sock:/var/run/docker.sock:ro"
  whoami:
    image: "traefik/whoami"
    deploy:
      replicas: 2
    networks:
      - traefik-net
    labels:
      - "traefik.enable=true"
      - "traefik.http.routers.whoami.entrypoints=web"
      - "traefik.http.routers.whoami.rule=Host(`192.168.0.1`) || Host(`192.168.0.2`)"
      #- "traefik.http.services.whoami.loadBalancer.sticky.cookie=true"
      - "traefik.http.services.whoami-service.loadbalancer.server.port=80"
  mynginximage2:
    image: mynginximage2
    deploy:
      replicas: 2
    networks:
      - traefik-net
    #ports:
    #  - 9080:8086
    labels:
      - "traefik.enable=true"
      - "traefik.http.routers.mynginximage2.entrypoints=mynginximage2_ep"
      - "traefik.http.routers.mynginximage2.rule=Host(`192.168.0.1`) || Host(`192.168.0.2`)"
      #- "traefik.http.services.mynginximage2.loadBalancer.sticky.cookie=true"
      - "traefik.http.services.mynginximage2-service.loadbalancer.server.port=8086"      
networks:
  traefik-net:
    external: true
    name: traefik-net

Solution

  • I found the issue why my Traefik routers don't work when I enable a sticky session feature. The solution is that each service has a different cookie name. So, I added cookie names. For example:

    version: "3.8"
    
    services:
      #...
      whoami:
        #...
        labels:
          - "traefik.enable=true"
          - "traefik.http.routers.whoami.entrypoints=web"
          - "traefik.http.routers.whoami.rule=Host(`192.168.0.1`) || Host(`192.168.0.2`)"
          - "traefik.http.services.whoami-service.loadBalancer.sticky.cookie=true"
          - "traefik.http.services.whoami-service.loadBalancer.sticky.cookie.name=whoami_cookie_name"
          - "traefik.http.services.whoami-service.loadbalancer.server.port=80"
      mynginximage2:
        #...
        labels:
          - "traefik.enable=true"
          - "traefik.http.routers.mynginximage2.entrypoints=mynginximage2_ep"
          - "traefik.http.routers.mynginximage2.rule=Host(`192.168.0.1`) || Host(`192.168.0.2`)"
          - "traefik.http.services.mynginximage2-service.loadBalancer.sticky.cookie=true"
          - "traefik.http.services.mynginximage2-service.loadBalancer.sticky.cookie.name=mynginximage2_cookie_name"
          - "traefik.http.services.mynginximage2-service.loadbalancer.server.port=8086"      
    #...