Насколько я понимаю, существует 3 возможных варианта реализации сходства сеансов в Docker или Docker Swarm.
<сильный>1. Добавьте метки, чтобы установить закрепленный сеанс, что является очень простым и официальным способом, если вы используете Docker Enterprise Edition.
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 использует сетку маршрутизации (циклический балансировщик нагрузки).
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/;
}
}
}
person
Dashzeveg Galbadrakh
schedule
04.01.2021