繁体   English   中英

与 docker swarm 的粘性会话

[英]Sticky Sessions with docker swarm

我有一个使用 socket.io 的 dockerized node.js 应用程序

通过 docker compose,我在同一服务器上的两个不同容器上为该应用程序运行了 2 个副本。 然而,到达服务器的请求以循环方式分发。

有没有一种方法可以用来实现粘性会话?

我的 docker-compose.yml 如下所示

version: '3'

services:
 app:
   ports:
     - "3001:3001"
   image: image
   deploy:
     replicas: 2

我使用 docker stack deploy 来运行应用程序的两个副本

据我了解,在 Docker 或 Docker Swarm 上实现会话关联有 3 种可能的变体。

1.添加标签建立粘性会话,如果您使用的是Docker企业版,这是非常简单和官方的方法。

labels:
   - "com.docker.lb.hosts=example.com"
   - "com.docker.lb.sticky_session_cookie=session" 
   - "com.docker.lb.port=3001"

除非您购买了使用 Docker EE 的许可证,否则您需要使用以下两种方法之一。

2. 使用 Traefik 负载均衡器。 让我们假设部署一个名为 app 的服务; 容器部署在 192.168.0.1 和 192.168.0.2 中,它们是 Docker Swarm 中连接的节点。

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.app.address=:80"
    ports:
      - 3001:80
      - 8080:8080
    volumes:
      - "/var/run/docker.sock:/var/run/docker.sock:ro"
  app:
    image: nginx
    deploy:
      replicas: 2
    networks:
      - traefik-net
    labels:
       - "traefik.enable=true"
       - "traefik.http.routers.app.entrypoints=app"
       - "traefik.http.routers.app.rule=Host(`192.168.0.1`) || Host(`192.168.0.2`)"
       - "traefik.http.services.app-service.loadBalancer.sticky.cookie=true"
       - "traefik.http.services.app-service.loadBalancer.sticky.cookie.name=app_cookie_name"
       - "traefik.http.services.app-service.loadbalancer.server.port=80"
    
networks:
  traefik-net:
    external: true
    name: traefik-net

3.使用Nginx反向代理。 假设容器将部署在 192.168.0.1 和 192.168.0.2 中,它们是 Docker Swarm 中连接的节点。

为了绕过路由网格,您需要使用一个副本部署两个服务(app1、app2),因为 Docker Swarm 的默认负载平衡方法是轮询。

version: "3.8"

services:
 app1:
   ports:
     - "3001:3001"
   image: image
   deploy:
     replicas: 1
 app2:
   ports:
     - "3002:3001"
   image: image
   deploy:
     replicas: 1

Nginx 配置:由于 Docker Swarm 使用路由网格(round-robin load balancer),因此您需要注册每个访问容器的方式。

http {
    upstream example {
        ip_hash;
        server 192.168.0.1:3001;
        server 192.168.0.1:3002;
        server 192.168.0.2:3001;
        server 192.168.0.2:3002;
    }

    server {
        listen          80;
        server_name     example.com;
    
        location / {
            proxy_pass http://example/;
        }
    }
}

我认为您正在寻找的是本文档,该文档描述了使用 Docker Swarm 时会话持久性的不同方法。

特别是您可以配置基于 Cookie 或 IP 哈希的粘性会话。

根据在线文档,您似乎需要在配置中添加以下标签:

labels:
   - "com.docker.lb.hosts=demo.local"
   - "com.docker.lb.sticky_session_cookie=session" 
   - "com.docker.lb.port=3001"

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM